国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語(yǔ)句操作

2019-11-02 14:08:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語(yǔ)句操作。分享給大家供大家參考,具體如下:

demo.py(生成器,yield關(guān)鍵字):

# 生成器是一個(gè)特殊的迭代器。可以用for...in遍歷。# 帶有yield關(guān)鍵字的函數(shù),不再是一個(gè)函數(shù),而是一個(gè)生成器模板。調(diào)用該模板會(huì)返回一個(gè)生成器對(duì)象。def create_num(all_num):  a, b = 0, 1  current_num = 0  while current_num < all_num:    yield a  # 當(dāng)遍歷create_num返回的生成器時(shí),會(huì)阻塞在yield的位置。每次遍歷出的值都是yield后的值。    a, b = b, a+b    current_num += 1  # return '返回值'  # 迭代結(jié)束后,繼續(xù)調(diào)用next會(huì)拋StopIteration異常。 可以通過(guò)該異常來(lái)獲取該返回值。 (異常.value 就是該返回值)# create_num"函數(shù)"中有一個(gè)yield,那么create_num不再是一個(gè)函數(shù)。調(diào)用時(shí),會(huì)返回一個(gè)生成器對(duì)象。obj = create_num(10) # 只會(huì)返回一個(gè)生成器對(duì)象(可用于遍歷)。并不會(huì)執(zhí)行create_num中的代碼,只有遍歷(迭代)時(shí)才會(huì)執(zhí)行create_num中的代碼。ret = next(obj) # 迭代的本質(zhì)就是調(diào)用對(duì)象的__next__函數(shù)。 會(huì)返回yield后面的值,并阻塞代碼,直到再次調(diào)用next(或迭代)才會(huì)解阻塞。print(ret)  # 當(dāng)create_num中的代碼執(zhí)行完后,迭代就會(huì)結(jié)束。ret = next(obj) # 如果迭代結(jié)束后,繼續(xù)調(diào)用next,那么會(huì)拋異常。 可以通過(guò)異常來(lái)獲取create_num return的值。print(ret)  # 可以通過(guò)異常來(lái)判斷是否迭代結(jié)束。obj2 = create_num(2) # obj2和obj的遍歷迭代互不影響。ret = next(obj2)print(ret)# for num in obj:#  print(num)

運(yùn)行結(jié)果:

0
1
0

demo.py(通過(guò)異常判斷迭代是否結(jié)束):

def create_num(all_num):  a, b = 0, 1  current_num = 0  while current_num < all_num:    yield a     a, b = b, a+b    current_num += 1  return "ok...."  # 通過(guò)迭代結(jié)束后的異常來(lái)獲取該返回值obj = create_num(10) # 返回一個(gè)生成器對(duì)象。并不會(huì)執(zhí)行create_num中的代碼,只有遍歷迭代obj時(shí)才會(huì)執(zhí)行create_num中的代碼while True:  try:    ret = next(obj) # 迭代結(jié)束后繼續(xù)調(diào)用next會(huì)拋異常。    print(ret)  except Exception as ret:    print(ret.value) # 通過(guò)異常獲取create_num return的值。    break

運(yùn)行結(jié)果:

0
1
1
2
3
5
8
13
21
34
ok....

demo.py(send()迭代生成器,傳參給yield語(yǔ)句):

def create_num(all_num):  a, b = 0, 1  current_num = 0  while current_num < all_num:    ret = yield a  # send的參數(shù)就是yield語(yǔ)句的返回值。    print(">>>ret>>>>", ret)  # hahahha    a, b = b, a+b    current_num += 1obj = create_num(10)# obj.send(None) # send一般不會(huì)放到第一次啟動(dòng)(迭代)生成器,如果非要這樣做 那么傳遞None (否則會(huì)拋異常)ret = next(obj) # 第一次遍歷迭代生成器時(shí),建議使用next函數(shù)。print(ret)# send與next作用相同,都是進(jìn)行下一次迭代的意思。 (都會(huì)解阻塞yield關(guān)鍵字)# send可以傳遞參數(shù)表示yield語(yǔ)句的返回值。 而next不能傳遞參數(shù)。ret = obj.send("hahahha") # 會(huì)先將"hahahha"參數(shù)當(dāng)做yield語(yǔ)句的返回值,然后再解阻塞yield 遍歷。(因此不推薦第一次遍歷時(shí)使用send傳參) print(ret)

運(yùn)行結(jié)果:

0
>>>ret>>>> hahahha

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石家庄市| 原阳县| 习水县| 沛县| 永城市| 晋江市| 许昌县| 吕梁市| 偏关县| 随州市| 从江县| 藁城市| 香河县| 鄂伦春自治旗| 华坪县| 贵南县| 浏阳市| 衡水市| 石河子市| 神木县| 新丰县| 闸北区| 阿荣旗| 化州市| 黔东| 宜都市| 保山市| 邢台县| 湘潭县| 兴业县| 阿拉尔市| 河曲县| 巴马| 青冈县| 鄂托克前旗| 桦川县| 东乌珠穆沁旗| 元朗区| 绍兴县| 临沂市| 勐海县|