代码1:
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
代码2:
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> from operator import itemgetter, attrgetter
>>>
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
为什么在代码1中,()
中省略key=str.lower
,如果包含括号则报告错误,但在key=itemgetter(2)
的代码2中,括号是否保留?
答案 0 :(得分:1)
sorted
的key
参数需要一个函数,sorted
然后应用于要排序的事物的每个项目。在排序过程中,key(item)
的结果会相互比较,而不是每个原始item
。
你可以想象它有点像这样:
def sorted(thing_to_sort, key):
#
# ... lots of complicated stuff ...
#
if key(x) < key(y):
# do something
else:
# do something else
#
# ... lots more complicated stuff ...
#
return result
如您所见,括号()
已添加到 key
内的sorted
函数中,并将其应用于x
和{{ 1}},它们是y
。
在您的第一个示例中,str.lower
是应用于每个thing_to_sort
和x
的函数。
itemgetter
有点不同。这是返回另一个函数的函数,在您的示例中,其他函数将应用于y
和x
。
您可以在控制台中查看y
的工作原理:
itemgetter
一开始可能有点难以理解“高阶”功能(接受或返回其他功能的功能),但它们对于许多不同的任务非常有用,所以值得尝试直到它们为止。你觉得很舒服。
答案 1 :(得分:-1)
稍微调整一下控制台
str.lower
指的是方法&#39;降低&#39; &#39; str&#39;对象
并且str.lower()
是一个函数,但是str.lower()
需要一个参数,所以正确编写它将是str.lower("OH BOY")
并且它将返回oh boy
错误是因为你没有通过该函数的参数,但它期待一个。