W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你需要在數(shù)據(jù)序列上執(zhí)行聚集函數(shù)(比如 sum()
, min()
, max()
),但是首先你需要先轉(zhuǎn)換或者過濾數(shù)據(jù)
一個非常優(yōu)雅的方式去結(jié)合數(shù)據(jù)計算與轉(zhuǎn)換就是使用一個生成器表達(dá)式參數(shù)。比如,如果你想計算平方和,可以像下面這樣做:
nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)
下面是更多的例子:
# Determine if any .py files exist in a directory
import os
files = os.listdir('dirname')
if any(name.endswith('.py') for name in files):
print('There be python!')
else:
print('Sorry, no python.')
# Output a tuple as CSV
s = ('ACME', 50, 123.45)
print(','.join(str(x) for x in s))
# Data reduction across fields of a data structure
portfolio = [
{'name':'GOOG', 'shares': 50},
{'name':'YHOO', 'shares': 75},
{'name':'AOL', 'shares': 20},
{'name':'SCOX', 'shares': 65}
]
min_shares = min(s['shares'] for s in portfolio)
上面的示例向你演示了當(dāng)生成器表達(dá)式作為一個單獨(dú)參數(shù)傳遞給函數(shù)時候的巧妙語法(你并不需要多加一個括號)。比如,下面這些語句是等效的:
s = sum((x * x for x in nums)) # 顯示的傳遞一個生成器表達(dá)式對象
s = sum(x * x for x in nums) # 更加優(yōu)雅的實(shí)現(xiàn)方式,省略了括號
使用一個生成器表達(dá)式作為參數(shù)會比先創(chuàng)建一個臨時列表更加高效和優(yōu)雅。比如,如果你不使用生成器表達(dá)式的話,你可能會考慮使用下面的實(shí)現(xiàn)方式:
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])
這種方式同樣可以達(dá)到想要的效果,但是它會多一個步驟,先創(chuàng)建一個額外的列表。對于小型列表可能沒什么關(guān)系,但是如果元素數(shù)量非常大的時候,它會創(chuàng)建一個巨大的僅僅被使用一次就被丟棄的臨時數(shù)據(jù)結(jié)構(gòu)。而生成器方案會以迭代的方式轉(zhuǎn)換數(shù)據(jù),因此更省內(nèi)存。
在使用一些聚集函數(shù)比如 min()
和 max()
的時候你可能更加傾向于使用生成器版本,它們接受的一個key關(guān)鍵字參數(shù)或許對你很有幫助。比如,在上面的證券例子中,你可能會考慮下面的實(shí)現(xiàn)版本:
# Original: Returns 20
min_shares = min(s['shares'] for s in portfolio)
# Alternative: Returns {'name': 'AOL', 'shares': 20}
min_shares = min(portfolio, key=lambda s: s['shares'])
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: