Python生成器,迭代器,裝飾器

2021-09-10 17:41:47 字數 3058 閱讀 8047

使用了yield函式就被稱之為生成器,生成器是乙個返回迭代器的函式,說白了生成器就是迭代器,只能用於迭代操作

不懂,沒關係,下面就乙個斐波那契數列為例來進行講解:

a,b =0,

1while a<

100:

a,b = b,a+b

print

(a)

import sys

deffibonacci

(n):

#生成迭代器函式

a,b,count =0,

1,0while

true:if

(count > n)

:return n

yield a #使用生成器(迭代器,當程式遇到yield函式時,會暫停並儲存當前所有的資訊——

# 並返回yield的值,然後程式執行到next()函式時,並從當前位置繼續執行

a,b = b,a+b

count = count +

1f = fibonacci(10)

#f是乙個迭代器,由生成器生成,10為遞迴結束的訊號

while

true

:try

:print

(next

(f),end=

" ")

except

: sys.exit(

)

迭代是python眾多強大的功能之一,它是訪問集合元素的一種方式,它是可以記住遍歷物件的位置,這點和for迴圈中enumerate關鍵字有點相似,不過enumerate其實是記住陣列,元組,列表等等下標的乙個函式。但是迭代器會從集合中的第乙個元素開始訪問,一直到最後乙個元素,迭代器只能往前不會後退。

迭代器有兩種方法:

同理,也可以使用next() 函式

前面講了生成器,迭代器怎麼又來了個裝飾器 ,裝飾器的功能還是很強大的,它能夠不改變函式本地的結構,卻可以給函式增加額外的功能,下面就以例項來講解

def

sayhi()

:print

("hi,man"

)#sayhi() #這是函式呼叫的方法

#還有另一種輸出的方法

現在我們希望可以在「sayhi」函式之前輸入一句話,這種在**執行期間動態增加功能的方式,稱之為裝飾器,下面我們就改改上面這個**:

這樣的效果看起來不是很好,我們每次都要加個功能都要使用

x = sayhello(sayhi)

s()

對於這種情況,python提供了語法糖—— 「@」,這樣我們就可以輕鬆的輸出我們想要的語句

在上面的**中,我們定義了乙個sayhello(func)函式,sayhello接受引數func,裡面又內嵌乙個 inner()函式,然後輸出(「hello,i am gorit」,之後返回 func 引數,(也就是我們要傳入的引數),然後再返回inner函式,然後我們發現這就是乙個封閉的函式,也稱為閉包函式

然後我們再sayhi()之前加入 @sayhello, 其目的使程式執行到這裡會呼叫裝飾器函式"sayhello",並把被裝飾的函式"sayhi"作為引數傳入,此時"sayhi"是指向sayhello.inner 的位址,然後再呼叫sayhi時,實則是呼叫sayhello.inner

Python生成器 迭代器 裝飾器

python生成器 迭代器 裝飾器 最簡單的生成器 g x x for x in range 10 for i in g print i函式方法實現稍複雜的生成器 def fib max n,a,b 0,1,1 while nyield b a,b b,a b n 1 for n in fib 6 ...

python 裝飾器,生成器,迭代器

示例1 無參無返回值 def shuai func 示例2 帶參函式的裝飾器 帶參函式的裝飾器 示例3 帶參有返回值的裝飾器 def zhuangshiqi func 資料量非常小,記憶體占用不大 l i for i in range 10 資料量特別大時,會造成記憶體占用突然增大 l2 i for...

Python裝飾器,迭代器,生成器

1.python裝飾器 由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。所有函式都有乙個 name 屬性,這樣我們就可以那到函式名。現在,假設我們要增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功...