这篇文章翻译自https://www.pythontutorial.net/python-basics/python-lambda-expressions/
Python 匿名表达式
总览:在这篇教程,你将学习 Python 匿名表达式并学习如何使用匿名函数
有时,你需要写一个简单的函数,包含一个表达式。不过,这个函数只需要使用一次。那么没有必要使用 def 关键字来定义这个函数。
那正是 Python 匿名表达式起作用的地方
什么是 Python 匿名表达式
Python 匿名表达式允许你定义匿名的函数。
匿名函数是没有名字的函数。当函数只需要被使用一次时,匿名函数是实用的。
一个匿名表达式通常包括一个或者多个参数,但是它仅仅只有一个表达式。
下面展示了匿名表达式的语法:
lambda parameters: expression
它和下面的函数(没有 “anonymous” 名字)是等同的。
def anonymous(parameters):
return expression
Python 匿名表达式例子
在 Python 中,你可以向一个函数传递一个函数作为参数或者从另一个函数返回一个函数
接受函数作为参数的例子
下面定义了一个函数叫做 get_full_name() ,从 first name 和 last name 格式化全名:
def get_full_name(first_name, last_name, formatter):
return formatter(first_name, last_name)
get_full_name() 函数接受三个参数:
-
名字( first_name )
-
姓氏( last_name )(英语中,名字在前,姓氏在后)
-
一个将会格式化全名的函数( formatter )。 formatter 函数依次接受两个参数 first_name 和 last_name。
下面定义了两个函数,根据名字和姓氏以不同的格式返回一个全名。
def first_last(first_name, last_name):
return f"{first_name}{last_name}"
def last_first(first_name, last_name):
return f"{last_name},{first_name}"
然后下面展示了如何通过传入名字,姓氏 和 first_last / last_first 函数来调用 get_full_name() 函数:
full_name = get_full_name('John', 'Doe', first_last)
print(full_name) # John Doe
full_name = get_full_name('John', 'Doe', last_first)
print(full_name) # Doe, John
输出:
John Doe
Doe,John
作为定义
你可以使用匿名表达式,来代替定义 first_last 和 last_first 函数。
例如,你可以使用下面的表达式来表示 first_last 函数:
lambda first_name, last_name: f"{first_name} {last_name}"
这个匿名表达式接受两个参数,然后以 first_name ,空格, last_name 的顺序拼接成一个字符串。
下面使用一个匿名表达式转换 last_first 函数,这个表达式以 last name,空格,first name 的格式返回全名。
lambda first_name, last_name:f"{last_name} {first_name}";
通过使用匿名表达式,你可以像下面这样调用 get_full_name() :
def get_full_name(first_name, last_name, formatter):
return formatter(first_name, last_name)
full_name = get_full_name(
'John',
'Doe',
lambda first_name, last_name: f"{first_name} {last_name}"
)
print(full_name)
full_name = get_full_name(
'John',
'Doe',
lambda first_name, last_name: f"{last_name} {first_name}"
)
print(full_name)
返回一个函数的例子
下面的 time() 函数返回一个是匿名表达式的函数:
return lambda x: x * n
下面的例子展示了如何调用 time() 函数:
double = times(2)
因为 time() 函数返回一个函数,所以 double 也是一个函数,为了调用它,你可以像这样传递参数:
result = double(2)
print(result)
result = double(3)
print(result)
输出:
4
6
下面展示了另一个使用 times 函数的例子:
triple = times(3)
print(triple(2)) # 6
print(triple(3)) # 9
循环中的匿名表达式
看下面的例子:
callables = []
for i in (1, 2, 3):
collables.append(lambda: i)
for f in callables:
print(f())
它是怎么运行的。
-
首先,定义一个名字是 callables 的列表。
-
然后,从 1 到 3 迭代,在每次迭代中创造一个新的匿名表达式,然后把它添加到列表。
-
最后,循环遍历 callables 然后调用每一个函数。
预期的输出是这样:
1
2
3
然而,程序展示了下面的输出:
3
3
3
问题是所有的匿名表达式都指向了变量 i 而不是当时 i 变量的值。当你调用匿名表达式时,变量 i 的值是3。
要解决这个问题,你需要在匿名表达式被创建的时候,将当时 i 变量的值绑定给每一个匿名表达式。一种实现的方法是实用默认参数:
callables = []
for i in (1, 2, 3):
callables.append(lambda a=i: a)
for f in callables:
print(f())
在这个例子中,在每个匿名表达式被创建时,a 的值被赋值给匿名表达式。因此,程序返回了预期的结果。
总结
-
使用 Python 匿名表达式来创建匿名函数,这些函数没有标识符。
-
一个匿名表达式接受一个或者多个参数,包括一个表达式,返回那个表达式的结果。
-
使用匿名表达式将匿名函数传递给一个函数,也可以从另一个函数返回一个函数。
(全文完)
部分图片来自于源网站,侵删。
鉴于本人才疏学浅,翻译难免有所疏漏,如果有任何问题欢迎随时联系我进行批评指正:2076577077@qq.com
我是gled fish, 点击这里来到我的博客网站:
转载请注明译者和原出处,请勿用于任何商业用途。