匿名函数
匿名:隐藏名字,既没有名称
匿名函数:没有名字的函数
函数没有名字该如何定义?函数没有名字如何调用?
lambda 表达式
Python 中,使用 lambda 表达式构建匿名函数。
lambda x : x ** 2 # 定义 print((lambda x : x ** 2)(4)) # 调用,输出
使用 lambda 关键字定义匿名函数,格式为:
lambda [参数列表] : 表达式
参数列表不需要小括号,无参就不写参数;
冒号用来分割参数列表和表达式部分;
不需要使用 return。表达式的值,就是匿名函数的返回值。表达式中不能出现等号;
lambda 表达式(匿名函数)只能写在一行上,也称为单行函数。
匿名函数往往用在为高阶函数传参时,使用 lambda 表达式, 往往能简化代码。
# 返回常量的函数 print((lambda : 0)()) # 加法匿名函数,带缺省值 print((lambda x, y=3: x + y)(5)) print((lambda x, y=3: x + y)(5, y=10)) # keyword-only 参数 print((lambda x, *, y=3: x + y)(5)) print((lambda x, *, y=3: x + y)(5, y=10)) # 可变参数 print((lambda *args: args)(*range(10))) # 10 print((lambda *args: [args])(*range(10))) # 1 print((lambda *args: [*args])(*range(10))) # 10 print((lambda *args: {x for x in args})(*range(10))) print((lambda *args: {x % 2 for x in args})(*range(10))) # 去重 print((lambda *args: (x for x in args))(*range(10))) # 生成器表达式 for i in (lambda *args: (x for x in args))(*range(10)): print(i) [x for x in (lambda *args: map(lambda x: x + 1, args))(*range(5))] # 高阶函数 [x for x in (lambda *args: map(lambda x: (x + 1, args), args))(*range(5))]
# 例:简单排序 l1 = [1, 2, '1', 'a'] # sorted 函数 # 使用函数 def fn(x): if isinstance(x, str): return ord(x) return x print(sorted(l1, key=fn)) # 使用 lambda print(sorted(l1, key=lambda x: ord(x) if isinstance(x, str) else x))