這個問題在這里已經有了答案: 遞回函式在 Python 中不回傳任何內容 [重復] (2 個回答) 為什么我的遞回函式回傳“None”? (2 個回答) 18 小時前關閉。
我正在做在線 python 課程,他們要求撰寫二十一點游戲。我在檢查經銷商手上的分數的功能上有問題。我一步一步地用“Thonny”檢查它,似乎一直在作業,直到 >= 17為真。“Thonny”向我展示了 if 陳述句的回傳值,并且……這里發生了奇跡。它直接跳轉到else塊并列印(“為什么會出現這個?”)與函式附加“卡片”一樣多。然后最底部的兩個列印都給出:<class 'NoneType'>和:None作為回傳值。如果我從 else 塊中的 return 中洗掉評論,那么它再次向后迭代,因為函式附加“卡片”并回傳dealer_hand串列的初始值,2 在這種情況下。(列印報表僅供反饋)
import random
cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
dealer_hand = []
def value_check(hand):
card_sum = sum(hand)
return card_sum
def card_draw():
card = random.choice(cards)
return card
def dealer_val_check(hand):
value = value_check(hand)
if value >= 17:
return value
else:
hand.append(card_draw())
print(hand)
dealer_val_check(hand)
# return value
print("why is this showing up?")
dealer_hand = [1, 1]
dealer_value = dealer_val_check(dealer_hand)
print(type(dealer_value))
print(dealer_value)
uj5u.com熱心網友回復:
因為你dealer_val_check()在內部呼叫它本身。直到,您最終得到一個 >= 17 的值。此時,您回傳True并回傳到您呼叫的那個點dealer_val_check()。
舉例說明:
假設您從一手 16 開始(從一開始)。
你會打電話給dealer_val_check()。該值不會 >= 17,因此它將執行其他操作。
在 else 中,您將抽取另一張牌并dealer_val_check()再次跟注。(參考點 A)
這次肯定會超過17個,所以這次我們要回傳“value”。
我們現在回傳到呼叫此方法的點(“參考點 A”)并列印“為什么會出現這個?”。
結論
如您所見,如果需要多次抽卡,您將多次列印“為什么會出現這個”。
自己試試吧!使平局始終為 1,需要 15 張牌,所以 15 次它會說“為什么會出現這個?”
所以要回答“為什么回傳不會停止該功能?”
你確實停止了這個功能!但不是呼叫該函式的函式!
這被稱為recursion,并且可能很難立即理解。考慮它的一種方法是,您跳入當前所在函式的另一個實體,并且該實體可能跳入另一個實體,依此類推……它一直持續到某個時刻一個實體returns。在這一點上,我們回退到前一個實體,這將向后回退到前一個實體,依此類推,直到您最終完全退出該函式。
關于 None
你必須回傳一些value,目前你已經注釋掉了return value。如果你不這樣做,你只需 return None。因此,將其添加回來,它將不再回傳None。
uj5u.com熱心網友回復:
沒有“魔法”,所有呼叫都dealer_val_check終止。最后value列印的 對應于第一個呼叫,帶有初始(原始)hand, [1,1]。
如果要跟蹤遞回函式呼叫堆疊發生的情況,請將函式更改dealer_val_check為以下內容:
def dealer_val_check(hand):
value = value_check(hand)
if value >= 17:
print("It was >=17, so returned: ", value)
return value
else:
hand.append(card_draw())
print(hand)
dealer_val_check(hand)
print("It was < 17, so returned: ", value)
return value
我的示例運行:
[1, 2, 2]
[1, 2, 2, 8]
[1, 2, 2, 8, 8]
It was >=17, so returned: 21
It was < 17, so returned: 13
It was < 17, so returned: 5
It was < 17, so returned: 3
<class 'int'>
3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399455.html
