【问题标题】:Why does this function need to be stored in a variable?为什么这个函数需要存储在一个变量中?
【发布时间】:2018-04-12 07:33:12
【问题描述】:

我最初对这段代码有疑问,因为我在最后一行代码中缺少“n =”,因此陷入了无限循环。

在这一点上,虽然我明白需要纠正什么,但我不明白为什么。为什么 'collat​​z(n)' 不足以调用函数并使用 n 作为其变量?如果有人能简单地解释一下(这里是初学者),我将不胜感激。

def collatz(number):
    if number % 2 == 0:
        print (number // 2)
        return number // 2
    elif number % 2 == 1:
        print (3 * number + 1)
        return 3 * number + 1

print ('Please enter a number.')
n = int(input())
while n != 1:
    n = collatz(n)

【问题讨论】:

  • collatz(n) 的值是collatz 返回的值。你必须对它做点什么。 collatz(n) 在自己的行上就像 2 + 3 在自己的行上一样——它是 5,然后……把它扔掉。
  • @Ry:或者类似地,这和n + 3n = n + 3之间的区别是一样的。
  • 你的函数返回一个结果。您想在下一个函数调用中重用该结果,函数中的局部变量本身不会挂起。
  • 如果您输入了42 作为数字,那么在循环中重复调用collatz(42) 没有多大意义。您想要获取collatz(42) 的结果并将该结果传递给对collatz(...)next 调用。然后你不断重复,获取结果,将其传递给下一个调用,直到结果为1

标签: python variable-assignment


【解决方案1】:

在 Python 中,函数接受一个或多个参数并返回单个值或对象。大多数时候他们不会修改他们的参数(实际上你的 collatz 函数不会尝试修改它的参数)。

例如,此函数接受一个变量 x,并返回 x**2。

def f(x):
    return x**2

此函数不会就地修改 x,并且返回值不会自动分配给 x。自动分配给 x 通常是没有帮助的,而且如果您的函数接受多个参数,将不清楚该怎么做 -- 哪个应该得到返回结果?

你可以通过多种方式调用这个函数,但是如果你想对结果做一些事情,你必须将它存储到一个变量中或者立即使用它:

y = 2
z = f(y)

z = f(2)

y = 2
print(f(y))

请注意,如果您将函数 f 视为将其参数转换为其他内容并返回的对象,那么所有这些都是有意义的,但如果您希望 f 在地方(然后f(2) 在以后的引用中必须以某种方式将数字 2 转换为表示 4)。

对于它的价值,即使您确实在函数内部用新值替换了其中一个参数,也不会改变函数外部相应变量的值。这是因为函数内的变量只指向对应的值或对象。如果为变量分配新值,函数内的局部变量现在将指向新值,但函数外的原始变量仍指向旧值。另一方面,您有时可以修改底层值或对象,而不是创建一个新对象并将局部变量指向它。例如,将项目添加到列表或字典将修改底层对象,并且该更改在您的函数之外可见。

但是您的 collat​​z 函数两者都没有 - 它只是计算一个新值并返回它。如果您想对该值执行任何操作,则必须显式存储函数调用的结果。它不会自动存储在参数变量中。

【讨论】:

    【解决方案2】:

    当您将变量作为参数传递给函数时,变量的副本会发送给函数,而不是变量本身。 因此,在您的情况下,n_copy(例如)被发送到您的函数而不是 n。 现在,当您在函数内修改它时,它仍然在函数的范围内(只能由函数访问)而不是主程序。 因此,当函数结束时,n 不会发生任何事情,因为 n 的副本已被修改。

    现在我们来看看返回函数。因为上面的问题,有一个返回函数。这将从函数返回一个值到主程序。 当您在函数中修改 n 时,您需要将修改后的值返回给主程序。 一旦你把它返回到主程序,它必须存储在一个变量中,在你的情况下它是 n。

    当你开始学习 Python 时,你应该阅读命名空间和作用域。 这是谷歌搜索的第一个链接 https://matthew-brett.github.io/teaching/global_scope.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多