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