python筆記 生成器
好記性不如爛筆頭,學習從摘抄開始!
1.通過列表生成式(列表推導式),我們可以直接建立乙個 列表。但是,受到記憶體限制,列表容量肯定是有限的。格式:與列表推導式類似,將換成了()2.建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,
3.如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費。
4.如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?
5.這樣就不必建立完整的list,從而節省大量的空間。
6.在python中, 這種邊迴圈一邊j計算的機制,稱為生成器: generator.
=(
《表示式》
for《變數》
in《舊列表》
)=(《表示式》
for《變數》
in《舊列表》
if《條件》
)=(《表示式1
>
if《條件》
else
《表示式2
>
for《變數》
in《舊列表》
)
注意:當生成的元素超出預設個數時,會丟擲異常
例子:name.next() 一次生成乙個元素
g =
(i *
3for i in
range(30
))print
(type
(g))
ans = g.__next__(
)print
(ans)
ans = g.__next__(
)print
(ans)
ans = g.__next__(
)print
(ans)
結果:
<
class
'generator'
>03
6
只要函式**現關鍵字yield,說明函式變成了生成器
步驟:
1.定義乙個函式,函式中使用關鍵字yield例子1:g.next() 和 next() 一次生成乙個元素2.呼叫函式,接收呼叫的結果
3.得到的結果就是生成器
4.借助 next(《生成器name>) 《生成器name>.next()得到元素
def
func()
: n =
0while
true
: n = n +
1yield n # yield 相當於return+暫停
print
('第{}測試:'
.format
(n), n)
g = func(
)print
(type
(g))
ans = g.__next__(
)print
('接收到的返回值:'
, ans)
ans = g.__next__(
)print
('接收到的返回值:'
, ans)
ans =
next
(g)print
('接收到的返回值:'
, ans)
ans =
next
(g)print
('接收到的返回值:'
, ans)
結果:
<
class
'generator'
>
接收到的返回值:
1第1測試: 1
接收到的返回值:
2第2測試: 2
接收到的返回值:
3第3測試: 3
接收到的返回值:
4
例子2:name.send() 一次生成乙個元素的同時並傳入生成器乙個引數
第一次呼叫.send(),必須傳入none,
def
func()
: n =
0while
true
: n = n +
1 temp =
yield n # yield 相當於return+暫停 將 n 返回,並接受到的引數賦值給temp
print
('第{}測試:'
.format
(n), temp)
g = func(
)print
(type
(g))
# 第一次呼叫.send(),必須傳入none
ans = g.send(
none
)print
('接收到的返回值'
, ans)
# 第二次呼叫 可以傳入其他引數,先執行yield後面的語句,在迴圈執行到yield
ans = g.send(
"hello"
)print
('接收到的返回值'
, ans)
# 第三次呼叫 可以傳入其他引數,先執行yield後面的語句,在迴圈執行到yield
ans = g.send(
"world"
)print
('接收到的返回值'
, ans)
結果:
<
class
'generator'
>
接收到的返回值 1
第1測試: hello
接收到的返回值 2
第2測試: world
接收到的返回值 3
例子:通過生成器控制兩個任務交替進行
def
task1()
: n=
0while
true
: n=n+
1print
('任務1第{}次執行'
.format
(n))
yield
none
deftask2()
: n =
0while
true
: n = n +
1print
('任務2第{}次執行'
.format
(n))
yield
none
g1 = task1(
)g2 = task2(
)g1.__next__(
)g2.__next__(
)g1.__next__(
)g2.__next__(
)g1.__next__(
)g2.__next__(
)
結果:
任務1第1次執行
任務2第1次執行
任務1第2次執行
任務2第2次執行
任務1第3次執行
任務2第3次執行
Python筆記 生成器
日期 20170925 python中有乙個很有趣的東東,叫生成器。我們先來看看簡單的 1,usr bin python3 defmygenerator for n in range 1,4 yield n return done print mygenerator print num mygene...
python生成器筆記
生成器 自動實現了迭代器協議 物件必須提供乙個next方法,執行改方法要麼返回迭代中的下一項,要麼就引起乙個stopiteration的異常,以終止迭代 只能往後走不能往前進 第一種形式 idter i for i in range 10 idter為乙個生成器,有next 方法,idter.nex...
Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...