如果按這種形式寫 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]