前Volition社群經理Mike Watson去世 曾帶病製作補丁
阿新 • • 發佈:2021-08-26
迭代器
- 迭代是訪問集合元素的一種方式;
- 迭代器是一個可以記住遍歷位置的物件;
- 迭代器物件從集合的第一個元素開始訪問,直到所有元素被訪問完結束;
- 迭代器只能往前而不會往後;
- 可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
所以生成器就是一個迭代器(Iterator),那麼列表、字典等是不是迭代器呢?不是,它們是可迭代物件。
可迭代物件:
- 生成器;
- 字串、元組、列表、集合、字典。
如何判斷一個物件是可迭代的:
from typing import Iterable res = isinstance('bigllxx', Iterable) print(res)
如何判斷一個物件是迭代器:
from typing import Iterator
res = isinstance('bigllxx', Iterator)
print(res)
如何將可迭代物件變為迭代器:
list_1 = [1, 2, 3, 4, 5]
list_1 = iter(list_1) # iter()系統函式,將可迭代物件轉為迭代器
生成器
受到機器記憶體限制,一個列表的記憶體有限,假如一個列表有10億條資料,但是我們每次呼叫時用的都是前幾條,那麼其他的記憶體空間都被浪費了,這時我們引入一個生成器,生成器的列表資料是按照某種規律實時生成的。
得到生成器的方式:
# 我們想要得到一個[0,3,6,9,12,...,30000]的列表 # 方式1:列表推導式 g = (i*3 for i in range(10 ** 4)) # 通過列表推導式,[]換成(),就是一個生成器(generator) next(g) # 也可g.__next()__,向下讀取一個生成器元素 # 方式2:函式 yield關鍵字 def gen(): n = 0 while n < 30: n += 1 yield n # 只要函式中存在yield,該函式就是一個生成器,返回值就是yield後的元素 return '沒有更多元素' # 當生成器元素用盡時,會把return的東西報錯出來 g = gen() next(g)
斐波那契數列
def fib(length):
a, b = 0, 1
n = 0
while n < length:
yield a # yield 返回a並暫停
a, b = b, a + b
n += 1
return '沒有更多元素'
g = fib(10)
print(next(g))
生成器與迭代器的關係:迭代器包含生成器,所以生成器肯定是迭代器,但是可迭代物件通過iter()函式也可轉為迭代器,所以迭代器不一定是生成器。