一、迭代器
它是乙個帶狀態的物件,他能在你呼叫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):輸出:15print("開始")
def funy(y):
print("計算")
return x*y
return funy
a=funx(3)#返回的時內部函式funy
b=a(5)
print(b)
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 方法進行判...