-3

我很难理解这种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
4

7 回答 7

5

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

撇开是否应该发生多次回报的争论不谈,事实是它们确实发生了。要记住的重要一点是:

一个函数一返回就结束了。

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

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

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

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

或者,如果test(a)评估为False,则我们不进入该if块。在这种情况下,我们跳过第 3 行,直接到第 4 行。现在,我们执行第 4 行,并将 的值返回到被调用的a任何地方。proc4

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

于 2013-07-24T23:18:59.730 回答
3

如果test(a)False, 设置b'udacity'andreturn a

也可以这样写。

def proc4(a, b):
    if not test(a):
        b = 'udacity'
        return a
    else:
        return b
于 2013-07-24T22:51:30.530 回答
3

但就在它回来之后a

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

于 2013-07-24T22:52:18.593 回答
2

您的函数可能会以这种方式更清楚地编写:

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

这有助于你理解逻辑吗?

于 2013-07-24T22:54:51.413 回答
1

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

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

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

于 2013-07-24T22:51:39.013 回答
1

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

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

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

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

于 2013-07-24T22:56:26.863 回答
1

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

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 语句,这个 Wikipedia 条目的第一行真的很有帮助:

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

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

于 2013-07-24T23:01:34.490 回答