簡述python三神器 裝飾器 迭代器 生成器

2021-10-07 18:06:41 字數 3606 閱讀 1683

在不修改函式的情況下,給函式新增新的功能。

閉包:區域性函式的內部函式裡,對區域性函式的變數進行引用,那麼內部函式認為是閉包(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...