python關於type()與生成器generator的用法


如果按這種形式寫  type(a)(b)
那此處的b是個可迭代對象,這個對象迭代完成后,再放到type里 
 
from pymysql._compat import range_type, text_type, PY2

def _ensure_bytes(x, encoding=None):
    if isinstance(x, text_type):
        x = x.encode()   #將str轉化成byte

    elif isinstance(x, (tuple, list)):
        # x = (_ensure_bytes(v, encoding=encoding) for v in x)   #不加type,返回的是一個生成器< generator object <genexpr> at 0x104feab40>,所以遇到return不會終止,會繼續運行;
        x = type(x)(_ensure_bytes(v, encoding=encoding) for v in x) #加type,將返回的是生成器generator,因為沒有yield,所以就算遇到return也會繼續運行完成,完成后把生成器再轉換成列表,打印結果[1,'2',9]
        # x = type(b)(_ensure_bytes(v, encoding=encoding) for v in x)  #除了可以轉換成列表還可以轉換成字典,打印結果(1, b'2', 9)
    return x


a = [1,'2',9]
# b = ()
print(_ensure_bytes(a))
print(type(a))

 參考文章鏈接:https://blog.csdn.net/qi1840439776/article/details/78417656

 

 

生成器與函數的區別:

這里,最難理解的就是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

 

簡單生成器:

要創建一個generator,有很多種方法。第一種方法很簡單,只要把一個列表生成式的[]改成(),就創建了一個generator:

帶yield 語句的生成器:

仔細觀察,可以看出,fib函數實際上是定義了斐波拉契數列的推算規則,可以從第一個元素開始,推算出后續任意的元素,這種邏輯其實非常類似generator。

也就是說,上面的函數和generator僅一步之遙。要把fib函數變成generator,只需要把print b改為yield b就可以了:

加強的生成器:

在 python2.5 中,一些加強特性加入到生成器中,所以除了 next()來獲得下個生成的值,用戶可以將值回送給生成器[send()],在生成器中拋出異常,以及要求生成器退出[close()]

 

 

再舉例:

a1 = [1,'2',9]

c = (i for i in a1)  #括號里面是生成器,存儲的是算法
print(c)   #打印結果:<generator object <genexpr> at 0x0301A7B0>

d = list(i for i in a1)
print(list)  #打印結果<class 'list'>
print(d)   #打印結果:[1, '2', 9]

e = type(a1)(i for i in a1)  #將生成器轉化為list
print(type(a1))  #打印結果<class 'list'>
print(e)   #打印結果:[1, '2', 9]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM