Python中的列表推導式和生成器表達式 (List Comprehension & Generator Expressions)
列表(list)是pthon中最常用的數據結構之一,有序,可變。
1.生成一個列表最原始的方法
def is_leap(year: int):
return year%4 == 0 and (year%100 != 0 or year%400 == 0)
Leap_Year_List = [] #空列表 或者用 Leap_Year_List = list()
for item in range(1582, 2022):
if is_leap(item):
Leap_Year_List.append(item) #通過append方法填充列表元素
2.列表推導式(List Comprehension)
當然,還有其他的方法來生成列表,用列表推導式我們可以將上面的代碼簡化至一行:
Leap_Year_List =[item for item in range(1582, 2022) if is_leap(item)] #通過for循環和if條件生成列表
note1: range()函數本身返回的也是整數列表
note2: 列表推導式里可以用多個for循環,返回的則是笛卡爾積
3.生成器表達式( Generator Expressions)
我們把列表表達式的[]換成()就得到了一個新的返回對象:生成器。
Leap_Year_Generator = (item for item in range(1582, 2022) if is_leap(item)) #得到生成器的這個方法稱之為生成器表達式
所以,推導式和生成器類型不一樣(一個是數據結構,一個是某種函數)導致它們的適用場景有所不同。生成含大量元素的列表會占用極大的內存空間,這種場景下一邊循環一邊計算效率更高。比如計算1到1,000,000,000的平方和,我們并不需要先得到一百萬個元素的列表再求和,可以直接用生成器表達式來求和:
total = sum(num * num for num in range(1, 1000000000))
當列表是我們最終需要的結果時,用列表推導式;當列表只是我們運算的中間過程時,用生成器表達式。
note1: 生成器是一種特殊的迭代器。它的本質是一個能不斷產生值的函數,它的意義在于提供了一種更為節省內存的方式去得到可迭代對象。
note2: 如果一個函數里有yield, 那它就是生成器。
note3: 迭代器是類,里面有數據成員(可迭代對象中的元素),有方法(iteration(),next())
4.拓展
舉個生成器的例子:讀取文本文件獲得版本號
def get_version():
with open("version.txt", "r") as fi:
result = next(it for it in fi if it.startswith("__version__")) #生成器表達式
# txt中內容為 __version__ = "1.0.1"
return result.split('"')[1] #結果為1.0.1
另一個例子:讀取文本文件返回列表
def get_install_list():
with open("sw_list.txt", "r") as fi:
lines = fi.readlines()
#txt中為多行內容
return [line.strip("\n") for line in lines if line] #列表推導式

浙公網安備 33010602011771號