迭代器 生成器 裝飾器

2022-09-20 02:03:16 字數 2629 閱讀 9701

1、字串也是可以被for迴圈,按理說應該是可迭代物件,但是,字串中並沒有遵循迭代器的協議,即沒有next方法。

不過,字串、列表等,是提供了內部的_iter_()方法,把字串轉化為迭代物件,從而遵循迭代器協議,生成可迭代物件。

2、for與迭代器的實現

實質是集合-->__iter__方法-->集合轉化為迭代器,並返回位址-->__next__方法呼叫內容,遵循迭代器協議,生成可迭代物件。

3、迭代器與字典

預設拿到的迭代的內容是集合的key。

4、next內建函式與迭代器

實質上,內建函式next就是在呼叫 __next__(),next(iter_l) 等價於 iter_l.__next__()

5.、yield

相當於return,但是可以返回多次,得到的就是生成器,自動實現迭代器協議

def test():

yield 1

yield 2

g=test()

print('來自函式',g)

print(g.__next__())

print(g.__next__())

#若再想拿第三個數,會報錯,因為只得到了兩個生成器

6、生成器(也是一種資料型別)

首先請確信,生成器就是一種迭代器。生成器擁有next方法並且行為與迭代器完全相同,這意味著生成器也可以用於python的for迴圈中。另外,對於生成器的特殊語法支援使得編寫乙個生成器比自定義乙個常規的迭代器要簡單不少,所以生成器也是最常用到的特性之一。

7、三元表示式

』true時返回的值『 if 為真時的條件 else false時的條件

例如:『進來』 if name == 'harvey' else 『別進來』

8、列表解析

cattle_list=

for i in range(10):

print(cattle_list)

l = ['牛%s' %i for i in range(10)] #可以兩元

l = ['牛%s' %i for i in range(10) if i >5] #可以改變條件,但不能變成四元表示式,例如不能有else

會生成列表在記憶體中,處理大數時會佔很大記憶體,列表解析和生成器表示式都是簡單的程式設計方式,生成器表示式更節省記憶體。

將中括號換成小括號就是生成器表示式

#省記憶體

niu=('牛%s' %i for i in range(10)) #生成器表示式

print(niu)

print(niu.__next__())

print(niu.__next__())

print(next(niu)) #兩者方法相同

print(next(niu))

print(next(niu))

迭代器協議讓很多內建函式變得更加通用。例如for,reduce,map,filter,sum

裝飾器 = 高階函式 + 函式巢狀 + 閉包

裝飾器原則:1、不在源**上做修改。2、不改變原函式的呼叫方式

高階函式:

1.函式接收的引數是乙個函式名。2.函式的返回值是乙個函式名

滿足上述條件任意乙個,都可稱之為高階函式

函式巢狀:在乙個函式中又定義了乙個新的函式

#要求計算原函式的開始執行到結束的時間

import time

def timer(func): #定義乙個裝飾器的架子

start_time = time.time() #開始計算時間

res = func() #開始執行傳進來的引數,即原函式

stop_time = time.time() #記錄結束時間

print('執行時間是%s' %(stop_time - start_time)) #用結束時間-開始時間

return res

————————————————————————————————————以上是裝飾器—————————————————————————————————————————

#源**

def test():

time.sleep(3)

print('執行完畢')

#若想呼叫裝飾器,步驟為:

def test():

time.sleep(3)

print('執行完畢')

res()

#但res()不是我們源**的呼叫方式,呼叫方式應為test()所以應該是

test = timer(test)

#但是在原函式有多個的情況下無法乙個個賦值,則有了:

@timer #和test = timer(test)等價,放在源**上面

#所以若想呼叫裝飾器,正確應為:@裝飾器函式名

@timer

def test():

time.sleep(3)

print('執行完畢')

return '這是來自原函式的返回值'

test()

裝飾器,生成器,迭代器

裝飾器 import time def show time func def inner x start time time.time func x end time time.time print end time start time return inner show time def add...

迭代器 生成器 裝飾器

1.迭代器 1 定義 同時滿足 iter 方法和next 方法的物件就是迭代器。3 型別 可迭代物件通過iter 轉為迭代器 生成器是一種特殊的迭代器。2.生成器 1 定義 生成器是迭代器的一種,包括含有yield關鍵字函式和生成器表示式。2 用法 所有函式呼叫的引數都是第一次呼叫時保留的,而不是新...

生成器 迭代器 裝飾器

迭代器表面上看是乙個資料流物件或者容器,當使用其中的資料時,每次從資料流中取出乙個資料,直到資料被取完,而且資料不會被重複使用。從 的角度來看,迭代器是實現了迭代器協議方法的物件和類。迭代器協議方法主要是兩個 iter 該方法返回物件本身,它是for語句使用迭代器的要求 next 方法用於返回容器中...