Python實用技法第18篇:同時對數據作轉換和換算

上一篇文章: Python實用技法第17篇:將名稱映射到序列的元素中
下一篇文章: Python實用技法第19篇:將多個映射合併爲單個映射

一、需求🙀

咱們須要調用一個換算函數(例如sum()、min()、max()),但首先得對數據作轉換或者篩選

二、解決方案😸

有一種很是優雅地方案可以將數據換算和轉換結合在一塊兒:在函數參數中使用生成器表達式。segmentfault

實例1:計算平方和:

nums=[1,2,3]
s=sum(x*x for x in nums)
print(s)

結果:數據結構

14

實例2:判斷指定目錄是否存在.py文件

import os
filename=os.path.dirname(os.path.abspath(__file__))
files1=os.listdir(filename+"/image")
files2=os.listdir(filename)
#any表示該iterable只要存在一個知足條件的,就返回True,不然才返回False
if any(name.endswith('.py') for name in files1):
    print('存在py文件')
else:
    print('不存在py文件')



#any表示該iterable只要存在一個知足條件的,歐返回True,不然才返回False
if any(name.endswith('.py') for name in files2):
    print('存在py文件')
else:
    print('不存在py文件')

運行結果:函數

不存在py文件
存在py文件

實例3:根據字典某個key取最小值

marks=[
    {'age':18,'money':100},
    {'age':19,'money':500},
    {'age':17,'money':900},
    {'age':20,'money':1000},
]
min_mark=min(m['age'] for m in marks)
print(min_mark)

結果:spa

17

三、分析😈

這種解決方案展現了當把生成器表達式做爲函數的單獨參數時在語法上的一些微妙之處(即:沒必要重複使用符號)。例以下面兩行代碼表示的是同一個意思:code

s=sum((x*x for x in nums))
s=sum(x*x for x in nums)

比起首先建立一個臨時例表,使用生成器作參數一般是更爲高效和優雅地方式。例如,若是不使用生成器表達式,能夠考慮下面方法來計算平法和:內存

nums=[1,2,3]
s=sum([x*x for x in nums])
print(s)

這也能工做,但這引入了一個額外的步驟而且建立了額外的列表。對於小的一個列表。是可有可無,可是若是nums很是巨大,那麼就會建立一個龐大的臨時數據結構,並且只用一次就被丟棄。get

基於生成器的解決方案能夠以迭代的方式轉換數據,所以在內存使用上要高效得多。it

某些特定的換算函數好比:min()和max()均可以接受一個key參數,當可能傾向於使用生成器時會頗有幫助。例如在上面實例【根據字典某個key取最小值】時能夠考慮下面的替代方案:import

min_mark=min(marks,key=lambda m:m['age'])
上一篇文章: Python實用技法第17篇:將名稱映射到序列的元素中
下一篇文章: Python實用技法第19篇:將多個映射合併爲單個映射
相關文章
相關標籤/搜索