翻譯:《實用的Python編程》07_02_Anonymous_function
目錄 | 上一節 (7.1可變參數) | 下一節 (7.3 返回函數)
7.2 匿名函數和 Lambda
再探列表排序
列表可以使用 sort 方法進行原地(in-place)排序:
s = [10,1,7,3]
s.sort() # s = [1,3,7,10]
也可以進行降序排序(譯注:原文使用的是 sort in reverse order,很多時候翻譯為倒序排序或者反向排序,個人認為容易引起歧義,故翻譯為降序排序):
s = [10,1,7,3]
s.sort(reverse=True) # s = [10,7,3,1]
對單個列表排序似乎非常簡單,但是,如果對字典列表排序,那么我們怎么做呢?
[{'name': 'AA', 'price': 32.2, 'shares': 100},
{'name': 'IBM', 'price': 91.1, 'shares': 50},
{'name': 'CAT', 'price': 83.44, 'shares': 150},
{'name': 'MSFT', 'price': 51.23, 'shares': 200},
{'name': 'GE', 'price': 40.37, 'shares': 95},
{'name': 'MSFT', 'price': 65.1, 'shares': 50},
{'name': 'IBM', 'price': 70.44, 'shares': 100}]
通過什么樣的規則進行排序呢?
你可以使用鍵函數(key function)指導排序。鍵函數是這樣的一種函數:接受一個字典并且返回一個用于排序的值。
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
排序結果如下:
# Check how the dictionaries are sorted by the `name` key
[
{'name': 'AA', 'price': 32.2, 'shares': 100},
{'name': 'CAT', 'price': 83.44, 'shares': 150},
{'name': 'GE', 'price': 40.37, 'shares': 95},
{'name': 'IBM', 'price': 91.1, 'shares': 50},
{'name': 'IBM', 'price': 70.44, 'shares': 100},
{'name': 'MSFT', 'price': 51.23, 'shares': 200},
{'name': 'MSFT', 'price': 65.1, 'shares': 50}
]
回調函數
在上面的示例中,鍵函數是一個回調函數(callback function)。sort() 方法調用了 stock_name()函數,然后 stock_name() 函數返回一個值給 sort() 方法。通常,回調函數是一個簡短的單行函數,只用于一個操作。程序員經常會要求提供一種快捷方法來指定這種額外的處理。
Lambda: 匿名函數
在之前的排序示例中,我們可以使用 lambda, 而不是創建(具名)函數。
portfolio.sort(key=lambda s: s['name'])
上面的代碼創建了一個匿名(unnamed)函數用來計算單個表達式,比初始代碼短很多。
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
# vs lambda
portfolio.sort(key=lambda s: s['name'])
使用 lambda
- lambda 是受到嚴格限制的。
- 只允許一個表達式。
- 沒有
if,while之類的語句。 - 多和其它函數一起使用,類似于
sort()方法。
練習
讀取股票投資組合數據,并將數據轉換為列表:
>>> import report
>>> portfolio = list(report.read_portfolio('Data/portfolio.csv'))
>>> for s in portfolio:
print(s)
Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>
練習 7.5:對字段進行排序
請嘗試下面的語句,這些語句按股票名稱的字母順序對投資組合數據進行排序。
>>> def stock_name(s):
return s.name
>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
在此部分,stock_name() 函數從 portfolio 列表的單個條目中提取股票名稱。sort() 方法使用 stock_name() 函數的返回值進行比較并排序。
練習 7.6:使用 lambda 對字段進行排序
請嘗試使用 lambda 表達式,按股份數目對投資組合數據進行排序:
>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
嘗試按每只股票的價格對投資組合數據進行排序:
>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
注意事項:lambda 是一種非常有用的快捷方式,因為它讓你直接在 sort() 方法的調用中定義一個特殊的處理函數,而不必事先定義一個單獨的函數。
浙公網安備 33010602011771號