在前几篇中,我们完整介绍了Python自定义函数的特性、参数和返回值,大家可以通过点击下方的链接进行了解。
虽然自定义函数很强大,但还不是Python的全部。
今天,我们将要学习一种新的函数,叫做匿名函数。匿名函数本质上也可以看做是一种自定义函数,只不过是以匿名的方式来展示。
1、匿名函数的定义
我们知道,每一个自定义函数都是有函数名的,并通过def关键字进行声明。而匿名函数是不需要定义函数名的,通过Lambda关键字进行定义,告诉大家“我没有名字,我是一个匿名函数”。
但这可能只是Lambda函数被翻译成“匿名函数”的原因。如果从原理上看,匿名函数之所以被称之为“匿名函数”,是因为——
和def关键字声明的函数不同,匿名函数对象自身并没有一个显式的__name__属性。
看到这样的解释是否有点不明觉厉,其实我也看不懂,就当做提前了解的一点知识吧,随着我们学习的不断深入,以后可能就会懂了。。。
2、匿名函数的作用
匿名函数是一种通过单个语句生成函数的方式,其结果就是返回值。
In [1]: def pingfang(x):
return x * x
result = pingfang(2)
print(result)
Out[1]: 4
In [2]: result = lambda x: x * x
print(result(2))
Out[2]: 4
从上面两个实例的比较我们可以看出来以下两点:
一、匿名函数是一种自定义函数的紧凑的表达形式,只需要用一行代码,就能够实现普通自定义函数从定义到返回值的整个代码段的作用,并且具有更高的可读性,也是在Python编程中非常常用的编写形式。
但在应用匿名函数时,一般只会将一些比较简单的函数转化成匿名函数来使用。如果是非常复杂和大型的函数,还是要使用自定义函数的形式,如果强制以匿名函数的方式实现,可能就得不偿失了。
二、lambda函数返回函数名作为结果。应用匿名函数后,原来接收函数返回值的变量result实际上变成了一个result(x)函数,也就是我们使用lambda关键字,用一行代码定义了一个result(x)函数。如果我们把变量名称修改一下,这种关系可能会更加清晰。
In [3]: pingfang = lambda x: x * x
print(pingfang(2))
Out[3]: 4
3、匿名函数的格式
从上面的实例我们也看到了,匿名函数是一个由lambda关键字定义的语句,其语法格式为:
<函数名> = lambda <参数>: <表达式>
从语法格式上也能看出来,和我们上面第二点讲的是一样的,lambda函数返回的是一个<函数名>。
虽然匿名函数一般用于比较简单的函数的定义,但上面的实例都只有一个参数,也过于简单了,下面就举几个稍微复杂但很高效的实例。
In [4]: tixingmianji = lambda shangdi, xiadi, gao: (shangdi + xiadi) * gao / 2 # 多个参数
print("梯形面积等于{}。".format(tixingmianji(2, 5, 3)))
Out[4]: 梯形面积等于10.5。
In [5]: str = ['lee', 'jupyter', 'aaaaa', '23400', '**##^^']
str.sort(key = lambda x: len(set(list(x)))) # 按照字符串不重复元素的个数排列,set()用于去除重复元素
str
Out[5]: ['aaaaa', 'lee', '**##^^', '23400', 'jupyter']
4、柯里化
柯里化是计算机科学术语(以数学家Haskell Curry命名),它表示通过部分参数应用的方式,从已有的函数中衍生出新的函数。
例如,我们有一个不重要的函数,其功能是将两个数加在一起:
def add_numbers(x, y):
return x + y
使用这个函数,我们可以衍生出一个只有一个变量的新函数,add_five,也就是可以给参数加上5:
add_five = lambda y: add_numbers(5 + y)
其中,第二个参数y,对于函数add_numbers来说,就是柯里化了。
虽然名字听上去很高大上,但是这个过程很容易理解,其实就是使用匿名函数定义了一个新函数(add_five),而这个新函数调用了已经存在的函数(add_numbers)而已。
以上就是我们对匿名函数的讲解。
但我们发现,截至目前,我们学习的函数都是在一个程序或者文件中体现的,虽然可以复用,但也仅仅只能在这一个程序或者文件中复用。如果想在多个程序或者文件中复用同一个函数,难道还需要在每一个程序或者文件中都定义同一个函数么?
下一篇,我们将要介绍的模块,就是要解决在不同程序或者文件中复用函数的方法,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手29”,即可免费下载本篇文章所用示例语句。