1. 程式人生 > >python中的生成器

python中的生成器

# Author Richard_Kong
# !/usr/bin/env python
# --*-- encoding:utf-8 --*--
"""
生成器:只有在呼叫的時候才會生成相應的資料
如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢,這樣就不必建立
完整的list從而節省大量的記憶體空間,在python中,這樣一邊迴圈一邊計算的機制叫生成器:generator

"""
b = [i*2 for i in range(10)] #這是一個列表
print(b)

g = (i*2 for i in range(10)) #這是一個生成器 就是把list的中括號變為小括號
print(g) #列印的是一個記憶體地址
"""
生成器 只記住當前位置,沒有previous 只有next 只能一個一個的走
但是 我們建立了生成器generator後,一般不會用next()方法來呼叫元素,而是用for迴圈,而且也不用
考慮stopIteration的異常

"""
print(g.__next__())
print(g.__next__())
for n in g:
    print(n)
"""
用函式做一個生成器:
非波拉且函式
"""
def fib(max):
    """
    yield:關鍵字的作用
    yield關鍵字語句掛起該函式,並向呼叫者傳送回一個值,
    但是保留足夠的狀態以使得函式能夠從它離開的地方繼續
    :param max:
    :return:
    """
    n,a,b =0,0,1
    while n<max:
        # print(b) # 想把函式變為生成器,就在輸出的變數前加yield即可
        """
        如果一個函式定義中包含yield關鍵字,那麼次函式就不再是普通的函式,而是一個生成器
        """
        print("fib 函式 yield關鍵字執行之前")
        yield b # 呼叫next函式 就會執行到yield這裡,傳送給呼叫者一個值
        print("fib 函式 yield關鍵字執行後")
        a,b =b,a+b
        n +=1

print("feibolaqie hanshu")
f = fib(10)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print("可以乾點別的事兒")
print("再回來",f.__next__())
for n in f:
    print("in for xunhuan")
    print(n)