当 Iterable 中只有一项时,为什么 `min()` 会调用关键函数?

问题描述 投票:0回答:1

似乎Python内置函数

min()
调用 指定的按键功能,即使只剩下一项:

foo = ['2']
def key_func(value):
    print("Key function called")
    return int(value)
print(min(foo, key=key_func))

给出:

Key function called
2

同样的观察也适用于

max()
sorted()

为什么

len(iterable) == 1
没有快捷方式? 想象一下当
key_func
进行昂贵的计算时的情况 那就没有用了。

我阅读了 Python 文档,但没有找到对此行为的解释,但我认为一定有一个解释,因为众所周知,Python 核心开发团队在定义和证明语言和标准库的行为时非常严格。

python sorting
1个回答
0
投票

您必须选择其中之一,不能同时拥有:

  • 保证每个项目
    key
    始终按照可迭代中项目的原始顺序被调用一次;
  • 避免对仅包含一项的可迭代项调用
    key

这两个约定中的一个优于另一个并不明显,调用

min
sorted
并关心第二个约定的程序员可以在自己的代码中添加一个规定来实现这一效果,并且当可迭代对象只有一项时,根本不调用
sorted

请注意,某些可迭代对象没有长度,因此在调用

key
之前检查它们是否有一个或多个项目的唯一方法是获取第一项,尝试获取第二项,并且仅当尝试获取第二个项目时未引发
StopIteration
,然后对第一个项目调用
key

© www.soinside.com 2019 - 2024. All rights reserved.