python中的生成器
阿新 • • 發佈:2019-02-19
# 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)