標籤:lis exp range ble pre 隨筆 for迴圈 使用 迭代器
清單產生器
# 常見的是range()建立一個數位列表>>>[ x*x for x in range(10)][0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 後邊也可以加上判斷語句>>>[ x*x for x in range(10) if x%2 == 0][0, 4, 16, 36, 64]# 字元也可以這麼玩>>> [m + n for m in ‘ABC‘ for n in ‘XYZ‘][‘AX‘, ‘AY‘, ‘AZ‘, ‘BX‘, ‘BY‘, ‘BZ‘, ‘CX‘, ‘CY‘, ‘CZ‘]
產生器
# 產生器就是把清單產生器的[]換成(),或者在函數中使用yield關鍵字>>> L = [x * x for x in range(10)]>>> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]>>> g = (x * x for x in range(10))>>> g<generator object <genexpr> at 0x1022ef630># 取值,可以使用next(),但大多數使用for# 斐波拉契數列def fib(max): n,a,b = 0,0,1 while n < max: #print(b) yield b a,b = b,a+b n += 1 return ‘done‘ # 使用for迴圈列印想返回return值,需要捕獲StopIteration錯誤,傳回值包含在StopIteration的value中:
可以直接作用於for迴圈的資料類型有以下幾種:
一類是集合資料類型,如list、tuple、dict、set、str等;
一類是generator,包括產生器和帶yield的generator function。
這些可以直接作用於for迴圈的對象統稱為可迭代對象:Iterable。
可以被next()函數調用並不斷返回下一個值的對象稱為迭代器:Iterator,它們表示一個惰性計算的序列。
集合資料類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
可以使用isinstance()判斷一個對象是否是Iterable對象
初學python隨筆——清單產生器、產生器和迭代器