Python lambda 函数
最后修改于 2024 年 1 月 29 日
本文介绍如何在 Python 中创建匿名函数。Python 中的匿名函数使用 lambda 关键字创建。
Python lambda 函数
Python lambda 函数,也称为匿名函数,是内联函数,没有名称。它们使用 lambda 关键字创建。这是 Python 内置的函数式编程范例的一部分。
Python lambda 函数仅限于单个表达式。它们可以在任何可以使用普通函数的地方使用。
Python lambda 语法
Python lambda 具有以下语法
z = lambda x: x * y
该语句使用 lambda 关键字创建一个匿名函数。该函数将两个值相乘。x 是传递给 lambda 函数的参数。参数后面是一个冒号。冒号后面的代码是调用 lambda 函数时执行的表达式。lambda 函数被赋值给 z 变量。
Python lambda 函数示例
以下是一个演示 Python lambda 函数的简单示例。
#!/usr/bin/python
def square(x):
return x * x
sqr_fun = lambda x: x * x
print(square(3))
print(sqr_fun(4))
在此示例中,我们有两个函数可以对值进行平方。
def square(x):
return x * x
这是一个使用 def 关键字定义的 Python 函数。该函数的名称是 square。
sqr_fun = lambda x: x * x
这里我们使用 lambda 定义了一个匿名的内联函数。请注意,该函数没有名称。sqr_fun 是保存创建的 lambda 函数的变量名。
$ ./lambda_fun_simple.py 9 16
带 map 的 Python lambda 函数
Python lambda 函数可与 map 函数一起使用。我们可以创建更简洁的代码。Python map 是一个内置函数,它将给定的函数应用于可迭代对象的每个项,并返回一个迭代器对象。
#!/usr/bin/python
nums = [1, 2, 3, 4, 5, 6]
nums_squared = map(lambda x: x * x, nums)
for num in nums_squared:
print(num)
该示例为 map 创建了一个小的内联函数作为参数。使用 map 函数,我们将 lambda 函数应用于列表的每个元素。
$ ./lambda_fun_map.py 1 4 9 16 25 36
带 filter 的 Python lambda 函数
Python lambda 函数可以与 filter 函数一起使用。filter 函数从可迭代对象中构建一个列表,其中包含函数返回 true 的元素。
#!/usr/bin/python nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] nums_filtered = list(filter(lambda x: x % 2, nums)) print(nums_filtered)
在此示例中,我们过滤了整数列表。新列表仅包含奇数。
nums_filtered = list(filter(lambda x: x % 2, nums))
filter 的第一个参数是处理列表元素的函数。lambda 函数具有 x % 2 表达式,该表达式对奇数值返回 true。
$ ./lambda_fun_filter.py [1, 3, 5, 7, 9, 11]
带 sort 的 Python lambda 函数
Python 列表具有内置的 list.sort 方法,该方法会就地修改列表。该方法有一个 key 参数,用于在进行比较之前指定要对每个列表元素调用的函数。我们可以在此处使用 lambda 函数。
#!/usr/bin/python
users = [
{'name': 'John Doe', 'date_of_birth': 1987},
{'name': 'Jane Doe', 'date_of_birth': 1996},
{'name': 'Robert Brown', 'date_of_birth': 1977},
{'name': 'Lucia Smith', 'date_of_birth': 2002},
{'name': 'Patrick Dempsey', 'date_of_birth': 1994}
]
users.sort(reverse=True, key=lambda e: e['date_of_birth'])
for user in users:
print(user)
我们有一个用户字典列表。使用 lambda 函数,我们按出生日期以反向顺序对用户进行排序。
$ ./lambda_fun_sort.py
{'name': 'Lucia Smith', 'date_of_birth': 2002}
{'name': 'Jane Doe', 'date_of_birth': 1996}
{'name': 'Patrick Dempsey', 'date_of_birth': 1994}
{'name': 'John Doe', 'date_of_birth': 1987}
{'name': 'Robert Brown', 'date_of_birth': 1977}
带 min 和 max 的 Python lambda 函数
下一个示例使用内置的 min 和 max 函数以及 lambda。
#!/usr/bin/python
from dataclasses import dataclass
@dataclass(frozen=True)
class Car:
name: str
price: int
cars = [
Car("Audi", 52642), Car("Mercedes", 57127), Car("Skoda", 9000),
Car("Volvo", 29000), Car("Bentley", 350000), Car("Citroen", 21000),
Car("Hummer", 41400), Car("Volkswagen", 21601)
]
n = min(cars, key=lambda c: c.price)
print(n)
n = max(cars, key=lambda c: c.price)
print(n)
在此示例中,我们有一个汽车对象列表。我们找出最便宜和最贵的汽车。
n = min(cars, key=lambda c: c.price) print(n) n = max(cars, key=lambda c: c.price) print(n)
这些函数将 lambda 函数作为第二个参数。lambda 函数返回 min、max 函数在其上操作的对象属性。
$ ./mmfun.py Car(name='Skoda', price=9000) Car(name='Bentley', price=350000)
带 Tkinter 的 Python lambda
Python lambda 函数可用于 GUI 编程,例如 Tkinter。它允许为 command 参数创建小型内联函数。
#!/usr/bin/python
from tkinter import Tk, BOTH, messagebox
from tkinter.ttk import Frame, Button
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Buttons")
self.pack(fill=BOTH, expand=1)
btn1 = Button(self, text="Button 1",
command=lambda: self.onClick("Button 1"))
btn1.pack(padx=5, pady=5)
btn2 = Button(self, text="Button 2",
command=lambda: self.onClick("Button 2"))
btn2.pack(padx=5, pady=5)
btn2 = Button(self, text="Button 3",
command=lambda: self.onClick("Button 3"))
btn2.pack(padx=5, pady=5)
def onClick(self, text):
messagebox.showinfo("Button label", text);
def main():
root = Tk()
root.geometry("250x150+300+300")
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
我们有三个共享一个回调的按钮。lambda 函数允许我们将特定数据发送到回调函数。每个按钮在其标签旁边的消息框中显示其标签。
btn1 = Button(self, text="Button 1",
command=lambda: self.onClick("Button 1"))
我们将一个匿名函数传递给 command 参数。我们将按钮的标签发送到 onClick 回调。
来源
在本文中,我们已经使用了 Python lambda 函数。
作者
列出所有 Python 教程。