什麼是生成器
生成器是能夠動態提供資料的物件,生成器物件也是可迭代物件(示例)
生成器有兩種:
生成器函式
生成器表示式
生成器函式的定義:
含有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.建立生成器方法一 使用 ...