Python中检查if语句中是否为0的Pythonic方式是什么?

3
在编写素数测试程序时,我遇到了一个有趣的想法。当您希望在操作的结果为0时执行某些操作时,哪种方式更好(“pythonic”)?
# option A - comparison
if a % b == 0:
    print('a is divisible by b')

# option B - is operator
if a % b is 0:
    print('a is divisible by b')

# option C - boolean not
if not a % b:
    print('a is divisible by b')

根据 PEP 8 的规定,对于单例对象(如None),应使用is运算符进行比较。对于空序列的检查应使用not,而不是使用==is来比较布尔值。但是,它没有提到如何检查结果是否为0
因此,你应该使用哪个选项呢?

1
我更喜欢选项C,尽管我不知道它是否(更)符合Pythonic的规范。 - elssar
我更喜欢A,因为它更易读。查看Python 3.3源代码,我数了362次字符串“ == 0:”,但从未出现过“ is 0:”。对于选项C,更难以自动检查,但我怀疑A选项更受青睐。 - user1220978
4个回答

6

针对0进行测试最好是通过测试0来执行(在我看来)。这也表明可能存在除01之外的其他值。

如果被调用的函数真的只在成功时返回0,在失败时返回1,即Yes/NoSuccess/FailureTrue/False等,则我认为该函数存在问题,应该(如果适用)修复为返回TrueFalse


1
当执行外部程序时,例如subprocess.call,返回值为01(或其他整数)非常常见。 - Thorsten Kranz
@ThorstenKranz:不管怎样,尽可能明确是件好事,特别是如果您可以控制返回值。返回“True”或“False”告诉调用函数的人它返回2个值。 0和1有点更加模糊。 - Joel Cornett
当然,我不是想说“使用1和0”。我真的很讨厌像while 1:这样的语句。我们生活在21世纪,我们有布尔类型。只是想指出有些情况下返回值为0和1。 - Thorsten Kranz

1

个人而言:我更喜欢使用not a % b的方式,因为它看起来更易读。但是现在,为了降低代码中的混淆程度,我将使用== 0,因为它以更准确的方式表达了你希望测试的内容。这是一种“关注调试”的方法。


1

0不能保证是单例,所以不要使用is来测试它:当前C Python重用小整数,因此可能只有一个值为0的int加上一个long(如果你还在使用Python 2.x),以及任意数量的浮点零,更不要提所有与0相等的False了。在Python得到一个单独的bool类型之前的一些早期版本中,使用了不同的int零作为比较结果的返回值。

请使用==(这是我更喜欢的)或者您自己喜欢的not中的任何一种。


1

A和C都是有效的且非常符合Python风格。

B不是,因为

  1. 0在语义上不是单例(虽然在cPython中是这样,但那是一些实现细节)。
  2. 它不能用于浮点数ab
  3. 实际上,在其他某些Python实现中,这可能无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接