Python核心技术与实战——八|匿名函数
Posted yinsedeyinse
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python核心技术与实战——八|匿名函数相关的知识,希望对你有一定的参考价值。
今天我们来学习一下匿名函数。在学习了上一节的自定义函数后,是时候了解一下匿名函数了。他们往往非常简短,就一行,而且有个关键字:lambda。这就是弥明函数。
一.匿名函数基础
匿名函数的基本格式是这样的:
lambda argument1,argument2,argument3,...,argumentN:expression
lambda后紧跟的是参数,冒号后是表达式。举个例子来说明用法
>>> fun = lambda x:x**2 >>> fun(4) 16
这里的匿名函数只包含了一个参数x,输出则是这个数的平方,如果不用匿名函数的方法是这样的
>>> def fun(x): ... return x**2 >>> fun(4) 16
可以看出来匿名函数和常规函数一样,都是一个函数对象(function object),他们的用法也很相似,不过还是有一些区别的:
1.lambda是一个表达式(expression)而不是一个语句(statement)。所谓表达式,就是用一系列公式去表达一个东西,比如x+2;而语句就是完成了某些功能比如赋值语句x = 2完成了赋值,print完成了打印等。所以lambda可以用在一些常规函数无法使用的地方,比如一个列表内部,而常规函数就不可以。
>>> l = [(lambda x:x*x)(x) for x in range(10)] >>> l [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
或者在PyQt里,也常常用lambda来作为槽函数可以直接使用,比方有三个按钮,每次按下时打印‘按钮1/2/3被按下’
import sys from PyQt5.Qt import * app = QApplication(sys.argv) window = QWidget() window.resize(800,600) btn_1 = QPushButton(‘1‘,window) btn_2 = QPushButton(‘2‘,window) btn_3 = QPushButton(‘3‘,window) btn_1.move(100,200) btn_2.move(100,250) btn_3.move(100,300) btn_1.clicked.connect(lambda :print(‘btn1 is clicked‘)) btn_2.clicked.connect(lambda :print(‘btn2 is clicked‘)) btn_3.clicked.connect(lambda :print(‘btn3 is clicked‘))
在这里用匿名函数就要比为每个信号定义个槽函数要方便的多
def fun_1(): print(‘btn1 is clicked‘) def fun_2(): print(‘btn2 is clicked‘) def fun_3(): print(‘btn3 is clicked‘) btn_1.clicked.connect(fun_1) btn_2.clicked.connect(fun_2) btn_3.clicked.connect(fun_3)
2.lambda的主体是只有一行的简单表达式,并不能扩展成一个多行的代码。其实是出于设计的考虑,lambda和def应该各司其职:前者专注于简单的任务,而后者负责更复杂的多行的逻辑。python之父龟叔有一篇文章就是讲的关于这个的。
总结
我们使用函数的目的就是这两点:
1.减少代码的重复性;
2.模块化代码
但是如果一个很简单的逻辑功能只是被调用一次或频率很低,就可以用匿名函数解决。
以上是关于Python核心技术与实战——八|匿名函数的主要内容,如果未能解决你的问题,请参考以下文章