1. 程式人生 > 其它 >生成器,迭代器,閉包,裝飾器

生成器,迭代器,閉包,裝飾器

生成器,迭代器,閉包,裝飾器
一.生成器
生成器會將你要生成的資料儲存起來,等到需要的時候,用一次,執行一次
1.建立生成器的第一種方式:
list = (x for x in range(5))
print(list)→(輸出的是list的地址)
print(next(list))→0
print(next(list))→1
print(next(list))→2
注意:輸出次數一定不要超過迴圈次數,否則會報錯
2.yield方法:
此方法要配合函式使用,只要函式中有yield,那麼這就是一個生成器
例如用迴圈相加舉個例子
def plusnum():
a = 1
b = 1
for i in range(3):
yield b
b += a
num = plusnum()
print(next(num))
print(next(num))
它的輸出為:1
2
它的執行邏輯用下面的程式碼看的更加明瞭
def plusnum():
a = 1
b = 1
print("_1_")
for i in range(3):
print("_2_")
yield b
b += a
print("_3_")
num = plusnum()
print(next(num))
print(next(num))
執行結果為:

 

由此可知,它的邏輯是:
yield b執行後會卡住,不會向下執行,直到下一次呼叫,才會繼續向下執行
在程式碼中就是print(next(num))呼叫輸出1,輸出2,輸出b然後卡住停止,第二次print(next(num))時,
先進行b = a+b的計算然後輸出3,再進入迴圈,輸出2,在輸出b的值
3.send方法:
send通常是伴隨yield使用,他是給(yield 變數) 這個整體賦值
用上面程式碼來執行:
def plusnum():
a = 1
b = 1
for i in range(3):
num = yield b
b += a
num = plusnum()
num.send("啦啦啦啦")
執行發現會報錯,這是因為程式碼從上向下執行,遇見函式避開,那麼首先執行的是num.send("啦啦啦啦")
這是函式還沒呼叫,num這變數空間還沒開創,啦啦啦啦傳送不過去從而導致程式碼崩潰
我們只是需要提前呼叫一下這個生成器即可
def plusnum():
a = 1
b = 1
for i in range(3):
num = yield b
b += a
num = plusnum()
next(plusnum)
num.send("啦啦啦啦")
就可以執行出來,一定要記住send是給yield b這個整體賦值
4.多工處理
def test1():
while True:
print("嗨嗨嗨")
yield None
def test2():
while True:
print("來了哦")
yield None
t1 = test1()→(將test1的方法地址賦值給t1)
t2 = test2()→(將test2的方法地址賦值給t2)
while True:
t1.__next__()
t2.__next__()
這樣就會死迴圈進行兩個任務
二.迭代器
可迭代的: 凡是可以通過for迴圈取值的都是可迭代的
凡是可以被next函式呼叫取值,並且返回下一個值的物件,就是一個迭代器(生成器一定是一個迭代器)
三.閉包
閉包的定義:
在一個函式中,又定義了一個函式,並且裡面的函式使用了,外面的函式的引數,這個整體就是一個閉包
閉包的應用場景:
外面的函式給定了基礎條件,裡面的函式基於原來的基礎之上進行進一步處理
def test1(number):
def test_in():
print(number+100)
return test_in
a = test1(100)
a()
這就是一個閉包,這裡重要的是程式碼的執行邏輯
呼叫外面的函式返回值就是test_in的方法地址也就是裡面的函式並賦值給了a
此時a指向test_in這個方法,再呼叫a就運行了裡面函式的程式碼
用圖片解釋是:

 

閉包的應用:
def w1(func):
def inner():
print("許可權認證中!")
func()
return inner
def f1():
print("f1")
def f2():
print("f2")
f1 = w1(f1)
f1()
f2 = w1(f2)
f2()
看懂這個,閉包基本就掌握了
四.裝飾器
裝飾器可以理解為閉包的升級,讓程式碼更加簡練
def w1(func):
def inner():
print("許可權認證中!")
func()
return inner
@w1
def f1():
print("f1")
@w1
def f2():
print("f2")
f1()
f2()
@一下那個函式就相當於f1 = w1(f1)升級了一下.讓程式碼更加簡潔
理解閉包,修飾器就很好理解了

總之這裡