python之生成器Generator(詳解)

2021-08-25 08:17:03 字數 3831 閱讀 5677

什麼是生成器

生成器是能夠動態提供資料的物件,生成器物件也是可迭代物件(示例)

生成器有兩種:

生成器函式

生成器表示式

生成器函式的定義:

含有yield語句的函式是生成器函式,此函式被呼叫將會返回乙個生成器物件

yield翻譯為產生(或生成)

yield語句

語法:

yield 表示式

說明:

yield 用於def函式中,目的是將此函式用生成器函式使用

yield 用來生成資料,供迭代器和next(it)函式使用

示例:

def myyield():

print("即將生成2")

yield 2

print("即將生成3")

# return '在生成3之前用return返回' 將會發生異常

yield 3

print("即將生成4")

yield 4

print("即將生成5")

yield 5

print("生成器生成結束")

yield

#for x in myyield():

# print(x)

# 呼叫生成器函式來建立乙個生成器,此生成器能生成 2,3,4,5

gen = myyield()

it = iter(gen) #用生成器拿到對應的迭代器

print(next(it)) #此時生成器函式才開始執行,並遇到yield停止 2

print(next(it)) #訪問迭代器 3

print(next(it)) #4

print(next(it)) #5

print(next(it)) #生成器生成結束

練習:

寫乙個生成器函式myevev(start,stop)用來生成start開始到stop結束(不包含stop)的偶數

def myinterger(n):

i = 0

while i < n:

yield i

i += 1

for x in myinterger(3):

print(x) # 0 1 2

l = [x for x in myinterger(100) if x % 2 == 1]

print('l = ',l)

寫乙個生成器函式myfactorial(n)用來表示數的階稱

def myfactorial(n):

s = 1#用來儲存階乘

for x in range(1,n+1):

s *= x

yield s

l = list(myfactorial(5))

print(l)

語法:

(表示式 for 變數 in 可迭代對下哪個 [if 真值表示式])

作用:

用推導式形式建立乙個新的生成器

說明:

if子句可以省略

示例:

gen = (x**2 for x in range(1,5))

it = iter(gen)

print(next(it))   #1

print(next(it))  

print(next(it))   #9

print(next(it))   #16

print(next(it))   #stopinteration

生成器表示式和列表推導式的區別:

示例:   

#列表推導式

l = [2,3,5,7]

l2 = [x ** 2 + 1 for x in l]

it = iter(l2)

print(next(it)) # 5

l[1] = 30

print(next(it)) # 10

#生成器表示式

l = [2,3,5,7]

gen = (x ** 2 + 1 for x in l)

it = iter(gen)

print(next(it)) #5

l[1] = 30

print(next(it)) #901

生成器表示式是現用現生成,列表推導式是一次生成靜態資料

迭代工具函式:

作用是生成乙個個性化的可迭代物件

函式:

zip(iter1[,iter[....]])返回乙個zip物件,此對像用於生成元組,此元組的每個資料**於引數中的可迭代物件,當最小的可迭代物件不再提供資料時迭代結束

enumerate(iterable[,start])

生成帶索引的列舉物件,返回的迭代型別為索引-鍵值對(index-value)對,預設索引從0開始,也可以用start指定

zip示例:

numbers = [10086,10000,10010,95588]

names = ['中國移動','中國電信','中國聯通','工商銀行']

for t in zip(numbers,names):

print(t)

for no,number,name in zip(range(1,100),numbers,names):

myzip示例:

def myzip(iter1,iter2):

it1 = iter(iter1) #拿到兩個物件的迭代器

it2 = iter(iter2)

while true:

try:

t = (next(it1),next(it2)) #會觸發stopiteration

yield t

except stopiteration:

break

numbers = [10086,10000,10010,95588]

names = ['中國移動','中國電信','中國聯通','工商銀行']

for t in myzip(numbers,names):

print(t)

練習:

寫乙個程式,讀入任意行文字,當輸入空行是結束輸入

列印帶有行號的輸入結果

如:請輸入:abcde《回車》

請輸入:hello《回車》

請輸入:bye《回車》

請輸入:《回車》

輸出如下:

第一行:abcde

第二行:hello

第三行:bye

def get_line():

l =

while true:

s = input("請輸入:")

if s == "":

break

else:

return l

def print_lines(l):

for n in enumerate(l,1):

print('第%d行:%s'%n)

l = get_line()

print(l)

print_lines(l)

python之生成器

使用生成器表示式取代列表解析可以同時節省cpu 和 記憶體 ram 如果你構造乙個列表的目的僅僅是傳遞給別的函式,比如 傳遞給tuple 或者set 用生成器表示式替代吧 def ord map a string for c in a string yield ord c gen ord map u...

python之生成器

先來介紹下迭代器 迭代器即迭代取值的工具 迭代 的意思就是重複的基於上一次的結果取值 迭代器可以不依賴索引取值 取值 取乙個值就會少乙個,取完了,還取值就會報錯 1.什麼是生成器 在函式內但凡出現yield關鍵字,在呼叫函式就不會執行函式內 會返回乙個迭代器物件的值,該值稱之為生成器 強調 生成器的...

Python之生成器

通過列表生成式,我們可以產生列表,但是列表容量肯定有限,如果建立乙個很大的列表元素,要占用大量的記憶體空間,如果我們只要列表前面的元素,則後面的儲存空間大大浪費,這時候我們需要引出python生成器,這樣就必要建立完整的列表,從而大大節省空間,我們稱之為 generator.建立生成器方法一 使用 ...