2011-12-05 37 views
8

Python中内置函数maxmin的文档指示参数key应该像在sort函数中那样操作。换句话说,我应该能够做到这一点:Python内置最大/最小功能的默认键

a = [1, 2, 3, 4] 
max(a, key=None) 

然而,这引发了一个错误: TypeError: 'NoneType' object is not callable

但是,如果我做的sort功能类似的东西,我得到预期的结果:

a = [1, 2, 3, 4] 
a.sort(key=None) 

没有生成错误并且使用默认排序。有几本书也意味着我应该能够在maxmin函数中脱离相同的行为。请参阅Python in a Nutshell的摘录。

这真的是maxmin函数的默认行为吗?它应该是?它们不应该与排序功能相匹配吗?

回答

23

您已经偶然发现了.sortmax的实现差异,而不是该语言的问题。

list.sort()需要一个关键字参数“key”,它恰好默认为None。这意味着排序方法无法区分提供key=None参数或仅采用默认值。无论哪种情况,它的行为就好像没有提供关键功能。

max另一方面正在检查是否存在关键字参数“key”。它没有默认值,并且它的值被用作关键函数(如果存在的话)。

无论哪种方式,密钥永远不应该提供为无。它应该是一个函数,用于从列表/可迭代项中提取“关键”值。例如:

a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)] 
a.sort(key=lambda item:item[1]) 
+0

感谢您的答复。我知道这些功能的实际实现是不同的,但我有些沮丧,我能找到的所有文档都没有明确区分这些差异。 –

+0

没问题。如果这回答你的问题,接受它总是赞赏。 –

+1

“key”是一个非常可怕的名字... – OlivierBlanvillain

7

@David的答案是完美的。只需添加,如果你想知道,默认key值(无论是在sortmax/min功能)是一样的东西:

lambda x: x 
+1

但是,sort处理将默认值传递为None,而min/max则不会。所以,有些东西的实施方式不同。如果您查看代码,min和max函数只需检查是否已在参数字典中定义。我不相信max/min键参数有一个默认值,只是默认行为。 –