【问题标题】:What does "if not" mean here?“如果不是”在这里是什么意思?
【发布时间】:2017-06-03 01:28:13
【问题描述】:
 def santa(*says):
    if not says:
        return "ho! xmas!"
    else:
        return says[0]+"! "+santa(*says[1:])

这是一个带有位置参数语法的递归函数,困扰了我的理解。 “if not says”是什么意思?是否等于“if says == False”?还是“if says is None”?因为如果我用两者中的任何一个替换它,它就会出错。

它如何链接到:

print(santa())

没有参数和输出

"ho! xmas!"

表示它满足第一个条件语句。

【问题讨论】:

  • 如果 says 是 falsy 即一个空元组

标签: python function if-statement conditional


【解决方案1】:

它基本上是检查says 是否有任何价值。对对象的 if 检查会检查该对象的真值。 says 将是一个元组。元组是 True 在 if 检查它们是否有任何值。所以实际上这是在检查 says 是否 (not) 非空。

如果您有兴趣,文档会提供更多详细信息:https://docs.python.org/2.4/lib/truth.html

【讨论】:

    【解决方案2】:
    def santa(*says):
        if not says:
            return 'ho! xmas!'
    

    所以我们这里有一个接受任意输入列表的函数定义。该函数所做的第一件事是检查列表是否为空。然后它返回一个格式化的短语,结束函数。

    您可能已经知道这一点,但是 if 语句会检查布尔语句的结果并相应地设置程序流程。在这种情况下,布尔语句是not says。 says 是传递给函数的任意列表。由于 Python 中的每个对象都有一个布尔结果,says,作为一个列表对象,有一个布尔结果。如果为空,则结果为false。如果不为空,则结果为true。

    因此,如果says 为空,则if not says: 将继续true 路径,这是由于not 限定符,如果says 不为空,则false 路径。

    更多关于 Python 真实性的信息可以在这里找到:https://docs.python.org/2/library/stdtypes.html#truth-value-testing

    【讨论】:

      【解决方案3】:

      在 Python 中,空元组在布尔上下文中的计算结果为 False。这可以通过将空元组转换为布尔值来看到:

      >>> says = ()
      >>> bool(says)
      False
      >>> 
      

      这意味着语句if not says 正在测试是否有任何参数通过says 使用not 运算符传递到函数中。这是一个例子:

      >>> says = ()
      >>> not says
      True
      >>> 
      

      因此,当您在不带任何参数的情况下调用 santa() 时,第一个 if 语句的计算结果为 True,并返回 "ho! xmas!"。

      【讨论】:

      • 那么为什么if says == False 会报错呢?他们不是一回事吗
      • @MrSoLoDoLo 它不应该给出错误,但它也不应该工作。当您执行if says 时,就相当于执行if bool(says)。 Python 会自己自动将 says 转换为布尔值。但是,当您尝试自己测试 says 是否“虚假”时,Python 还希望您将 says 转换为布尔值。这就是if says == False 不起作用的原因。
      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 2021-04-14
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多