1.理論知識:什麼是生成器?
生成器的本質就是迭代器。生成器和迭代器也有不同,唯一的不同就是:迭代器都是python給你提供的已經寫好的工具或者通過資料轉化得來的,(比如檔案控制代碼,iter([1,2,3])。生成器是需要我們自己用python**構建的工具。最大的區別也就如此了。
2.生成器的構建方式?
在python中有三種方式來建立生成器:
1. 通過生成器函式
2. 通過生成器推導式
3. python內建函式或者模組提供(其實1,3兩種本質上差不多,都是通過函式的形式生成,只不過1是自己寫的生成器函式,3是python提供的生成器函式而已)
2.1)通過生成器函式構建生成器
#普通函式
deffunc():print(11)return 22ret=func()print(ret)#將函式中return換成yield,這樣func就不是函式了。而是乙個生成器函式
deffunc():print(11)yield 22ret=func()print(ret)
執行結果:
#普通函式執行結果
#生成器函式執行結果
由於函式中存在yield,那麼這個函式就是乙個生成器函式.在執行這個函式的時候.就不再是函式的執行了.而是獲取這個生成器物件
2.2)生成器函式如何取值
生成器的本質就是迭代器.迭代器如何取值,生成器就如何取值。所以我們可以直接執行next()來執行以下生成器
deffunc():print(『111『)yield 222
genner=func()# 這個時候函式不會執?. ?是獲取到?成器
ret=genner.__next__()print(ret)# 這個時候函式才會執?
執行結果:111
deffunc():print("111")yield 222
print("333")yield 444gener=func()
ret= gener.__next__()print(ret)
ret2= gener.__next__()print(ret2)#ret3 = gener.__next__()#最後?個yield執?完畢. 再次__next__()程式報錯#print(ret3)
執行結果:111
444process finished with exit code 0
當程式執行完最後乙個yield,那麼後面繼續執行next()程式會報錯,乙個yield對應乙個next,next超過yield數量,就會報錯,與迭代器一樣。
yield與return的區別:
return一般在函式中只設定乙個,他的作用是終止函式,並且給函式的執行者返回值。
yield在生成器函式中可設定多個,他並不會終止函式,next會獲取對應yield生成的元素。
#return
defeat():
lst=for i in range(1,10000):
e=eat()print(e)
#yielddefeat():for i in range(1,10000):yield 『包子『+str(i)
e=eat()for i in range(200):
a=next(e)print(a)for i in range(300):
b=next(e)print(b)
執行結果:
return生成列表
yield生成的是值,而且還可以保留上次的位置。暫用空間更小
python建立目錄函式 如何測試建立目錄的函式?
這裡的乙個好實踐是學習如何使用mock或這樣的測試框架 此外,您應該使用python的unittest框架。在 你在這裡的目標不一定要確保某個東西被創造出來,而是要讓它被呼叫。因此,您需要做的是模擬外部呼叫,以幫助測試方法的正確流。所以在這種情況下,你應該模仿exists和makedirs。然後確保...
使用virtualenv建立獨立的Python環境
virtualenv是 python的沙盒環境,主要解決以下問題 yum groupinstall development tools yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel read...
怎樣學好python 零基礎如何學好Python?
零基礎如何學好python?其實零基礎學好python很簡單,python高階需要花費寫氣力,都說python簡單易學,那麼零基礎如何學好python?有哪些必須學的知識?學習的策略技巧有哪些?看傳智播客怎麼說 python上手很容易,基本有其他語言程式設計經驗的人可以在1週內學會python最基本...