一、生成器
生成器的本質就是迭代器
生成器一般由生成器函式或者生成器表示式來建立
其實就是手寫的迭代器
def因為函式中存在yield,那麼這個函式就是乙個生成器函式。這個時候我們在想執行函式就不再是執行函式了,而是獲取這個生成器。func():
print("
111"
)
yield 222ret =func()
(ret)
#
deffunc():
print("
111"
)
yield 222gener =func() #這個時候函式不會執行,而是獲取到生成器
ret = gener.__next__
() #這個時候函式才會執行,yield的作用和return一樣也是返回資料
(ret)
#111
#222
defview codefunc():
print("
111"
)
yield 222
print("
333"
)
yield 444gener =func()
ret = gener.__next__
(ret)
ret2 = gener.__next__
(ret2)
ret3 = gener.__next__() #
最後乙個yield執行完畢,再次__next__()程式報錯,也就是說和return無關了
#traceback (most recent call last):
#111
#222
#333
#444
#file "f:/pythonworkspace/day13/day13練習.py", line 52, in
#ret3 = gener.__next__()
#stopiteration
send和__next__()區別:
1.send和next()都是讓生成器想下走一次
2.send可以給上乙個yield的位置傳遞值,不能給最後乙個yield傳送值,在第一次執行生成器**的時候不能使用send(),最後一次也不能使用。
二、生成器函式
和普通函式沒有區別,裡面有yield的函式就是生成器函式
生成器函式在執行的時候。預設不會執行函式體,返回生成器
通過生成器的__next__()分段執行這個函式
send()給上乙個yield傳值,不能在開頭(沒有上乙個yield),最後乙個yield也不可以用send()
三、推導式
用一句話來生成乙個列表
lst = ["語法:[結果 for迴圈 判斷]python
"+str(j) for j in range(1,16)]
print(lst)
四、生成器表示式
生成器表示式和列表推導式的語法基本上是一樣的。只是把替換成()
生成器表示式和列表推導式的區別:
1.列表推導式比較耗記憶體。一次性載入,生成器表示式幾乎不占用記憶體,使用的時候才分配和使用記憶體。
2.得到的值不一樣,列表推導式得到的是乙個列表,生成器表示式獲取的是乙個生成器。
總結:推導式有,列表推導式,字典推導式,集合推導式,沒有元組推導式
**生成器只有在要值得時候才拿值
defadd(a, b):
return a +b
#生成器函式 # 0-3
deftest():
for r_i in range(4):
yield
r_i#
0,1,2,3
g = test() #
獲取生成器
for n in [2, 10]:
g = (add(n, i) for i in
g)print
(list(g))
#[20,21,22,23]
生成器,生成器推導式和列表推導式
python社群,大部分生成器和迭代器是一種 生成器的本質是迭代器 唯一區別 生成器是我們自己用python 構建的資料結構 迭代器都是提供的,或者轉化得來的 生成器函式 生成器表示式 python提供的 yield 乙個next 對應乙個yield yield和下乙個yield中間有 的話只執行乙...
推導式 生成器
1.推導式生成列表 表示式 for item in 可迭代物件 或者 表示式 for item in 可迭代物件 if 條件判斷 推導式生成列表 ls x for x in range 1,5 if x 2 0 2,4 2.生成器生成元組 表示式 for item in 可迭代物件 或者 表示式 f...
生成器 推導式
建立生成器的方法 1.通過生成器函式 yield 2.生成器表示式 def func1 x sum 0 for i in range 1,x x 1 yield xg func1 6 生成器函式對 print g 表示這是乙個迭代器print g.next 乙個next對應乙個yield print...