首先看看一個列表的類型,,我們通過isinstance() 函數(shù)來判斷一個列表的類型,通過實驗1可以看出其只是一個可迭代的對象,,而不是一個迭代器??梢酝ㄟ^iter() 函數(shù)返回一個其對應的迭代器,。 “生成器表達式(簡稱生成式)”實際上可以理解為“迭代”和“列表解析”的組合,它使用小括號來表示,。在實驗2中,,該生成式既是一個迭代器,又是一個可迭代對象,。但是這個時候生成式是不能直接以列表形式輸出打印的,。 from typing import Iterable, Iterator if __name__ == "__main__": print("====== 案例1 ==========") lst = [1, 4, 8] print(isinstance(lst, Iterable)) # 是否可迭代 True print(isinstance(lst, Iterator)) # 是否迭代器 False print(isinstance(iter(lst), Iterator)) # 轉(zhuǎn)成迭代器 True print("====== 案例2 ==========") lst2 = (x * x for x in range(1, 4)) print(isinstance(lst2, Iterable)) # 是否可迭代 True print(isinstance(lst2, Iterator)) # 是否迭代器 True print(lst2) 輸出: ====== 案例1 ========== True False True ====== 案例2 ========== True True <generator object <genexpr> at 0x00000000029DFB88> 在列表中,我們可以通過 range() 函數(shù)自動生成一個整數(shù)列表,也可以在生成新列表的同時,,對原列表元素再依次進行其它的處理,。在沒有for進行循環(huán)迭代的時候,,我們需要通過list() 函數(shù)將其轉(zhuǎn)換為一個可以輸出的列表。 if __name__ == "__main__": lst = list(range(5)) print(lst) lst = [x+1 for x in [5, 5, 5]] print(lst) lst = [x * x for x in list(range(1, 8)) if x % 2 == 0] print(lst) lst = [x * y for x in range(1, 3) for y in range(10, 15)] print(lst) 輸出: [0, 1, 2, 3, 4] [6, 6, 6] [4, 16, 36] [10, 11, 12, 13, 14, 20, 22, 24, 26, 28] 生成器是一個“機器”,,用來生產(chǎn)零件,,每調(diào)用一次 next() 函數(shù)的時候就生產(chǎn)一個零件,所以,,調(diào)用生成器提前不知道有多少個零件,,只能通過 next() 方法進行不停調(diào)用,直至拋出StopIteration異常為止,。調(diào)用生成器的時候,,碰到 yield 語句就停止本次生產(chǎn)。 from typing import Iterable, Iterator if __name__ == "__main__": print("====== 案例1 ==========") # 用小括號表示的是生成器 lst = (x * x for x in range(5)) # 生成器返回的是一個對象,,而不是列表 print(type(lst)) # 生成器生成的對象,,需要使用迭代(for)的方法查看 for x in lst: print(x) print("====== 案例2 ==========") # 調(diào)用時執(zhí)行到 yield 即停止 def add(x, y, num): for v in range(1, num): t = (x + y) * v # yield 有return 的作用 yield t m = add(1, 1, 5) # 是否“可迭代對象” print(isinstance(m, Iterable)) # 是否是一個“迭代器” print(isinstance(m, Iterator)) # 執(zhí)行到第一次 yield 即停止 print(next(m)) # 從第二次 yield 開始執(zhí)行直到結(jié)束 for x in m: print(x) 輸出: ====== 案例1 ========== <class 'generator'> 0 1 4 9 16 ====== 案例2 ========== True True 2 4 6 8 |
|