迭代器和生成器

迭代器和生成器

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容