迭代器協(xié)議意味著對象必須提供下一個next方法。執(zhí)行此方法將返回迭代中的下一個項目,或?qū)е聅toplteration異常終止迭代。而生成器可以理解為一種數(shù)據(jù)類型,它可以自動實現(xiàn)迭代器協(xié)議(其他數(shù)據(jù)類型需要調(diào)用它們自己的內(nèi)置__iter__方法),因此生成器是可迭代的對象。那么到底Python迭代器與生成器要怎么理解?在Python中,使用for... in ...來對list、tuple、set和dict數(shù)據(jù)類型并過濾掉所有數(shù)據(jù)。 如下:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
1、迭代器
對字符串,列表,使用內(nèi)置函數(shù) iter 轉(zhuǎn)化為可迭代對象, 使用next關(guān)鍵字,可迭代對象每次取其中的一個值。如下面代碼:
nums = [1,2,3,4]
nums = iter(nums)
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
輸出
1
2
3
4
如果超出數(shù)據(jù)的長度,將會報錯 StopIteration
nums = [1,2,3,4]
nums = iter(nums)
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums)) # 超過數(shù)據(jù)長度,報錯 StopIteration
2、生成器
使用生成器可以創(chuàng)建迭代器。生成器主要使用 yeild 關(guān)鍵字,每次調(diào)用 next 時會與yeild 定義的對應(yīng)。例如:我們需要取 10~20之間的數(shù)據(jù),步長為2,可以使用如下code
for x in range(10,20,2):
print(x)
但是如果步長設(shè)置為 0.5,如下代碼:
for x in range(10,20,0.5):
print(x)
將會報錯
TypeError: 'float' object cannot be interpreted as an integer
這個時候,我們就可以使用 生成器來自定義一個函數(shù)
def drange(start,stop,step):
x = start
while x< stop:
yield x
x += step
for x in drange(10,20,0.5):
print(x)
再舉一個例子:
給定一個字符串,倒敘排列:
def reverse(data):
for x in range(len(data)-1,-1,-1):
yield data[x]
for x in reverse('gold'):
print(x)
看到這里,相信大家對于Python迭代器與生成器已經(jīng)有了一定的理解。關(guān)于更多關(guān)于Python的干貨內(nèi)容,盡在中培偉業(yè),從零基礎(chǔ)到進(jìn)階提升各個學(xué)習(xí)階段的學(xué)習(xí)內(nèi)容都在等著你。