迭代器和生成器
1、迭代器
迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。
迭代器只能往前不會后退,不過這也沒什么,因為人們很少在迭代途中往后退。
另外,迭代器的一大優(yōu)點是不要求事先準(zhǔn)備好整個迭代過程中所有的元素。
迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。
這個特點使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個G的文件
特點:
訪問者不需要關(guān)心迭代器內(nèi)部的結(jié)構(gòu),僅需通過next()方法不斷去取下一個內(nèi)容
不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問
訪問到一半時不能往回退
便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存
示例:
with open('85.53.history') as f:
try:
while True:
line = next(f)
print(line,end='')
except StopIteration:
print(" Is Down")
# python封裝好的迭代器方式讀取文件
# for line in f:
# print(line)
a = [1,2,3,43,432,423,2342,3,34,23423,4234,32,423,42,34,234,234,23423,4]
b = iter(a)
print(b.__next__())
print(b.__next__())
print(b.__next__())
print(b.__next__())
print(b.__next__())
結(jié)果:
1
2
3
43
432
2、生成器
一個函數(shù)調(diào)用時返回一個迭代器,那這個函數(shù)就叫做生成器(generator);如果函數(shù)中包含yield語法,那這個函數(shù)就會變成生成器;
def get_nu(number):
while number > 0:
number -= 1
yield 1
print("put %d" % number)
x = get_nu(4)
for i in range(5):
print(x.__next__())
'''
def get_nu(number):
while number > 0:
number -= 1
ok = yield
print("put %d" % ok)
x = get_nu(40)
x.send(None)
for i in range(10):
x.send(i)
'''
應(yīng)用
最經(jīng)典的例子,生成無限序列。
常規(guī)的解決方法是,生成一個滿足要求的很大的列表,這個列表需要保存在內(nèi)存中,很明顯內(nèi)存限制了這個問題。
def get_primes(start):
for element in magical_infinite_range(start):
if is_prime(element):
return element
如果使用生成器就不需要返回整個列表,每次都只是返回一個數(shù)據(jù),避免了內(nèi)存的限制問題。
def get_primes(number):
while True:
if is_prime(number):
yield number
number += 1