如何在Python中定义布尔参数

时间:2018-10-03 14:32:43

标签: python

我定义了一个函数,该函数将根据其值打印特定的字符串。但是,我收到一条错误消息,说global name 'must_print' is not defined

这是我的代码:

def myfunction(must_print):
    must_print = True
    if bool(must_print) == True:
        print("Done")
    elif bool(must_print) == False:
        print("Change value")

if __name__ == "__main__":
    myfunction(must_print)

您知道为什么我会收到此错误吗?

4 个答案:

答案 0 :(得分:1)

定义中名为“ must_print”的参数与函数调用名为“ must_print”的参数完全无关。

以下代码与您的代码等效:

def myfunction(x):
    x = True
    if bool(x) == True:
        print("Done")
    elif bool(x) == False:
        print("Change value")

if __name__ == "__main__":
    myfunction(must_print)

Python执行代码时,它首先定义函数,然后尝试执行myfunction(must_print)
但是到那时,还没有定义任何称为“ must_print”的东西。

参数名是您要定义的函数的一种方法,用于引用在调用它时传递的值–对函数而言,调用函数的代码如何拼写该值并不重要,参数名称与调用代码无关。

这意味着您可以孤立地理解函数定义,所以让我们做到这一点。

def myfunction(must_print):
    # Replace whatever value must_print had with True
    must_print = True
    # Convert must_print, which has a boolean value, into a boolean, and compare it to True
    if bool(must_print) == True:
        print("Done")
    # Convert must_print, which has a boolean value, into a boolean, and compare it to False
    elif bool(must_print) == False:
        print("Change value")

用不同的值代替参数的值使该参数毫无意义–当您进入if时,无论您传递什么参数,它都将是True,而myfunction("Vacation")的作用与myfunction(False)

删除该作业:

def myfunction(must_print):
    # Convert must_print into a boolean, and compare it to True
    if bool(must_print) == True:
        print("Done")
    # Convert must_print into a boolean, and compare it to False
    elif bool(must_print) == False:
        print("Change value")

但是bool(must_print)必须是TrueFalse,因此您只需要else和一个条件:

def myfunction(must_print):
    # Convert must_print into a boolean, and compare it to True
    if bool(must_print) == True:
        print("Done")
    else:
        print("Change value")

现在,如果表达式e是布尔值,则e == Truee相同。
True == TrueTrue,而False == TrueFalse。)
因此,我们可以简化一些内容:

def myfunction(must_print):
    # Convert must_print into a boolean
    if bool(must_print):
        print("Done")
    else:
        print("Change value")

此外,if将任何Python值都视为真值。
也就是说,if bool(e)if e相同:

def myfunction(must_print):
    if must_print:
        print("Done")
    else:
        print("Change value")

现在剩下的就是调用函数,并为其传递一个合适的参数:

if __name__ == "__main__":
    myfunction(True)

答案 1 :(得分:0)

您的代码中有很多需要优化的地方。请看一下这个示例:

def myfunction(must_print):
    if must_print:
        print("Done")
    else:
        print("Change value")

if __name__ == "__main__":
    myfunction(True)

答案 2 :(得分:0)

您应该重视全局限制。

代码:

must_print = True    

def myfunction(must_print):
    global must_print

    must_print = True
    if bool(must_print) == True:
        print("Done")
    elif bool(must_print) == False:
        print("Change value")

if __name__ == "__main__":
    myfunction(must_print)

输出:

Done

答案 3 :(得分:0)

您会混淆一些事情,当您开始使用函数时,这很容易做到。

您并不需要全局变量,但是在某些时候,您应该阅读Use of "global" keyword in Python来了解有关全局变量的更多信息。

在您定义函数myfunction的前6行中,您告诉python有一个名为must_print的参数。此参数在函数内部,而您设置的参数仅存在于该函数内部。

您可以通过几种不同的方式调用该函数:

m_p = True
myfunction(m_p)

myfunction(True)

甚至

myfunction(must_print=True)

它们全都归结为同一件事:告诉python调用函数myfunction,并将其值True传递给第一个参数(名为must_print)。然后python调用该函数,生成一个名为must_print的局部变量。 (顺便说一句,在函数的第一行中,将变量设置为True,从而忽略了给出的任何输入。因此,myfunction(True)myfunction(False)现在将具有相同的结果。)

关键是调用函数时,您传递了其他内容-变量或常量项。 (在第三种情况下,您明确告诉它名为must_print的参数设置为True。在这种情况下,在=之后,有一个常数或一个变量。前两个情况下,只需将第一个参数设置为True,最后一个参数通过名称指定参数即可。)在函数myfunction之外,未定义变量must_print,因此python希望它位于全局变量中范围。

注意,为了减少混乱,我特意避免这种情况:

must_print = True
myfunction(must_print)

这是完全有效的代码,但令人困惑。在这种情况下,您有一个if子句局部变量,该变量用于设置传递给该函数的参数,然后该变量具有相同名称的函数局部变量。这更加令人困惑,所以我从m_p变量开始。

关于python作用域的一些不错的读物是Short Description of the Scoping Rules?,尤其是以下两个答案:https://stackoverflow.com/a/34094235/1404311https://stackoverflow.com/a/292002/1404311

根据评论进行编辑

def myfunction(must_print=True)myfunction(must_print=True)做两件事完全不同。

关键字def是您定义函数的地方。在函数定义中,must_print=True表示您有一个名为must_print的变量,其默认值为True。因此,在函数内部,无论您执行myfunction(True)还是仅执行myfunction(),都会有一个名为must_print的参数,其值为True。仅当您将其显式设置为其他值(例如myfunction(False)时,must_print的变量才会为True。

在第二个版本中,您将明确命名该参数。当您只有一个参数时,它并没有真正的意义,因此请尝试以下操作:

def foo(arg1=8, arg2='hello', arg3=True):
    print(arg1, arg2, arg3)

然后您可以执行foo(),它将显示“ 8 hello True”。或者,您可以执行foo(7),这将显式设置arg1并使用arg2和arg3的默认值,并输出“ 7 hello True”。或foo(6, 'goodbye')打印“ 6再见,是”,或foo(5, 'whatever', False)将打印“ 5,再见”。但是如何使用默认值并仅更改最后一个参数?那就是命名参数的输入。尝试foo(arg3=False),输出将为“ 8 hello False”。

最好的学习方法就是做事。在python解释器中尝试使用此类小功能。您将很快掌握它。