在不修改函式的情況下,給函式新增新的功能。
閉包:區域性函式的內部函式裡,對區域性函式的變數進行引用,那麼內部函式認為是閉包(closure)
裝飾器(decorator)的本質就是乙個函式,是增強函式或類的功能的乙個函式。裝飾器是乙個實參高階函式也是返回值高階函式。
def
cp(fn)
:def
do_action
(name, age, clock)
:if clock <21:
fn(name, age, clock)
else
:print
('太晚了,不能玩了!'
)return do_action
@cpdef
play_game
(name, game, clock)
:print
(f'再玩會吧!'
)play_game(
'烏曼巴'
,'ball',20
)"""
烏曼巴再玩會吧!ball
"""play_game(
'得分手'
,'王者榮耀',23
)"""
太晚了,不能玩了!
"""
注意:@符號是裝飾器的語法糖
常見的內建裝飾器有三種,@property
、@staticmethod
、@classmethod
語法糖(syntactic sugar):新增的某種語法,這種語法對語言的功能並沒有影響,但是更方便程式設計師使用。語法糖提供了更易讀的編碼方式,可以提高開發效率。
可迭代物件:重寫了__iter__方法就是可迭代物件
迭代器物件:實現了迭代器協議的物件。
# 只要重寫了__iter__方法就是可迭代物件
# 實現了__next__方法。
class
demo
(object):
def__init__
(self, x)
: self.x = x
self.count =
0def
__iter__
(self)
:return self
def__next__
(self)
: self.count +=
1if self.count <= self.x:
return self.count -
1else
:raise stopiteration
d = demo(10)
for i in d:
print
(i)"""01
2345
6789
"""# 呼叫物件方法
# print(d.__iter__().__next__())
"""上面的for迴圈已經該迭代器物件把資料遍歷完了
raise stopiteration stopiteration
"""# 內建函式呼叫
i=iter
(d)print
(next
(i))
"""raise stopiteration stopiteration
"""
生成器就是可迭代物件,自動實現了迭代器協議,也可以這樣說在函式中有yield關鍵字的 就稱為 生成器。
yield關鍵字作用:
next()函式也能讓生成器從斷點處繼續執行,即喚醒生成器(函式)
def
fibonacci
(n):
current =
0 num1 = num2 =
1 num =
1while current < n:
num = num1
num1, num2 = num2, num1 + num2
current +=
1# return
yield num
f1 = fibonacci(12)
print
(f1)
for i in f1:
print
('fibonacc:'
, i)
"""fibonacc: 1
fibonacc: 1
fibonacc: 2
fibonacc: 3
fibonacc: 5
fibonacc: 8
fibonacc: 13
fibonacc: 21
fibonacc: 34
fibonacc: 55
fibonacc: 89
fibonacc: 144
"""
使用send()函式可以在喚醒的同時向斷點處傳入乙個附加資料,但是不能將非none值傳送到剛剛啟動的生成器。(即send()函式值為非none值,則不能第乙個傳入生成器中)
執行到yield時,gen函式作用暫時儲存,返回i的值; temp接收下次c.send(「python」),send傳送過來的值,c.next()等價c.send(none)。
錯誤例項
def
gen():
i =0while i <5:
temp =
yield i
print
(temp)
i +=
1g = gen(
)print
(g)print
(g.send(
'hello'))
# typeerror: can't send non-none value to a just-started generator
正確實列
def
gen():
i =0while i <5:
temp =
yield i
print
(temp)
i +=
1g = gen(
)print
(g)print
(g.send(
none))
"""0
"""
def
gen():
i =0while i <5:
temp =
yield i
print
(temp)
i +=
1g = gen(
)print
(g)print
(next
(g))
print
(g.send(
'烏曼巴'))
"""0
烏曼巴1
"""
python三大神器 裝飾器
裝飾器 decorator 能增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為。本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印購物的decorator,可以定義如下 def inn...
python裝飾器簡述
python作用域是乙個容易掉坑的地方,python 的作用域一共有 4 中,分別是 1.l 區域性作用域 2.e閉包函式,外的函式中 3.g 全域性作用域 4.b 內建作用域 以 l e g b 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會 去全域性找,再者去內...
Python三大神器之 裝飾器
def info print 這是學生資訊 info a info print id a print id info a 展示 4009632 4009632 這是學生資訊def info return 小王 defsuccess print 返回值函式 def printinfo func par...