【问题标题】:IF something is True如果某事为真
【发布时间】:2017-01-25 15:08:03
【问题描述】:

我正在尝试编写一些简单的代码来检查特定目录是否存在以及该目录是否包含任何文件。如果它存在并且它包含文件,那么我希望它做一些事情。如果没有,那么我希望它做其他事情。

我一直在使用 os 模块来执行文件浏览器操作,到目前为止,它似乎工作得很好。

if os.listdir("D:\Inventory\Joy\XL") != []:  #Checks to see if the directory is empty
    print("This directory is full")
else:
    print("This directory is empty")


if (os.path.exists("D:\Inventory\Joy\XL")) is True: #THIS ISN'T RIGHT BUT I DON'T KNOW WHAT TO DO.
    print("This directory exists")
else:
    print("The directory doesn't exist")

我读到应该避免使用“如果 x == True then y”或“如果 x is True then y”,但我不知道如何(或为什么)避免它。另外,即使我想无视约定,我也不知道如何实现它。人们说这是多余的,但我又不明白为什么。我在 Stack Overflow 中阅读过有关此问题的类似条目,但我没有理解任何答案。

【问题讨论】:

  • 是啊,你为什么print-ing处于这种状态?另外,您是否尝试过从任何地方删除 is True 并查看发生了什么?
  • is 会将布尔值与布尔值进行比较,但是您从可以等同于布尔值的东西开始,因此没有任何收获,而是获得了额外的组装操作
  • print(除了打印的东西)返回None,这与True不同。不要在条件中添加调试输出。
  • 如果xTrue 等于整数1if x == True 将通过。 x is True在 x 是布尔值 True 时才会通过。
  • 提示:您更愿意说“'Ghosti 是你的用户名'这句话是真的”还是只说“'Ghosti 是你的用户名'”? ...在代码中:if x: y(),当你有 is True== True 时,它只是多余的

标签: python python-3.x if-statement


【解决方案1】:

测试列表是否为空的惯用方法是

if os.listdir("D:\Inventory\Joy\XL"):

将空列表视为假值,将非空列表视为真值。

因为os.path.exists 返回一个布尔值,所以没有必要做任何简单地返回另一个布尔值的事情;你已经有了一个。将True 值与True 进行比较返回True;将FalseTrue 进行比较会返回False,因此您只是恢复了原始输入。

if os.path.exists("D:\Inventory\Joy\XL"):

【讨论】:

    【解决方案2】:

    我读到应该避免使用“如果 x == True then y”或“如果 x 是 True then y",但我不知道如何(或为什么)避免它。

    首选样式如下所示:

    foo = False
    bar = True
    if foo:
      print "Foo!"
    elif bar:
      print "Bar!"
    else:
      print "Someone broke logic!"
    

    这种风格是首选,因为它避免了多余的“是真的”。

    人们说这是多余的,但我还是不明白为什么

    这是多余的,因为对于任何表达式 e,在布尔上下文中求值,e is True == e。 “在布尔上下文中求值”仅仅意味着我们正在测试表达式的值是否是“Falsey”值[False, None, [], {}, "", 0] 之一。如果是这些值之一,则结果为False。如果不是,那就是True

    【讨论】:

    • 主要问题是他打印的条件。
    • 我打印它是为了准确了解 Python 的行为,因为显然我还在学习它。 Jon Kiparsky,至于冗余,我不知道在评估条件时假设条件为真。这对我来说完全不直观。不过,我明白现在就是这种情况。谢谢你。我完全理解代码存在问题,但我将其包含在内,以便有经验的人可以纠正它。我以对我有意义的方式写了它。我仍在尝试找出最好的方法。
    • @Ghoti 我可能没有解释清楚,但这里没有假设真相。 e is True == e 是一个 iff,一种双向暗示。换句话说:对于任何表达式ee is True 是“真实的”当且仅当e 是“真实的”。这相当于说e is True 是“假的”当且仅当e 是“假的”。所以if e is True:总是等价于if e:这样更清楚吗?
    • @JonKiparsky 再次感谢您的帮助。让我声明,我只是注意到您遇到问题的错误“打印”。那是我输入代码时的错误。显然,那个印刷品不应该在那里。我应该做得更好的编辑工作。顺便说一句,我拿出了“是真的”,现在一切似乎都正常了。我不确定我是否理解,但不可否认,我在照顾孩子时有点分心。 :-) 我会尽快再次阅读您的回复。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多