【问题标题】:Return statement and indentation [closed]返回语句和缩进[关闭]
【发布时间】:2013-07-24 22:48:40
【问题描述】:

我很难理解return 声明。

下面的布尔测试if not test(a) 是假的(意味着if test(a)true),否则语句返回b。

但是在它返回a之后,将有价值的内容重写为a,不是吗?

def proc4(a, b):
    if not test(a):
        b = 'udacity'
    else:
        return b
    return a

【问题讨论】:

  • 不是吗?你能试着让你的问题更清楚吗?
  • 抱歉,我确实试过把我的问题说清楚......
  • 我也很困惑。你认为什么被“重写”到a?函数一返回就结束了。
  • 谢谢亨利。最尴尬的事实是,我不知道“函数一返回就结束了。”。耻辱..
  • 不丢人!这是一个非常常见的混淆原因!

标签: python return


【解决方案1】:

这是人们经常遇到的问题:当我的函数有多个返回点时意味着什么

抛开关于whether or not 多次退货的争论应该 曾经发生过,事实是它们确实发生了。要记住的重要一点是:

函数一返回就结束了。

在我熟悉的每一种现代编程语言中,一旦函数到达返回点,它就会退出处理*。如果有返回值,则将其传递回最初调用函数的位置。 Python 也不例外。

您的函数中有一些额外的垃圾,使其更难阅读,这无济于事。具体来说,分配给b 是完全多余的,因为分配的值从未使用过。为了清楚起见,我们可以像这样重写您的函数,同时仍然解释多个返回:

def proc4(a, b): # line 1
    if test(a):  # line 2
        return b # line 3
    return a     # line 4

现在发生的事情是这样的。假设 test(a) 在第 2 行计算为 True。我们进入 if 块,遇到第 3 行:return b。该函数现在将b 的值返回到它被调用的地方,并且执行完成。第 4 行永远不会执行。

或者,如果test(a) 评估为False,那么我们不会进入if 块。在这种情况下,我们跳过第 3 行,直接跳到第 4 行。现在,我们执行第 4 行,并将 a 的值返回到调用 proc4 的位置。

*有某些流控制语句,例如许多语言中的finally可以导致函数中的代码在遇到返回语句后被执行。为简单起见并且因为它是题外话,我不打算在这个答案中讨论这个问题。感谢@Racso 指出我错过了这个!

【讨论】:

  • “在我熟悉的每一种现代编程语言中,一旦函数到达返回点,它就会退出处理” - 恐怕你错了.在几种语言中,Try...Catch...Finally 语句的 Finally 块即使在返回行被命中时也会被执行。查看stackoverflow.com/questions/65035/…
  • @Racso 感谢您指出我错过了!我已经编辑了答案。
  • 没问题 :) 正如你所说,finally 的事情是题外话;我的真正意图是向你展示这种行为,以防你不知道。 PS:这是 Racso,不是 Rasco ;)
  • @Racso 我盯着那个 P.S. 看了整整一分钟,才注意到我的错字 0_o
【解决方案2】:

如果test(a)False,则将b 设置为'udacity'return a

也可以这样写。

def proc4(a, b):
    if not test(a):
        b = 'udacity'
        return a
    else:
        return b

【讨论】:

  • b = 'udacity' 实际上是一个 noop。
  • 值得注意的是:原始代码有点愚蠢,因为对 b 的本地分配是无关紧要的,因为该值从未使用过。整个函数也可以是:proc4 = lambda a, b: b if test(a) else a
【解决方案3】:

但就在它返回 a

如果它已经返回b,则不会。遇到单个 return 语句后,函数的执行结束并返回一个值。

【讨论】:

  • 谢谢。这现在说得通了。第一眼看不懂。
【解决方案4】:

您的函数可能更清楚地写成这样:

def proc4(a, b):
    if test(a):
        return b
    else:
        return a

这有助于你理解逻辑吗?

【讨论】:

  • 如果您详细说明,我会尽力为您提供进一步的帮助......
  • 谢谢,我明白我的功能这样更清晰。不过,我必须理解为什么我的函数返回的方式与你的函数一样......
【解决方案5】:

如果test(a)true,则函数返回参数b的原始值。

如果test(a)false,则函数返回参数a的原始值。

“原始值”是指函数接收到的值。

【讨论】:

    【解决方案6】:

    我认为你错过了另外两件重要的事情

    if not test(a):
        b = 'udacity'
    else:
        return b
    

    首先,如果 a 的计算结果为 true,那么您的代码会将 b 设置为值“udacity”但不会返回。相反,执行继续到下一个代码块。你的情况

    return a
    

    if - else 是互斥的,这意味着如果一个块执行(因为它的条件被评估为真),那么默认情况下另一个块将被跳过。此外,您在一个块内所做的更改将无法用于另一个块(您的 b 分配永远不会被您的 else 打印)。当您的 if 语句计算结果为 false 时,您的代码会这样做

    return b
    

    返回 b 中的任何内容(同样适用于“返回 a”)。 关于return语句,this Wikipedia entry的第一行真的很有帮助:

    在计算机编程中,return 语句会导致执行离开当前子例程并在代码中调用子例程之后的位置继续执行

    在您的情况下,就在调用 proc4() 之后

    【讨论】:

      【解决方案7】:

      当我刚接触编程时,我也对返回感到困惑。事实上,这很简单。假设我们有一个计算器应用程序。这是我们的加法函数:

      def add(x,y):
          return x+y
      answer = add(1,1)
      

      答案是 2。函数执行操作并返回一个值,就好像它是一个变量一样。函数可以作为值赋给变量。

      现在回答您的问题:如果 a 不正确,则 b 将等于 udacity,但不会返回并且会返回 a。否则将返回 b。

      【讨论】:

      • 很确定answer = 2 在那个小sn-p 的末尾,而不是1 ;-)
      • @HenryKeiter 呵呵错字。
      猜你喜欢
      • 1970-01-01
      • 2016-06-10
      • 2014-05-11
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多