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核心技术与实战——八|匿名函数的主要内容,如果未能解决你的问题,请参考以下文章

Golang入门到项目实战 golang匿名函数

函数编程——匿名函数与lambda

开发技术--Python核心技术B

python---------匿名函数

python---------匿名函数(map,filter,zip..)

Python-匿名函数与异常处理