內(nèi)容來源于網(wǎng)絡(luò),本人只是在此稍作整理决帖,如有涉及版權(quán)問題,歸小甲魚官方所有蓖捶。
練習(xí)題(來自小甲魚官方論壇)
0.通常地回,一般的函數(shù)從第一行代碼開始執(zhí)行,并在什么情況下結(jié)束腺阳?
答:對于調(diào)用一個普通的Python函數(shù)落君,一般是從函數(shù)的第一行代碼開始執(zhí)行,結(jié)束于return語句亭引,異骋锼伲或者函數(shù)所有語句執(zhí)行完畢。一旦函數(shù)將控制權(quán)交還給調(diào)用者焙蚓,就意味著全部結(jié)束纹冤。函數(shù)中做的所有工作以及保存在局部變量中的數(shù)據(jù)都將丟失。如果再次調(diào)用這個函數(shù)時购公,一切都將重新開始萌京。
1.什么是協(xié)同程序?
答:所謂的協(xié)同程序就是可以運行的獨立函數(shù)調(diào)用宏浩,函數(shù)可以暫椭校或者掛起,并保留函數(shù)的局部變量等數(shù)據(jù)比庄,然后在再次調(diào)用它的時候求妹,從上次暫停的位置繼續(xù)執(zhí)行下去。
2.生成器所能實現(xiàn)的任何操作都可以由迭代器來代替嗎佳窑?為什么制恍?
答:是的,都可以神凑。因為生成器事實上就是基于迭代器來實現(xiàn)的净神,生成器只需要一個yield語句即可,但它內(nèi)部會自動創(chuàng)建__ iter__()和__ next__()方法溉委。
3.將一個函數(shù)改造為生成器鹃唯,說白了就是把什么語句改為yield語句?
答:return語句薛躬。
4.說到底俯渤,生成器的最大作用是什么?
答:使得函數(shù)可以“保留現(xiàn)場”型宝,當下一次執(zhí)行該函數(shù)就是從上一次結(jié)束的地方開始八匠,而不是重頭再來絮爷。
5.如下,get_print()是一個獲得素數(shù)的生成器梨树,請問第二行代碼while True有何作用坑夯?
def get_prime(number):
while True:
if is_prime(number):
yield number
number += 1
答:這個while True循環(huán)是用來確保生成器函數(shù)永遠也不會執(zhí)行到函數(shù)末尾的。只要調(diào)用next()這個生成器就會生成一個值抡四。這是一個處理無窮序列的常見方法(這類生成器也是很常見的)柜蜈。
編程題
0.要求實現(xiàn)一個功能與reversed()相同的生成器,例如:
>>> for i in myRev("FishC")
print(i, end=' ')
ChsiF
答:代碼如下:
>>> def myRev(data):
# 這里用range生成data的倒序索引
# 注意指巡,range的結(jié)束位置是不包含的
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for i in myRev("FishC.com"):
print(i, end=' ')
m o c . C h s i F
1.10以內(nèi)的素數(shù)之和是:2+3+5+7=17淑履,那么請編寫程序,計算2000000以內(nèi)的素數(shù)之和藻雪?
答:如果你的想法是將2000000以內(nèi)的所有素數(shù)都找到并存放到一個列表中秘噪,再依次進行求和計算,那么這個列表極有可能會撐爆你的內(nèi)存勉耀,所以這道題就必須用到生成器去實現(xiàn)指煎。
import math
def is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
def get_primes(number):
while True:
if is_prime(number):
yield number
number += 1
def solve():
total = 2
for next_prime in get_primes(3): # 2是第一個素數(shù),3是第二個素數(shù)便斥,接下來靠+1往上走至壤,靠素數(shù)判斷方法判斷是不是素數(shù),是的話就累加
if next_prime < 2000000:
total += next_prime
else:
print(total)
return
if __name__ == '__main__':
solve()
結(jié)果是:
142913828922
2.請寫下這一節(jié)課你學(xué)習(xí)到的內(nèi)容:格式不限枢纠,回憶并復(fù)述是加強記憶的好方式像街!
- 生成器更深入了解請點擊
https://fishc.com.cn/thread-56023-1-1.html