Python 进阶 (五) 浅谈 python 匿名函数及编写无参数 decorator

Python 匿名函数详解及示例代码 匿名函数是一种没有名称的函数,可以在需要函数的任何位置定义和使用,非常适合于简单的功能和临时需求。其中,arguments 是参数列表,expression 是函数体,表示匿名函数的计算逻辑。匿名函数可以有多个参数,也可以不带参数。2.1 无需函数名称:匿名函数不需要像普通函数那样定义一个名称,因此可以在需要函数的任何地方直接使用。3.1 函数作为参数:匿名函数可以作为其他函数的参数传递,用于定义回调函数或对集合进行排序等操作。3.2 表达式计算:匿名函数可以用于一次性的表达式计算,避免定义额外的函数。 阅读详情

一、前言

高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便。

在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算 f(x)=x2 时,除了定义一个 f(x)的函数外,还可以直接传入匿名函数:

>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])[1, 4, 9, 16, 25, 36, 49, 64, 81]

通过对比可以看出,匿名函数 lambda x: x * x 实际上就是:

def f(x):    return x * x
  • 关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。

使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码:

>>> sorted([1, 3, 9, 5, 0], lambda x,y: -cmp(x,y))[9, 5, 3, 1, 0]

返回函数的时候,也可以返回匿名函数:

>>> myabs = lambda x: -x if x < 0 else x >>> myabs(-1)1>>> myabs(1)1

二、举例

利用匿名函数简化以下代码:

def is_not_empty(s):    return s and len(s.strip()) > 0filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])

定义匿名函数时,没有return关键字,且表达式的值就是函数返回值。参考代码:

print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])

三、python 编写无参数 decorator

Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。

使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。

考察一个@log的定义:

def log(f):    def fn(x):        print 'call ' + f.__name__ + '()...'        return f(x)    return fn

复制代码

对于阶乘函数,@log工作得很好:

@logdef factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)

复制代码

结果:

call factorial()...3628800

但是,对于参数不是一个的函数,调用将报错:

@logdef add(x, y):    return x + yprint add(1, 2)

复制代码

结果:

Traceback (most recent call last): File "test.py", line 15, in <module> print add(1,2) TypeError: fn() takes exactly 1 argument (2 given)

因为 add() 函数需要传入两个参数,但是 @log 写死了只含一个参数的返回函数。

要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

def log(f):    def fn(*args, **kw):        print 'call ' + f.__name__ + '()...'        return f(*args, **kw)    return fn

现在,对于任意函数,@log 都能正常工作。

四、举例

请编写一个@performance,它可以打印出函数调用的时间。

计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。参考代码:

import timedef performance(f):    def fn(*args, **kw):        t1 = time.time()        r = f(*args, **kw)        t2 = time.time()        print 'call %s() in %fs' % (f.__name__, (t2 - t1))        return r    return fn
@performancedef factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)
手把手教你用DLP4500投影仪玩转结构光3D扫描(附固件烧录与序列设置避坑指南) 本文详细解析了如何使用DLP4500投影仪搭建结构光3D扫描系统,涵盖硬件组装、固件烧录、图案生成与优化等全流程。重点解决了固件烧录失败、图像格式错误等常见问题,并提供了实用的避坑指南和进阶技巧,帮助读者快速掌握DLP4500在3D扫描中的应用。 阅读详情

相关推荐

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1263

Python的匿名函数

1.应用场景:在定义函数的时候,不想给函数起一个名字,这个时候我们可以使用匿名函数lambda来定义一个匿名函数 2.语法: 变量名 = lambda 参数:表达式 注: 1.参数:可选,通畅用逗号隔开的表达式形式,也就是位置参数; 2.参数可有可无,如果有多个参数,可以使用逗号隔开 3.表达式计算的结果直接返回 1.创建简单匿名函数 func = lambda:3>2 ret = func() # 变量名(),即可调用匿名函数,使用ret来接收变大时返回的内...

weixin_51445771的博客 848

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

Python教程十:匿名函数

lambda关键字,可以定义匿名函数(无名称);def关键字,可以定位带有名称的函数;有名称的函数,可以基于名称重复使用;无名称的匿名函数,只可临时使用一次。

码农code之路 241

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路)

时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。

测试工程师的成长之路 1117

基于人脸识别的驾驶员疲劳检测方法研究

摘 要交通安全问题愈发严重,疲劳驾驶已是造成交通事故的主要因素之一。为减少因疲劳驾驶造成的交通事故,本文设计了一种基于图像处理技术的疲劳驾驶监测系统,该系统结合了肤色模型、灰度积分投影技术以及PERCLOS方法,旨在通过实时视频图像分析准确检测驾驶员的疲劳状态。首先,系统通过肤色模型从图像中有效提取人脸区域,并在此基础上利用Haar级联分类器进行人脸检测,确保在人脸角度变化或部分遮挡的情况下依然能够实现高效识别。接着,灰度积分投影技术被应用于眼部定位,通过分析眼睛区域的灰度变化,精确确定眼睛的上下边界,从

carrott0617的博客 1005

python入门_匿名函数

匿名函数 藏匿名字的函数,对函数的简写 函数作为参数传递, 表达式:f = lambda x,y:x+y 一、无参数无返回值的函数 正常写法 def my_print(): print(“hello python”) my_print() 简写 f = lambda : print(“hello python”) #执行 f() 二、无参数有返回值的函数 正常写法 #def my_pi(): return 3.14 print(my_pi()) 简写 #表达式的定义 f = lambda : 3.14 pr

zyl2726411159的博客 1475

【Bluetooth蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 3976

Python进阶(六)python编写无参数decorator

Python的decorator本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。使用decorator用Python提供的@语法,这样可以避免手动编写这样的代码。考察一个@log对于阶乘函数,@log结果:3628800结果:因为add()函数需要传入两个参数,但是@log写死了只含一个参数的返回函数。要让@log自适应任何参数定义的函数,可以利用Python的*args和**kw现在,对于任意函数,@log 都能正常工作。

IT全栈 华强工作室 4万+

基于STM32、HAL库的WF162A 11BA T&R气压传感器 驱动程序设计

/ 转换为7位地址。* @param temperature: 存储读取到的温度值(°C)* @param temperature: 存储读取到的温度值(°C)* @param pressure: 存储读取到的压力值(bar)* @param pressure: 存储读取到的压力值(bar)* @param range: 压力范围(bar)

corlin6688的博客 361

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2013

Python编写无参数的decorator

在 Python 中,编写无参数的装饰器是一种常见的需求。装饰器可以用来增强或修改函数的行为,而无参数的装饰器通常用于添加一些通用的功能,如日志记录、性能统计、事务管理等。

伤心的辣条 936

LeetCode --- 937. Reorder Data in Log Files 解题报告

You are given an array oflogs. Each log is a space-delimited string of words, where the first word is theidentifier. There are two types of logs: Letter-logs: All words (except the identifier) consist of lowercase English letters. Digit-logs: All word..

杨鑫newlife的专栏 426

【python进阶】1-4 decorator装饰器 | 编写无参数decorator / 编写带参数decorator / 完善decorator

文章目录1、python中编写无参数decorator 装饰器 python内置的@语法就会使为了简化装饰器调用 装饰器的作用: 可以极大地简化代码,避免每个函数编写重复性代码 打印日志:@log 检测性能:@performance 数据库事务:@transaction URL路由:@post(’/register’) 1、python中编写无参数decorator Python的 decorat...

yipyuenkay的博客 326

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python中编写无参数decorator

Python的decorator本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。 使用 decorator 用Python提供的@语法,这样可以避免手动编写f = decorate(f)这样的代码。 考察一个@log的定义: def log(f): def fn(x): print 'call ' + f.__nam...

aa150602的博客 230

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python装饰器(decorator)系列 --- 编写无参数的装饰器

功能:使用装饰器可以对已有的函数增加新的功能,避免多次编写相同功能的函数 Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写像 f = decorate(f) 这样调用函数的代码 栗子1: 基础公共功能函数: def f1(x): return x * 2 ...

zhf的博客 479

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python的带参数和无参数decorator

Python的decorator,有带参数和无参数两种,带参数的decorator采用了三层嵌套,使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。 #无参的decoratorimport timedef performance(f): def fn(*args, **kw): t1 = time.

qq_34091847的博客 590

python之编写带参数decorator

在学习带参数的decorator之前,我们先回顾下无参数的decorator。以@log装饰器为例讲解: 无参数decorator def new_fn(f): def fn(x): print 'call '+f.__name__+'()' return f(x) return fn @new_fn def f(x): return x*x print f(2) ==> call f() ==> 4 像这种装饰器的参数除了原函数以

yjysunshine的博客 404

Python进阶(六)-python编写无参数decorator

分享一下我的偶像大神的人工智能教程!http://blog.youkuaiyun.com/jiangjunshow 也欢迎转载我的文章,转载请注明出处 https://blog.youkuaiyun.com/mm2zzyzzp Python进阶(六)-python编写无参数decorator   Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为...

mm2zzyzzp的博客 157

python中的装饰器decorator

1.Python编写无参数的decorator Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。使用 decorator 用Python提供的 @ 语法。 考察一个@log的定义: def log(f): def fn(x): print('call ’ + f.name + ‘()…’) return f(x) return fn 对于阶乘函数,@log工作得很好: @log def factorial(n): return reduce(lamb

qq_39172055的博客 2907

python的decorator的一些探究

定义decorator def log(f): #定义装饰器高阶函数,以要装饰的函数f作为参数 def fn(x): #内部相当于重构要装饰的函数f,重命名为fn print 'call ' + f.__name__ + '()...' #加特技print return f(x) #为了不重写原来的函数f的代码,所以用return f(x)代替原来的代码。 return fn 将被装饰过

LiErhua 362

Python装饰器终极指南:awesome-python-decorator项目深度解析

awesome-python-decorator是一个精心策划的Python装饰器资源列表,汇集了从基础概念到实战应用的全面指南,帮助开发者快速掌握Python装饰器的核心功能与高级用法。 ## 揭开Python装饰器的神秘面纱 🧩 Python装饰器是一种强大的语法糖,允许你在不修改函数或类源代码的情况下,动态增强其功能。无论是日志记录、性能分析还是权限控制,装饰器都能优雅地实现代码复用与

gitblog_01104的博客 1107

Python装饰器完整清单:awesome-python-decorator资源库详解

Python装饰器是Python编程中一个强大而优雅的特性,它允许开发者在不修改原始函数或类代码的情况下,为它们添加额外的功能。今天,我将为大家详细介绍一个专门收集Python装饰器资源的宝库——awesome-python-decorator资源库。这个项目整理了Python装饰器的完整清单,涵盖了从基础概念到实际应用的各个方面,是每个Python开发者都值得收藏的终极指南。😊 ## 什么是

gitblog_00374的博客 613
上一篇: Python 进阶 (四) 浅谈 Python 闭包
下一篇: Python 进阶 (七) 浅谈 python3 和 Python2 的区别
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值