ZetCode

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 函数的简单示例。

lambda_fun_simple.py
#!/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 是一个内置函数,它将给定的函数应用于可迭代对象的每个项,并返回一个迭代器对象。

lambda_fun_map.py
#!/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 的元素。

lambda_fun_filter.py
#!/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 函数。

lambda_fun_sort.py
#!/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 函数

下一个示例使用内置的 minmax 函数以及 lambda。

mmfun.py
#!/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 函数返回 minmax 函数在其上操作的对象属性。

$ ./mmfun.py
Car(name='Skoda', price=9000)
Car(name='Bentley', price=350000)

带 Tkinter 的 Python lambda

Python lambda 函数可用于 GUI 编程,例如 Tkinter。它允许为 command 参数创建小型内联函数。

lambda_tkinter.py
#!/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 lambda 函数。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程