接著下雞蛋和吃包子!
(總是把生成器比喻成母雞下雞蛋,需要乙個下乙個,首先是下出來的雞蛋不能塞回
母雞肚子裡,其次是乙個母雞一生只能下一定數量的雞蛋,下完了就死掉了)
#通過程式來理解什麼意思
#程式一:
deftest():
for i in range(2):
yield
it =test()
for i in
t:
(i)t1 =(i for i in
t)print
(list(t1))
#執行結果
01
##程式二:程式分析
#1.程式開始執行以後,因為test函式中有yield關鍵字,所以test函式並不會真的執行,而是先得到乙個生成器t.
#2.for迴圈遍歷生成器t,並列印遍歷結果0和1
#3.繼續利用for迴圈遍歷生成器t,因為該生成器已經遍歷過一次,所有值已經取完,所以這次遍歷不會取到任何值,則列印遍歷結果為空列表
#實現功能:人口普查,
#功能一:統計 「人口統計」 檔案中所有省份的總人數
#功能二:並計算出每一省份人數佔總人數的百分比
#人口普查.text檔案內容
#程式:
defget_population():
with open(
'人口普查
', '
r', encoding = '
utf-8
') as f:
for i in
f:
yield
ig =get_population()
all_population=sum(eval(i)['
population
'] for i in
g)print
(all_population)
for i in
g: single_population = eval(i)['
population']
print( single_population / all_population)
#程式分析:
#1.程式開始執行以後,因為get_population函式中有yield關鍵字,所以get_population函式並不會真的執行,而是先得到乙個生成器g.
#2.all_population=sum(eval(i)['population'] for i in g) 總人數的獲取
#對這段**進行翻譯一下
#第一步:通過for迴圈進行遍歷生成器 g,其實就是執行 get_population 函式,開啟txet檔案,讀取每一行內容
#第二步:每一行的內容讀出來為字串型別,通過eval()將字串轉換成字典型別,通過索引進行對每個省人口進行取值
#第三步:通過sum函式,對所取的值進行求和,計算總人口數
#3.通過對生成器g進行遍歷,取出每乙個省份的人數,並列印百分比
#通過分析,上述程式可實現要求。可執行結果如下:
2719
#只計算出總人數。為什麼沒有執行第二次遍歷?原因就在於計算總人口時已經對生成器g遍歷了一次,將值全部取出第二次遍歷時,生成器中並沒有值,因此也不會取出每乙個省份的人數,並列印百分比
#雖然功能實現了,可是我認為自己的程式寫的實在太蹩腳了因為沒有什麼基礎,所以只能按照功能區一步一步寫希望之後有是有改進吧程式改進(遍歷時儲存取值即可)
defget_population():
with open(
'人口普查
', '
r', encoding = '
utf-8
') as f:
for i in
f:
yield
ig =get_population()
s1 = eval(g.__next__())['
population']
s2 = eval(g.__next__())['
population']
s3 = eval(g.__next__())['
population']
s4 = eval(g.__next__())['
population']
s =[s1, s2 , s3, s4]
all_population = s1 + s2 + s3 +s4
for i in range(4):
print(s[i] /all_population)
#執行結果
2719
0.036778227289444645
0.367414490621552
0.2758367046708349
0.3199705774181684
大家對這個程式的實現有什麼好的想法可以和我交流一下
#以吃包子的列子
#我們去包子鋪買包子,肯定是去了店家邊做邊賣包子
#店家肯定不會讓所有人等著,把需要的所有包子都做好,再賣給大家
#最高效率的就是我做乙個人的,賣乙個人的量
#現做現賣
#我們用程式來模擬這個過程
#吃包子進化理論(我自己胡亂起的名字)
#程式一:(只能實現乙個人吃了乙個包子)
defproducer_bun():
c1 = consumer('
xhg'
) c1.
__next__
() c1.send(
'豬肉餡兒')
defconsumer(name):
print('
我是%s,我準備開始吃包子了
'%name)
while
true:
bun = yield
print('
%s很開心的把%s吃掉了
'%(name, bun))
producer_bun()
#執行結果
我是xhg,我準備開始吃包子了
xhg很開心的把豬肉餡兒吃掉了
#程式二:(只能實現乙個人吃了多個包子)
defproducer_bun():
c1 = consumer('
xhg'
) c1.
__next__
()
for i in range(3):
c1.send(
'包子%s
'%i)
defconsumer(name):
print('
我是%s,我準備開始吃包子了
'%name)
while
true:
bun = yield
print('
%s很開心的把%s吃掉了
'%(name, bun))
producer_bun()
#執行結果
我是xhg,我準備開始吃包子了
xhg很開心的把包子0吃掉了
xhg很開心的把包子1吃掉了
xhg很開心的把包子2吃掉了
#設定斷點,可以清楚的幫我們分析程式的執行過程。以此來充分理解yield的作用。 數字代表程式執行步驟最終版完美吃包子程式
defproducer_bun():
c1 = consumer('
xhg1')
c2 = consumer('
xhg2')
c1.__next__
() c2.
__next__
()
for i in range(3):
c1.send(
'包子%s
'%i)
c2.send(
'包子%s
' %i)
defconsumer(name):
print('
我是%s,我準備開始吃包子了
'%name)
while
true:
bun = yield
print('
%s很開心的把%s吃掉了
'%(name, bun))
producer_bun()
通過yield實現兩個函式之間的切換
其中send函式作用同next函式
send()的兩個功能:1.傳值;2.next()。
python 學習筆記(二十三)
coding utf8 author liwei import re python正則的應用,math方法判斷正則是否匹配成功 print 正則簡單用例 text hello liwei is 25 if re.match r w s w s w s d text print ok else pri...
python二十三 裝飾器
import time 裝飾器的架子 def timer func start time time.time func stop time time.time print 函式執行時間 s stop time start time def test time.sleep 2 print 函式執行完畢...
隨筆 二十三
1.gradle 完a整指南 android 2.android gradle 外掛程式 3.0 挖坑日記 3.android效能優化全方面解析 4.android studio 3.2新功能特性 5.重新認識 androidstudio 和 gradle,這些都是你應該知道的 6。美團外賣andr...