lambda,闭包,装饰器的理解和参悟

零基础小白 Python这样学就对啦!——07篇 0基础学Python系列----------函数进阶篇 阅读详情

lambda的用法

1.  lambda定义后赋值给某个对象,其本质就是对这个赋值对象的函数定义。

multiply = lambda x,y:x*y #函数一
print(multiply(2,3)) #6

def multiply(x,y): #函数二
    return x*y

如以上示例,赋值后其实就是把lambda内部的操作,取了个名字。

2. lambda,更改其他函数内部封装好的操作,比如

abs = lambda x : 'changed'
print(abs(-20)) #changed

 abs本身是求绝对值的函数,但是经过lambda的赋值,将其内部封装都颠覆了,其本质是,函数名只是一个变量,它指向这个函数的操作,你也可以用其他的变量来指向这个函数的操作,要记住一点,python中一切皆是对象,如下所示,n指向了求绝对值的函数的操作,所以返回 2

n = abs
print(n(-2)) #2

3. 作为函数的返回内容,这里要详细讲一讲,首先说结论吧,返回一个匿名函数也就是lambda的本质就是闭包(closure)

def example(n):
    def f(x):
        return x%n  > 0
    return f
def example_(n):
    return lambda x: x%n > 0

上面两个函数是等价的,闭包外部函数,返回内部嵌套函数的函数名称,在上面的例子中,f就是内部嵌套函数的函数名。

我们都知道在python中,对函数的调用,其实就是函数名+(),那么对内部嵌套函数的调用呢? 

答案很清晰了,就是看它嵌套的层数,上述例子中的嵌套是一层,调用它,传入两个参数即可

print(example(3)(10))
#返回 True

这样理解起来就很清晰了,很简单。

比如作用在filter中。

re = filter(example_(3),list(range(1,10)))
print(list(re))
#[1, 2, 4, 5, 7, 8]

承接上面的代码,这里过滤出了对三取模大于0的数,example_函数只要传入一个参数就好了,内部的lambda的参数由后面的list对象迭代来提供。

 

装饰器

先上两个结论

1.装饰器是函数

2.装饰器的本质是闭包。

 

装饰器的功能就是对它 “装饰” 的函数的功能进行扩展补充,补充额外的功能,它最强大的地方,在于python给了提供了

@+装饰器名称的语法糖, 可以最大程度的加强代码的复用。

举个简单的例子:假设你在开发一款软件,那么这个软件肯定有很多的功能,你决定把他们每个功能不管是大小,都封装在不同的函数里来实现,那一个软件可能要包括上百个函数的封装, 这个时候你想到一个日志记录的功能,你想记录每个函数调用的时间,或者你想测试函数的性能如何 —— 一个函数从运行到返回你要的结果花了多长时间, 不可能你对每个函数都这样去补充一个功能(补充功能不是不可以,只是这样的功能对于你开发过程中所有的函数测试,都能用得上,如果你有100个函数,100个函数的内部封装都不一样,要添加这么复杂的代码,简直一点也不pythonic了),所以,以代码简洁著称的python就提供了装饰器这个神器。

下面写一个记录函数运行时长的装饰器,再分析它的运行原理。 

import time
def time_decorator(func):
    def inner_f():
        now = time.time()
        func()
        over = time.time()
        interval = over-now
        print('共耗时%.4f秒'%interval)
    return inner_f

@time_decorator
def o():
    for i in range(1,2000):
        print(i)
    return 'over!'

#...
1998
1999
共耗时0.0145秒

使用了@语法之后,python解释器首先发现了装饰器的存在,然后将它下面的函数,也就是被装饰的函数的函数名,作为参数

传入到装饰器内部(别忘了装饰器本身也是函数!),然后解释器会自动调用装饰器返回的函数,也就是内部的嵌套函数,在例子中是 inner_f(), 调用这个函数后,里面的功能就很容易读懂了! func()也就是被装饰的函数,在例子中是 o() 这个函数。

 

当然了,不管是装饰器,闭包,都有非常复杂的用法,python内部也提供了很多实用的装饰器,但不管多么复杂,只要懂得了它的原理,更深层的使用只是熟练程度上的问题。  继续进步吧~

python eval 转换k m到乘法计算 原数据 lambda函数处理 我之前写了各种if substr函数,各种报错 正确到热泪盈眶的函数 data['Followers/Fans'] = data['Followers/Fans'].str.replace('k|K','*1000').str.replace('m|M','*1000000').fillna('0') data['Followers/Fans'] = data['Followers/Fans'].apply(eval) 报错函数 # def trans(x): # 阅读详情

相关推荐

51单片机IAP技术详解:从原理到实战,实现远程程序自更新

在嵌入式系统开发中,程序更新是产品维护和功能迭代的核心需求。传统方式依赖外部烧录器,操作繁琐且无法远程进行。IAP(在应用中编程)技术则从原理层面解决了这一难题,它允许单片机在运行过程中通过特定接口(如串口)动态修改自身的Flash程序存储器。这项技术的核心价值在于赋予设备远程升级和自主维护的能力,极大地延长了产品生命周期并降低了维护成本。其典型应用场景包括智能家居控制器、工业数据采集模块和远程仪表等部署后不便拆卸的设备。本文以经典的51单片机(如STC89C52)为例,深入剖析IAP的实现,其中Bootl

weixin_29161719的博客 404

Python Lambda 闭包

在上面的例子中,lambda a,b,c: a+b+c 是一个 lambda 函数,其中 a,b,c 是参数,a+b+c 是一个表达式。我们使用 def 关键字在 Python 中定义常规函数,而 lambda 关键字用于定义 lambda 函数。如您所见,嵌套函数 innerFunc 访问了封闭函数 outerFunc 的非局部变量 txt。在学习闭包之前,你必须先了解Python的嵌套函数和非局部变量的概念。嵌套函数在另一个函数内部定义,并且可以访问封闭范围的变量。在此示例中,嵌套函数返回。

迹忆客 593

AI Agent在营销领域的实战策略

本文从第一性原理出发,系统性拆解AI Agent在营销领域的落地逻辑、技术架构、实现方案与实战策略。全文覆盖从基础概念到高级优化的全层级知识:底层理论层面推导营销Agent的效用函数与决策框架;技术架构层面提出"感知-记忆-规划-行动-反思"五组件可落地架构;实践层面提供生产级代码实现、多行业案例与ROI提升方法论;前沿层面探讨多Agent协同、世界模型仿真等下一代技术方向。

操作系统内核探秘的博客 227

解释 Python 中的闭包(Closure)和匿名函数(Lambda)之间的关系。

闭包和 Lambda 表达式是 Python 中强大的功能,它们在函数式编程和一些特殊的编程场景中发挥着关键作用。理解它们的使用场景以及如何正确使用将帮助你写出更加优雅和灵活的代码。在实际编程中,你可以选择使用 Lambda 函数来快速定义简单的函数,也可以使用闭包来实现更复杂的逻辑。它们在不同的上下文中有不同的用途,但都为 Python 提供了灵活性和表达力。

qiuyehuanghun的博客 1139

hdu 1195 Open the Lock(bbfs(双向广搜))

<br />第一次使用双向广搜算法求解,感觉效率的确提高了不止两倍。刚开始的一直WA,后来发现是每次都要扩展一层的节点,然后在扩展另一层的节点,而不是每次只扩展一个节点。<br /> /* Author: ACb0y Date: 2010-9-21 Type: bbfs(双向广搜) ProblemId: hdu 1195 Open the Lock Result: AC */ #include <iostream> #include <queue> using namespace

个人独立博客http://www.acb0y.cn/ 1526

pagerank算法详解

目录一、pagerank定义两个重要假设二、pagerank算法公式定义计算演示矩阵化计算三、存在的两个问题问题1.Dead Ends问题2.Spider Traps 一、pagerank定义 入链数:指向该节点的链接数 出链数:由该节点指出的链接数 以上图为例:A的入链数为1,出链数为3,所以将由A指向其他节点的边权重设置为1/3,表示A访问B、C、D节点的概率均为1/3 两个重要假设 数量假设:在Web图模型中,如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。 质量假设:指向

gary101818的博客 4万+

Python lambda 与 闭包

Lambda高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便,也就是lambda。先来看个简单 lambda 函数>>> lambda x, y : x+y <function <lambda> at 0x102bc1c80>x 和 y 是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,这里我们暂且给这

Jitwxs 2739

Delta并联机构运动学正逆解:从理论建模到Matlab实战

本文深入解析了Delta并联机构运动学正逆解的核心原理与实战方法。通过几何建模,清晰阐述了其“逆解简单、正解复杂”的特性,并详细推导了基于一元二次方程的逆解解析算法与采用牛顿-拉弗森迭代法的正解数值算法。文章结合完整的Matlab代码实例,从符号推导到数值求解,提供了从理论到实践的完整实现路径,助力机器人开发者掌握Delta并联机构的运动学分析。

weixin_29096377的博客 433

Python——嵌套函数、闭包、装饰器和lambda匿名函数

Python的装饰器是一个非常强大的工具,它提供了一种优雅的方式来增强或修改函数的功能,而无需修改函数本身的代码。ython的装饰器(Decorator)是一个非常强大且灵活的工具,它允许你在不修改原有函数或类定义的情况下,给函数或方法添加新的功能。装饰器本质上是一个函数,这个函数接收一个函数作为参数并返回一个新的函数。:嵌套函数提供了一种封装代码的方式,使得内部函数只能被外部函数访问(如果外部函数不返回内部函数的话)。函数经常与Python中的高阶函数(接受函数作为参数或返回函数的函数)一起使用,比如。

weixin_45720999的博客 1397

Python地理数据处理 十七:植被物候提取和分析(Savitzky-Golay)

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于生态工程保护建设和植被自然生长等因素,中国陆地生态系统发挥了重要的碳汇作用。因此,定量评估植被时空动态变化是制定生态系统可持续发展目标和衡量生态系统固碳潜力的重要前提,卫星遥感数据衍生的生态参量产品为研究长时间序列全球及区域植被时空变化提供了重要数据源。SG滤波能够对物候信息进行平滑,并提取其中的物候信息

amyniez的博客,欢迎交流讨论 4247

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具,广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置,以高效监控服务,并确保系统的可靠性和可维护性。

颜淡慕潇 2万+

Python中的函数进阶:闭包函数、Lambda函数、高阶函数与装饰器

简单来说,闭包函数是一个函数,它引用了其外部作用域中的变量,即使外部函数已经执行完毕,闭包函数依然可以访问这些局部变量。高阶函数是指一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数。Python中的很多内置函数都是高阶函数,比如。它需要一个二元函数和一个序列,并将二元函数应用于序列的前两个元素,然后将结果与序列的下一个元素应用同样的函数,依此类推。是一个带参数的装饰器工厂函数,它返回一个实际的装饰器。函数对序列的每个元素应用一个函数,并返回一个新的迭代器,其中包含应用函数后的结果。

Luzem0319的博客 874

爬取B站评论+AI情感分析:Python批量抓数据+BERT正负向分类(全流程)

B站作为年轻群体聚集的内容平台,评论区蕴含海量用户真实态度(如好评、吐槽、中立观点),是情感分析的优质数据源!本文分享完整流程:批量爬取B站视频评论→数据清洗去噪→BERT模型情感分类→可视化分析,基于预训练BERT模型实现高精度正负向判断,新手也能快速复刻情感分析系统! 前置配置(关键!获取B站API访问权限) B站评论通过官方API接口返回,无需复杂解析,只需配置用户Cookie即可正常请求: 2. 完整代码(直接复制运行) 三、使用步骤(5步搞定,新手友好) 步骤1:配置关键参数 打开,在类中修改

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1068

python函数-闭包,装饰器,lambda表达式,生成器

闭包(Closure):当一个内部函数引用了外部函数的变量时,即使外部函数已执行完毕,这些变量仍会被保留在内存中,形成闭包。三要素嵌套函数(内部函数定义在外部函数内)内部函数引用外部函数的变量外部函数返回内部函数return base**exp #内部函数引用外部变量return inner # 返回内部函数对象(非调用结果)# 1. 调用外部函数,exp=2# 2. 返回inner函数对象(绑定exp=2)# 3. square现在指向这个绑定函数# 查看square对象。

目前正在学习python,后面陆续更新自己整理的知识点~ 1512

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python lambda 闭包-python闭包

本文分为如下几个部分什么是闭包闭包与装饰器闭包等价——偏函数闭包等价——类闭包等价——其他闭包用于捕获状态值闭包等价——协程三种方法实现动态均值什么是闭包闭包是携带着一些自由变量的函数。我们直接来看一个例子def fun_out(a):def fun_in(b):return a + breturn fun_infun1 = fun_out(1)其中fun1函数是一个闭包,它携带着fun_out中...

weixin_39793708的博客 372

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

for循环中的lambda与闭包

for循环中的lambda与闭包 问题引入 z = [lambda x:x*i for i in range(3)] x = [o(2) for o in z] print x # [4,4,4] f = [lambda x: x*i for i in range(3)](与x无关) i就是在闭包作用域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包中用到的变量的...

dzq07385的博客 531

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python-lambda表达式

lambda用来定义一个函数 普通函数: def multiply(x, y): return x * y 使用lambda重写以上函数: multiply = lambda x, y: x * y lambda函数由三个部分组成: 1. lambda关键字 2. 用,分割的参数,就是普通函数里的参数,后面跟一个: 3. 函数体,就是...

158

lambda表达式与闭包的真正区别和联系

什么是lambda表达式 lambda和闭包最早可以追溯到lambda演算,lambda演算是上世纪30年代由Alonzo Church创造的。 lambda演算可以说是一种最简单的编程语言,你只可以用它来做的唯一的事情是: 应用:将一个表达式应用到另一个表达式,表示f(x)。(把它当作是函数调用,其中f是函数,x是它的唯一参数)。 抽象:它可以绑定一个符号,改符号可以看作是一个“插槽”、...

每天学习一点点,每天记录一点点 2551

python 类对象 装饰器和lambda简单示例

参考: https://www.bilibili.com/video/av25698102?from=search&seid=7974553251451266617 https://www.bilibili.com/video/av24639639 1,lambda函数 有简单的到后面复合的结合使用 def f(x, y): return x + y print(f(2, 3)) ...

weixin_42357472的博客 350

Python函数小结(2)-- 装饰器、 lambda

装饰器 实际上理解装饰器的作用很简单,在看core python相关章节的时候大概就是这种感觉。只是在实际应用的时候,发现自己很难靠直觉决定如何使用装饰器,特别是带参数的装饰器,于是摊开来思考了一番,写下一些心得。 装饰器简述 为了完整起见,这里简要说明一下装饰器的语法。装饰器分为带参数得装饰器以及不带参数得装饰器。装饰器以及使用效果看起来大概是这样的。 #语法是这

elyaowu的专栏 883

【闭包】你真的理解闭包和lambda表达式吗

1. 前言 2. 【译】lambda表达式和闭包的区别 3. 历史考据 4. 总结 1. 前言 在阅读Think in java时,关于内部类的作用中出现了闭包这个词。于是开始百度,了解到了怎么使用代码定义一个闭包,闭包能实现什么妙用。而这种答案是不能让人满意的,因为这样的回答会让人感觉闭包是编程语言设计者设计出来的一个很蠢的东西。 例如这种类型的回答: - 闭包能实现...

Altsuki的博客 6238

lambda表达式和闭包

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33682719的博客 287

python lambda优雅地实现缓存管理

以下代码可以使用装饰器灵活地删除缓存 @wipe_cache(lambda request: user_roles_key(request.userId), 1) def update(self, request, *args, **kwargs): ... def wipe_cache_p(key_fun, key_position): def wrapper(func): def inner(*args, **kwargs): ret =

alicinya的博客 311

python lambda函数举例

例1 &gt;&gt;&gt;p = lambda x,y:x+y &gt;&gt;&gt;p(3,4) 7 例2 import tensorflow as tf tf.reset_default_graph() x = tf.constant(10) y = tf.constant(5) a=2 b=3 z = tf.multiply(a, b) result = tf.cond...

猫头军师兵书 377

Python内置函数filter用法小结

filter被称为高阶函数是有道理的。 filter(self, /, *args, **kwargs) Docstring:      filter(function or None, iterable) --&gt; filter object   Return an iterator yielding those items of iterable for which function...

blwinner的专栏 1万+
上一篇: 【win10】MySQL在cmd下直接连接数据库的方法,不用到bin文件夹下连接!
下一篇: Github-ssh连接The authenticity of host 'github.com (192.30.253.112)' can't be established.解决办法
0x101
博客等级 码龄8年 16粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值