同時(shí)對(duì)數(shù)據(jù)做轉(zhuǎn)換和換算 --生成器用法

問題:需要調(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á)式方案。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大學(xué),你期待的是什么?
    云不浮閱讀 247評(píng)論 0 1
  • A1:人食五谷,難免會(huì)有喜怒哀樂各種情緒。曾經(jīng)的我也是一個(gè)很容易就暴露自己憤怒情緒的人。小孩犯了錯(cuò),我單獨(dú)教育老婆...
    優(yōu)勇閱讀 248評(píng)論 1 2
  • 想起去年的某一天,我在清理已壞掉的打印機(jī),不小心把油墨弄到一地了。我急忙把裝有油墨的袋子扔到房外的垃圾桶,由于...
    yesiqin閱讀 276評(píng)論 0 3

友情鏈接更多精彩內(nèi)容