Python中的迭代器和生成器,以及裝飾

2022-07-31 01:03:15 字數 2164 閱讀 9608

一、迭代器

它是乙個帶狀態的物件,他能在你呼叫next()方法的時候返回容器中的下乙個值,任何實現了__iter____next__()方法的物件都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下乙個值,如果容器中沒有更多元素了,則丟擲stopiteration異常,至於它們到底是如何實現的這並不重要。

迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。

(1)迭代器的四大特性

1.跌代集合,字串,有序依次---------即有可迭代物件

2.執行緒不安全的,多執行緒訪問同乙個集合修改報錯。

3.對於無法隨機訪問的資料結構,迭代器是唯一選擇

4.只迭代當前元素,迭代前後均可不存

(2)迭代器的使用

lst = range(2)

it = iter(lst)

print( it)

輸出:print(it.next())   #輸出:0

print(next(it)) #輸出:1

(3) python中in後面自動就會生成迭代器物件

for idx, ele in enumerate(lst):

print idx, ele

二、生成器

生成器其實是一種特殊的迭代器,不過這種迭代器更加優雅。它不需要再像上面的類一樣寫__iter__()__next__()方法了,只需要乙個yiled關鍵字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一種懶載入的模式生成值。

特性:1.推導 +(x+1 for x in lst) =生成器表示式,返回迭代器,外部括號用於引數時可省略

2.或者yield :生成 且 只生成一次,且停止到此

(1)生成器的基本**

def get_0_1_2():

yield 0

yield 1  

yield 2

print( get_0_1_2)

輸出:(2)呼叫生成器函式將返回乙個生成器:

generator = get_0_1_2()

print( generato)

輸出:print(generator.next())  輸出:0

print(generator.next())  輸出:1

print(generator.next())  輸出:2

三、閉包

閉包從表現形式上解釋為:如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包。

#含有內部函式--閉包

def funx(x):

print("開始")

def funy(y):

print("計算")

return x*y

return funy

a=funx(3)#返回的時內部函式funy

b=a(5)

print(b)

輸出:15

funy在funx函式的**塊中定義。我們稱funy是funx的內部函式。

在funy的區域性作用域中可以直接訪問funx區域性作用域中定義的變數。

簡單的說,這種內部函式可以使用外部函式變數的行為,就叫閉包。

四、裝飾器

python將一切視為 objec t的子類,即一切都是物件,因此函式可以像變數一樣被指向和傳遞。

def diguo():

print("地鍋50")

return 50

def doupi(fn):

def jia():

print("豆皮10")

return fn()+10

return jia

def xiang(fnn):

def jia():

print("香菜")

return fnn()+5

return jia

aa=doupi(xiang(diguo))

print(aa())

python中迭代器和生成器

迭代器 迭代器的實質是實現了next 方法的物件,常見的元組 列表 字典都是迭代器。迭代器中重點關注兩種方法 iter 方法 返回迭代器自身。可以通過python內建函式iter 呼叫。next 方法 當next方法被呼叫的時候,迭代器會返回它的下乙個值,如果next方法被呼叫,但迭代器沒有只可以返...

python中迭代器和生成器

1 迭代器 iterator 是乙個實現了迭代器協議的物件,python的一些內建資料型別 列表,陣列,字串,字典等 都可以通過for語句進行迭代,我們也可以自己建立乙個容器,實現了迭代器協議,可以通過for,next方法進行迭代,在迭代的末尾,會引發stopiteration異常。迭代器有兩個基本...

python中迭代器和生成器

這裡的迭代可以指for迴圈,在python中,對於像list,dict和檔案等而言,都可以使用for迴圈,但是它們並不是迭代器,它們屬於可迭代物件。1.1什麼可迭代物件 最簡單的解釋 可以使用for.in.語句進行迴圈的物件,就是可迭代物件 iterable 可以使用isinstance 方法進行判...