您好,登錄后才能下訂單哦!
迭代器
迭代器對象要求支持迭代器協(xié)議的對象,在Python中,支持迭代器協(xié)議就是實現(xiàn)對象的__iter__()和next()方法。其中__iter__()方法返回迭代器對象本身;next()方法返回容器的下一個元素,在結(jié)尾時引發(fā)StopIteration異常
可迭代對象
如果給定一個list或tuple,我們可以通過for循環(huán)來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration),默認(rèn)的list、tuple、stri、dict對象都是可以迭代的。
isinstance(object, classinfo) 方法說明
如果參數(shù)object是classinfo的實例,或者object是classinfo類的子類的一個實例, 返回True。如果object不是一個給定類型的的對象, 則返回結(jié)果總是False。
如何判斷對象是否為可迭代對象?
>>> from collections import Iterable
>>> isinstance('abc',Iterable)
True
>>> isinstance([1,2],Iterable)
True
>>> isinstance(123,Iterable)
False
>>> isinstance({'k1':'v1'},Iterable)
True
列表生成式
用來創(chuàng)建list的生成式
如果要生成[1*1,2*2,3*3,4*4…..10*10]這樣的列表該怎么做呢?
傳統(tǒng)做法:
list1 = []
for i in range(1,11):
list1.append(i*i)
print(list1)
使用列表生成式:
list2 = [i*i for i in range(1,11)]
print(list2)
運用列表生成式,可以快速生成list,可以通過一個list推導(dǎo)出另一個list,而代碼卻十分簡潔。
生成器(generator)
如果我們需要一個非常多元素的列表,但是我們只需要訪問前面的幾個元素,如果使用傳統(tǒng)的方法,一次創(chuàng)建完該列表將會占用很大的存儲空間,這時候,我們就需要一種一邊使用,一邊生成元素的機制,這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計算的機制,稱為生成器(Generator)。
創(chuàng)建生成器
第一種簡單辦法,將列表生成式的[]改為()
>>> list2 = (i*i for i in range(1,11))
>>> print(list2,type(list2))
<generator object <genexpr> at 0x000001F4A35AD678> <class 'generator'>
第二種辦法:使用yield
如果一個函數(shù)定義中包含yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù),而是一個generator
生成斐波拉契數(shù)列:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# print(b)
yield b
a, b = b, a + b
n = n + 1
return 'done'
a = fib(20)
print(next(a))
print(next(a))
使用yield后,生成器的執(zhí)行流程:
函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時候執(zhí)行,遇到yield語句返回,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行
generator是非常強大的工具,在Python中,可以簡單地把列表生成式改成generator,也可以通過函數(shù)實現(xiàn)復(fù)雜邏輯的generator。
要理解generator的工作原理,它是在for循環(huán)的過程中不斷計算出下一個元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。對于函數(shù)改成的generator來說,遇到return語句或者執(zhí)行到函數(shù)體最后一行語句,就是結(jié)束generator的指令,for循環(huán)隨之結(jié)束。
生成器和普通函數(shù)調(diào)用返回結(jié)果的區(qū)別?
普通函數(shù)調(diào)用直接返回結(jié)果
生成器調(diào)用實際返回的是一個generator對象
裝飾器
為已經(jīng)實現(xiàn)的功能增加新功能,在不改變源碼已經(jīng)調(diào)用方式的情況下動態(tài)增加功能的方式,稱之為裝飾器(Decorator)
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#裝飾器簡單實現(xiàn)
#原始版本,不帶驗證
defweb():
print('webdata.')
web()
#版本一,帶驗證
#問題:當(dāng)我不執(zhí)行web(),只執(zhí)行賦值的時候就會出現(xiàn)authpass.顯然是不對的
defauth(func):
print('authpass.')
returnfunc
defweb():
print('webdata.')
web=auth(web)
web()
#版本二,待驗證,并且解決上面的調(diào)用問題,使用@調(diào)用裝飾器
defauth(func):
definner():
print('authpass.')
func()
returninner
@auth
defweb():
print('webdata.')
web()
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。