【问题标题】:Why return doesn't stop the function? [duplicate]为什么 return 不会停止函数? [复制]
【发布时间】:2021-12-31 02:38:32
【问题描述】:

我正在上在线 Python 课程,他们要求编写 Blackjack 游戏代码。 我在检查经销商手上的分数的功能上有问题。 我一步一步用“Thonny”检查它,似乎一直在工作,直到 如果 >= 17 为真。 “Thonny”向我展示了 if 语句的返回值,并且......这里发生了奇迹。 它直接跳到 else 块并打印(“为什么这会出现?”)与函数附加“卡片”一样多次。然后最底部的两个打印都给出: 和: None 作为返回值。 如果我从 else 块中的 return 中删除注释,那么它再次向后迭代函数附加“cards”的次数并返回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)

【问题讨论】:

  • 您能澄清一下问题所在吗?如果我取消注释return value,它下面的print() 语句将永远不会执行。
  • @BrokenBenchmark print 无关紧要。如果您取消注释return value,该函数将在添加之前返回初始列表的值。在这种情况下,值 = 2,因为列表 dealer_hand = [1, 1]。但是上面一行是函数本身的递归调用,为什么它甚至会转到return valueprint()?。为什么if value >= 17 不刹车这个功能? :(
  • 这里的潜在误解——认为returning 在递归函数中将结束所有堆栈中的调用,而不仅仅是最里面的调用——很常见,并且在我们的知识库中已经有很多重复项。那些重复的函数讨论了返回 None 的函数,但如果你真的阅读了它们的主体,令人困惑的是,外部调用不会返回最里面的 return 返回的东西——你在这里遇到的同样的问题。
  • ...所以,正如链接问题的答案所描述的那样,您需要一个额外的return(如return dealer_val_check(hand))来获取内部调用返回的东西,然后自己返回那个东西。
  • 好吧。现在这是有道理的。你说的对。我在想 return 会结束所有的电话......它解释了很多。我是编码的开始,所以有很多东西要学习和理解。谢谢你的解释。干杯。

标签: python if-statement return


【解决方案1】:

因为您在其内部调用dealer_val_check()。直到,您最终得到一个 >= 17 的值。此时,您返回 True 并返回到您调用的点 dealer_val_check()

举例说明:

假设您从 16 手开始(从一开始)。

您将致电dealer_val_check()。该值不会 >= 17,因此它会执行 else。

在else中,您将抽出另一张牌并再次调用dealer_val_check()。 (参考点A)

这一次,我们肯定会超过17个,所以这次我们将返回“value”。

我们现在返回调用此方法的点(“参考点 A”)并打印“为什么会出现这个?”。

结论

如您所见,如果需要多次抽牌,您将多次打印“为什么会出现”。

自己试试吧!让平局始终为 1,需要 15 张牌,所以 15 次会说“为什么会出现?”

所以回答“为什么 return 不会停止函数?”

您确实停止了该功能!但不是调用该函数的函数!

这被称为recursion,可能有点难以立即理解。考虑它的一种方法是,您跳入当前所在函数的另一个实例,并且该实例可能会跳入另一个实例,依此类推……它一直持续到某个实例returns。此时,我们回到前一个实例,它会回到前一个实例,以此类推,直到你最终完全退出函数。

关于None

你必须返回一些value,目前你已经注释掉了return value。如果不这样做,您只需返回None。因此,将其添加回来,它将不再返回 None

【讨论】:

  • How to Answer 中,请注意回答正确提出的问题 部分,以及其中关于“之前已被多次询问和回答”的问题的要点。我们可能每天至少对这个问题进行一次新的迭代。
  • 我的意思是...如果 anything 他们的问题缺乏重点,因为这几乎是“调试我的程序”,并且有多个问题需要提及和回答.就个人而言,我觉得如果我删除其中任何一个,答案就不够了。
【解决方案2】:

没有“魔法”,所有对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

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多