1

代码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,并且如果被包括括号它报告错误,但在代码2 key=itemgetter(2),所述括号保留?

回答

1

key参数sorted需要一个函数,其中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 

正如你所看到的,括号()被添加到功能keysorted,把它应用到xy,这是项目thing_to_sort

在第一个示例中,str.lower是应用于每个xy的函数。

itemgetter有点不同。这是一个函数,其中返回另一个函数,在你的例子中,它是,其他函数被应用到xy

你可以看到如何itemgetter作品在控制台:

>>> from operator import itemgetter 
>>> item = ('john', 'A', 15) 
>>> func = itemgetter(2) 
>>> func(item) 
15 

它可以是一个有点难以让你的头围绕“高阶”功能(那些其接受或返回等功能)在第一,但它们对于许多不同的任务非常有用,所以值得对它们进行试验,直到你感觉舒适。

+1

谢谢你对水晶般清晰的解释,比雷埃夫斯! –

-1

与控制台戳了一下周围 str.lower冷藏的方法'下“海峡”对象 和str.lower()是一个函数,str.lower()怎么过需要一个参数,所以正确编写这将是str.lower("OH BOY"),它会返回oh boy错误是因为您没有将任何参数传递给该函数,但它期待着一个。