这有什么区别?

时间:2017-07-09 02:03:10

标签: python

我正在学习python,这里有一个小代码,说明要我写。

  

首先,修改一个名为cube的函数,该函数接受一个名为的参数   数。不要忘记括号和冒号!做那个功能   返回该数字的立方体(即该数字乘以其自身   并再次乘以自己)。定义第二个函数   by_three接受一个名为number的参数。

如果该数字可被3整除,则by_three应调用cube(number)并返回其结果。否则,by_three应返回False。

我先做的是;

def cube(number): 
    return number ** 3

def by_three(number):
    if number % 3 == 0:
        cube(number)
        return number
    else:
        return False

但显然在这里,by_three(数字)返回数字本身。所以根据我的理解,立方体(数字)和返回数字不按行顺序工作?

这有效:

def cube(number): 
    return number ** 3

def by_three(number):
    if number % 3 == 0:
        return cube(number)
    else:
        return False

我知道为什么会这样,但我不知道为什么其他人不这样做。

5 个答案:

答案 0 :(得分:3)

因为您没有将cube()函数的返回值分配给变量。因此cube(number)会返回一个数字,然后会被遗忘,您只需返回最初传入by_three()的数字。如果在你的第一个中你做了number = cube(number)它会将立方数重新分配给数字变量,它会起作用。

修改其他信息

一种考虑它的简单方法是在函数计算并返回数据之后传递不可变数据类型(如整数,浮点数或字符串)时,该数据实质上取代了函数调用。所以你可以想象:

def cube(number): 
    return number ** 3

def by_three(number):
    if number % 3 == 0:
        9
        return number
    else:
        return False

这有助于说明为什么没有任何事情发生,因为9它本身与VARIABLE number没有任何关系。虽然这不是有效的python代码,但你可以想象这里幕后发生的事情的过程。正如我通过重新分配数字所说的那样,它将在幕后执行此操作,并将number重新分配给cube()返回值9:

def cube(number): 
    return number ** 3

def by_three(number):
    if number % 3 == 0:
        number = 9
        return number
    else:
        return False

答案 1 :(得分:2)

出了什么问题:

这是因为您没有将cube(number)的结果存储在任何变量中。当程序进入下一行return number时,它返回数字。

示例:

def example(number):
  number + 5
  return number

print(example(7))

结果是:7

因为当我致电number + 5时,我没有做任何事情来存储example(5)的结果我得回number

但现在考虑:

def example(number):
  number = number + 5
  return number

print(example(7))

结果是:12

这是因为我使用number的结果更新了number + 5

我希望这有助于您更好地了解代码的错误。欢迎来到StackOverflow。如果您发现任何其他有用的答案并解决您的问题,请将其标记为解决方案。这样,它将有助于社区和其他程序员在未来遇到与您相同的问题。干杯

答案 2 :(得分:1)

Python通过赋值传递变量。这意味着当您将参数传递给函数时,会为参数对应的参数分配对参数对象的引用。

在代码中,当您将number传递给cube()函数时,会为number cube()参数分配对该对象的引用。但是,您从不对该引用做任何事情。您只需返回一个新对象。此number永远不会更改。但即使您确实尝试更改number内的cube(),也会失败,因为Python会将赋值视为{{1}内名为number的变量的新声明}}

可以通过一个简单的示例来演示此行为:

cube()

>>> def func(n): print(id(n)) print(id(n ** 3)) n = 2 print(id(n)) >>> def func2(n): print(id(n)) func(n) >>> func2(3) 1612339504 1612339504 1612339888 1612339488 >>> 函数为程序中创建的每个对象返回唯一编号。如上所示,传入id()的{​​{1}}与传递到3的对象相同。但是,当我们在表达式func2()中使用func()时,会创建一个新对象。同样适用于作业n。当我们这样做时,Python将其视为变量声明,并创建n ** 3本地的新变量,并引用新对象n = 2

答案 3 :(得分:1)

那是因为你没有在任何地方存储多维数据集的结果而你只是返回数字本身。

我觉得让你感到困惑的是,在cube()函数内你正在返回number。现在你想,它是另一个函数内的number变量。但事实并非如此。您需要将值重新分配给某个变量才能使用它。

...
cube_num = cube(number)
return cube_num

现在这会奏效。希望这可以帮助! :)

答案 4 :(得分:1)

说明

第一个不起作用,因为函数中的变量不是全局变量。这是什么意思?请查看以下代码:

def add(number):
    return number + 3

add(number)
print(number)

如果您尝试使用此代码,则会获得NameError: name 'number' is not defined。这是因为变量number是LOCAL变量。它保留在函数内部,充满乐趣,然后在函数结束后死掉。这也意味着,如果您使用by_three(number) ...

切换by_three(number2)
def cube(number):
    return number ** 3

def by_three(number2):
    if number % 3 == 0:
        cube(number2)
        return number
    else:
        return False

它会显示错误name 'number' is not defined.。当您使用数字时,您将获得放在by_three(number)中的数字的输出,而不是cube(number)。因此,return cube(number)有效,因为cube(number)中的数字与by_three(number)中的数字不同。

可能的方法

如果你仍想做类似这样的过程,你可以使变量等于函数cube(number)。例如:

if number2 % 3 == 0:
    cubedNumber = cube(number2)
    return cubedNumber
else
    return False

现在by_three(3)显示了27。

分配全局变量

全局变量在函数外部时是默认的;如果不是,则作为局部变量。要将变量设为全局变量,只需输入global variable_name即可。但是,你不能只做global variable = "something";你必须在分配它之前使它成为一个全局变量。无论如何,在这种情况下,不建议使用,我甚至不打算使用几行代码来使函数正常工作,因为它对于其余代码来说是全局的。