問題:需要調(diào)用一個(gè)換算(reduction)函數(shù)(例如sum()、min()、max()), 但首先得對(duì)數(shù)據(jù)做轉(zhuǎn)換或篩選
解決方法:在函數(shù)的參數(shù)中使用生成器表達(dá)式
下面給出一些使用示例:
1、求元素的平方
nums = [1, 2, 3, 4, 5]
sum(x*x for x in nums) # 使用生成器表達(dá)式,節(jié)省內(nèi)存
Out[3]: 55
sum([x*x for x in nums]) # 使用列表推導(dǎo)式(適用于數(shù)據(jù)量較小的數(shù)據(jù)結(jié)構(gòu))
Out[4]: 55
2、檢查目錄下是否py文件
import os
files = os.listdir(os.path.dirname(__file__))
if any(name.endswith('.py') for name in files):
print('there is python')
Out: there is python
3、將tuple轉(zhuǎn)換為CSV
s = ('ACME', 20, 123)
','.join(str(x) for x in s)
Out[9]: 'ACME,20,123'
4、求最小的價(jià)格
prices = [
{'name': 'GOOG', 'price': 10},
{'name': 'YHOO', 'price': 50},
{'name': 'GOO', 'price': 30},
{'name': 'GG', 'price': 100}
]
min(p['price'] for p in prices) # 只返回了價(jià)格
Out[13]: 10
min(prices, key=lambda p: p['price']) # 返回了鍵值對(duì)
Out[14]: {'name': 'GOOG', 'price': 10}
總結(jié):
1、在函數(shù)參數(shù)中使用生成器表達(dá)式,可以優(yōu)雅的將數(shù)據(jù)轉(zhuǎn)換和換算結(jié)合在一起;
2、當(dāng)把生成器表達(dá)式作為函數(shù)的單獨(dú)參數(shù)時(shí),可以不必重復(fù)使用括號(hào)(一個(gè)括號(hào)就可以);
3、列表推導(dǎo)式也可以解決上述問題,但是當(dāng)數(shù)據(jù)量非常大時(shí),就會(huì)創(chuàng)建一個(gè)龐大的臨時(shí)數(shù)據(jù)結(jié)構(gòu),而且只是用一次就丟棄;
4、基于生成器的解決方案可以以迭代的方式轉(zhuǎn)換數(shù)據(jù),因此使用上要高效的多;
5、針對(duì)不同的需求,來(lái)選取生成器方案還是lambda表達(dá)式方案。