匿名函数与 Lambda

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Python 中的匿名函数被称为 lambda 函数。它们是一种创建没有名称的函数的方式。它们对于创建只使用一次的短函数很有用。

重温列表排序

列表可以进行 原地 排序。使用 sort 方法。

s = [10,1,7,3]
s.sort() ## s = [1,3,7,10]

你可以按逆序排序。

s = [10,1,7,3]
s.sort(reverse=True) ## s = [10,7,3,1]

这看起来足够简单。然而,我们如何对字典列表进行排序呢?

[{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}]

依据什么标准呢?

你可以使用 键函数 来指导排序。键函数是一个接收字典并返回用于排序的感兴趣的值的函数。

portfolio = [
    {'name': 'AA', 'price': 32.2,'shares': 100},
    {'name': 'IBM', 'price': 91.1,'shares': 50},
    {'name': 'CAT', 'price': 83.44,'shares': 150},
    {'name': 'MSFT', 'price': 51.23,'shares': 200},
    {'name': 'GE', 'price': 40.37,'shares': 95},
    {'name': 'MSFT', 'price': 65.1,'shares': 50},
    {'name': 'IBM', 'price': 70.44,'shares': 100}
]

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

以下是结果。

## 检查字典如何按 `name` 键排序
[
  {'name': 'AA', 'price': 32.2,'shares': 100},
  {'name': 'CAT', 'price': 83.44,'shares': 150},
  {'name': 'GE', 'price': 40.37,'shares': 95},
  {'name': 'IBM', 'price': 91.1,'shares': 50},
  {'name': 'IBM', 'price': 70.44,'shares': 100},
  {'name': 'MSFT', 'price': 51.23,'shares': 200},
  {'name': 'MSFT', 'price': 65.1,'shares': 50}
]

回调函数

在上述示例中,键函数就是回调函数的一个例子。sort() 方法 “回调” 到你提供的一个函数。回调函数通常是仅用于该单一操作的简短单行函数。程序员经常寻求一种捷径来指定这种额外的处理。

Lambda:匿名函数

使用 lambda 表达式来代替创建函数。在我们之前的排序示例中:

portfolio.sort(key=lambda s: s['name'])

这创建了一个 未命名 的函数,该函数计算 单个 表达式。上述代码比初始代码短得多。

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

## 与 lambda 对比
portfolio.sort(key=lambda s: s['name'])

使用 lambda

  • lambda 受到很大限制。
  • 只允许单个表达式。
  • 不允许使用 ifwhile 等语句。
  • 最常见的用途是与 sort() 等函数一起使用。

读取一些股票投资组合数据并将其转换为列表:

>>> import report
>>> portfolio = list(report.read_portfolio('portfolio.csv'))
>>> for s in portfolio:
        print(s)

Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>

练习7.5:按字段排序

尝试以下语句,这些语句按股票名称对投资组合数据进行字母排序。

>>> def stock_name(s):
       return s.name

>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
           print(s)

... 检查结果...
>>>

在这部分中,stock_name() 函数从 portfolio 列表中的单个条目中提取股票名称。sort() 使用此函数的结果进行比较。

练习7.6:使用lambda按字段排序

尝试使用 lambda 表达式按股票数量对投资组合进行排序:

>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
        print(s)

... 检查结果...
>>>

尝试按每只股票的价格对投资组合进行排序

>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
        print(s)

... 检查结果...
>>>

注意:lambda 是一个有用的捷径,因为它允许你直接在对 sort() 的调用中定义一个特殊的处理函数,而不必先定义一个单独的函数。

总结

恭喜你!你已经完成了匿名函数和Lambda实验。你可以在LabEx中练习更多实验来提升你的技能。