Python 在函数之间传递变量(布尔值)

Posted

技术标签:

【中文标题】Python 在函数之间传递变量(布尔值)【英文标题】:Python passing variables between functions (boolean) 【发布时间】:2015-12-01 15:58:23 【问题描述】:

编辑: 好的,经过这里每个人的一些输入,我设法使它工作!我简化了很多以摆脱长链。这是我所拥有的:

def main():
    var = (raw_input("Enter an integer: "))
    a = get_number(var)
    if a != False:
        switch = by_three(int(a))
        if switch == True:
            return
        else:
            print "Try again!"
            main()
    else:
        main()


def get_number(parameter):
    if parameter.isdigit():
        return parameter
    else:
        print "No, I said an INTEGER. \"%s\" is not an integer." % parameter
        return False


def by_three(placeholder):
    if placeholder % 3 == 0:
        print "%d is divisible by 3. Isn't that terrific." % placeholder
        return True
    else:
        print '%d is not divisible by 3. Boo hoo.' % placeholder
        return False

print "Let's find an integer divisible by 3."
main()

我有什么理由不应该在我的 else 语句中回到 main() 吗?还有其他方法可以让程序回到开头吗?

—— 我尝试构建一个简单的命令行程序来查找可被 3 整除的数字。这个想法是不断询问一个数字,直到用户选择一个可被 3 整除的数字。这是我的代码:

def main():
    print "Let's find an integer divisible by 3."
    var = (raw_input("Enter an integer: "))
    switch = False
    get_number(var, switch)
    while switch != True:
        print "Try again!"
        main()

def get_number(parameter, nd):
    if parameter.isdigit():
        by_three(int(parameter), nd)
        return parameter, nd
    else:
        print "No, I said an INTEGER. \"%s\" is not an integer." % parameter
        return parameter, False


def by_three(placeholder, tf):
    if placeholder % 3 == 0:
        print "%d is divisible by 3. Isn't that terrific." % placeholder
        return placeholder, True
    else:
        print '%d is not divisible by 3. Boo hoo.' % placeholder
        return placeholder, False

main()

好的,这就是我认为发生的事情:变量switch 被传递给nd,它被传递给tf。如果另一个变量(var>parameter>placeholder)可以被 3 整除,则tf 的返回值为 True——这应该意味着当我用“while”对其进行测试时,该变量现在已更改。

这一定不是正在发生的事情——有人能解释一下我是如何对事情产生如此严重的误解的吗?在函数周围传递变量(并返回它们!)让我很困惑。

【问题讨论】:

为什么您认为您的代码不起作用?我用正面和负面的测试用例运行它,它通过了:让我们找到一个能被 3 整除的整数。输入一个整数:3 3 能被 3 整除。这不是很棒吗。再试一次!让我们找到一个能被 3 整除的整数。输入一个整数:6 6 能被 3 整除。这不是很好。再试一次!让我们找到一个能被 3 整除的整数。输入一个整数:5 5 不能被 3 整除。嘘。再试一次!让我们找到一个能被 3 整除的整数。输入一个整数: @ShawnMehan 哦,是的,我想我并不清楚。我希望程序继续要求更多的数字,直到有一个可以被三整除。一旦有一个可以被三整除的数字,它就应该结束。 【参考方案1】:

让我们专注于您的这部分代码:

...
switch = False
get_number(var, switch)
while switch != True:
   ...

你在这段代码sn-p中做了什么:

您有一个变量switch,开头是False。你将它发送到一个函数,然后检查它是否是True

为什么这有意义?

让我们考虑以下程序:

def changeVariable(a)
   a = a * 2

a = 5
changeVariable(a)
print(a)

这个程序仍然打印5,因为基本说明:你在一个函数中所做的,留在函数中。

因此,在您的情况下,调用get_number(var, switch) 并检查switch 的值是没有意义的,因为它会一直是False

解决方案:

您可以使用return 语句。然后,您将获得函数的输出

例子:

def changeVariable(a)
   a = a * 2
   return a

a = 5
result = changeVariable(a)
print(a)
print(result)

上面的代码将打印5,然后是10

【讨论】:

也可以在函数中指定global a @Alexander:他似乎没有那个坏习惯;让我们保持这种状态。 感谢您的评论!不过,我遇到了麻烦,因为我正在处理我不知道其值的变量——它们需要来自用户的输入。而且我不能只说“placeholder = var”,因为其中之一在函数之外。呃,我不知道的东西太多了。【参考方案2】:

当你定义一个函数时,你通过return value 返回的value 被赋予函数本身,而不是传递给函数的参数。

例如,

def f(i,j):
  i=1
  j=2
  return i,j

i=3
j=4
i,j=f(i,j)

将给出 i=1 和 j=2,但是

f(i,j)

将保持 i 和 j 不变(i=3 和 j=4),因为函数内部变量的范围是局部的。

【讨论】:

好的,谢谢!这很有帮助。我将代码修改为更直接: switch = by_three(int(var)) 我仍然无法将 by_three(var) 的值解析为 True 或 False。我以为我可以从 If 语句中做到这一点,但我无法让它工作。【参考方案3】:

所以tf 不会在任何地方使用。有一个值传递到 by_three 方法中,但它没有在方法中使用,因此无法返回。现在,切换 -> nd -> tf.而by_three 接受tf,但没有让它发挥作用。

by_three 为您的问题正确设置了TrueFalse,并将其传递回链到nd -> switch,它在条件while 中正确使用。

【讨论】:

以上是关于Python 在函数之间传递变量(布尔值)的主要内容,如果未能解决你的问题,请参考以下文章

互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别

不能通过引用传递android中的布尔变量

Python 的布尔值是按值传递的吗?

PyQt5按钮lambda变量变为布尔值[重复]

PyQt5按钮lambda变量变为布尔值[重复]

在此上下文中仅允许返回数字或布尔值的变量表达式