91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

迭代器/生成器/裝飾器

發布時間:2020-07-11 22:50:21 來源:網絡 閱讀:533 作者:紫劍輝 欄目:開發技術

迭代器

迭代器對象要求支持迭代器協議的對象,在Python中,支持迭代器協議就是實現對象的__iter__()和next()方法。其中__iter__()方法返回迭代器對象本身;next()方法返回容器的下一個元素,在結尾時引發StopIteration異常

 

可迭代對象

如果給定一個list或tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration),默認的listtuplestridict對象都是可以迭代的。

 

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()

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东海县| 吉首市| 靖远县| 蒙阴县| 夏河县| 抚顺县| 临潭县| 响水县| 喀喇| 阳新县| 日土县| 汾阳市| 江阴市| 洪雅县| 河间市| 佳木斯市| 梁河县| 东宁县| 九龙县| 潞城市| 敖汉旗| 天台县| 霍林郭勒市| 辰溪县| 邹平县| 濮阳市| 千阳县| 灵川县| 梁平县| 泸水县| 南充市| 三明市| 平顺县| 浪卡子县| 光泽县| 牙克石市| 龙州县| 河津市| 鹤山市| 阿瓦提县| 嘉鱼县|