溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python 中怎么使用send()傳參給yield語(yǔ)句

發(fā)布時(shí)間:2021-07-22 17:11:12 來(lái)源:億速云 閱讀:142 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Python 中怎么使用send()傳參給yield語(yǔ)句,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

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 += 1
obj = 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
1

創(chuàng)建生成器的簡(jiǎn)單方式:

Python 中怎么使用send()傳參給yield語(yǔ)句

關(guān)于Python 中怎么使用send()傳參給yield語(yǔ)句就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI