在if语句中检查0的Pythonic方法?

时间:2013-01-18 09:35:47

标签: python if-statement

在编写素数测试员时,我遇到了一个有趣的想法。当你想要做一些事情,如果一个操作的结果是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的结果。

我应该使用哪个选项?

4 个答案:

答案 0 :(得分:6)

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

如果被调用函数真的只返回0成功而1未能说Yes/NoSuccess/FailureTrue/False等,那么我认为函数是问题,应该(如果适用)修复以返回TrueFalse

答案 1 :(得分:1)

仅仅是个人:我更喜欢not a % b方式,因为它似乎具有高可读性。但是现在,为了降低代码中的混淆程度,我将使用== 0,因为它表达了您希望以更准确的方式准确测试的内容。这是“关心调试”的方法。

答案 2 :(得分:1)

0不保证是单例,所以不要使用is来测试它:当前C Python重新使用小整数,因此可能只有一个int的值为0如果你仍然使用Python 2.x加上一个long,并且任何数量的浮点数都不提False,它们都比较等于0.一些早期版本的Python,在得到一个单独的bool类型之前使用了比较结果不同的int为零。

使用==(这是我的偏好)或not,无论您喜欢哪种。

答案 3 :(得分:1)

A和C都是有效且非常pythonic。

B不是,因为

  1. 0在语义上不是单例(它在cPython中,但这是一个实现细节)。
  2. 它不适用于浮动ab
  3. 实际上,这可能不适用于Python的其他一些实现。