一、匿名函数或lambda函数
对于一些简单函数,例如做加法函数:
def add(a, b):return a + b
一个简单的函数却需要两行代码,显然不够优雅。此时我们就可以使用lambda函数来做转换,使得整个函数一行代码就能写完:
add = lambda a, b: a + b此时,add可视为一个lambda算子定义的函数,参数为冒号前的a、b,返回计算结果冒号后的a + b。
lambda函数有固定的表示方法:
function = lambda arg, *args: expression从表达式可以看出,lambda函数有以下的几个特点:
可以作为变量进行赋值,使用type函数进行数据类型查看,会发现输出“<class ‘function’>”。普通def定义的函数也可以通过变量命名的方式赋值给其他变量,但通常函数作为变量赋值的方式并不推荐。
冒号前方的内容为函数形参,可以一个、多个或者没有。若没有参数,冒号也需要书写到代码中。
冒号后方为函数处理逻辑,用于处理形式参数,且计算结果为返回值。但要注意,只能有一行处理代码,不能够使用逗号等方式填入多行代码内容。
使用lambda函数有很多便捷之处。在某些函数调用情况下,我们需要对传入参数进行处理,lambda函数可作为伴随于参数的控制参数进行传参使用,最典型的即为对字典按照键或值进行排序:
data = {1: "1",4: "4",3: "3",2: "2"}# 按键对 data 进行排序data = dict(sorted(data.items(), key=lambda x: x[0]))print(data)# Output: {1: '1', 2: '2', 3: '3', 4: '4'}
排序函数sorted的key参数接收了一个lambda函数作为参数,用于获取data每个键值对的键(items使得data变为元组键值对序列,x[0]获取的是元组的第一个值即键)参与排序。
多讲一点。从前面可以看到,lambda函数能作为值赋给某个变量,def定义的函数同样可以,也能使用del去删除(del是一个特殊关键词,能够删除某个变量,使变量在后续代码中不发生作用)。
def function():print("calling")call = functioncall()# Output: callingdel functionfunction()# Output: NameError: name 'function' is not defined
二、变量类型提示
在讲定义函数时会发现,我们仅给出了形参变量名,而并不知道其具体接收的是什么样的数据类型,例如下面的函数及其调用:
def add(a, b):return a + bprint(add("1", 2))
如果我们事先不知道a、b是算数加法的参数,那么很有可能在调用时传入错误数据类型的变量或参数,导致程序出错。同时,若函数功能复杂,后续再更改代码时就需要消耗大量时间去理解形参的含义及传参限制。
利用一些IDE的提示功能也会发现(如下方Trae编辑器的截图),其对a、b数据类型的解释是Any,即什么数据类型都有可能:

为了解决这些问题,我们可以使用形参类型提示,如同上图显示的函数定义,确定形参数据类型以及返回值类型参考:
def add(a: int, b: int) -> int:return a + b

但要注意,Python不强制你必须传入此类数据,也不保证返回值必然是此类型。参考数据类型的添加,形参则是在变量名后加冒号及数据类型名,返回值则是在括号后方键入箭头(横杠加大于号)及数据类型名。
若你的函数比较灵活,可以接收多种数据类型,可以使用“|”(“或”逻辑)来声明多类型:
def add(a: int | float, b: int | float) -> int | float:return a + bprint(add("1", 2))

也可以使用Python内置代码库“typing”中的Union来注释:
import Uniondef add(a: Union[int, float],b: Union[int, float]) -> Union[int, float]:return a + b
“typing”库中有很多的数据类型及操作代码,留给读者去发掘。至于代码库的定义及介绍,则放在后续章节。
这种形参类型注释的同样可以作用于变量赋值等情况:
a: int = 1b: float = 2.0c: bool = True
其目的则是为了在一些情况下能更快速地理解变量,同时也为IDE提供代码解析逻辑,以便产生更准确的代码提示。
往期回顾: