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錯誤是因爲您沒有將任何參數傳遞給該函數,但它期待着一個。