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 8None应该与is操作员进行比较。它还说检查空序列应该使用not, 而不是将布尔值与==or进行比较is。但是,它没有提到任何关于检查0结果的内容。

那么我应该使用哪个选项?

4

4 回答 4

6

测试0是(imo)最好通过测试来完成00这也表明除了和之外可能还有其他值1

如果被调用的函数真的只0在成功和1失败时返回Yes/No, Success/Failure,True/False等,那么我认为该函数是问题所在,应该(如果适用)修复为 return Trueand False

于 2013-01-18T09:38:26.220 回答
1

0 不能保证是一个单例,所以不要is用来测试它:目前 C Python 重用小整数,所以如果你还在 Python 2.x 上,可能只有一个int值为 0 加 a ,long以及任何数量的浮点零,更不用说所有比较等于 0 的 False。Python 的一些早期版本在获得单独的 bool 类型之前使用不同的 int 零作为比较结果。

使用任何一个==(这将是我的偏好)或只使用not,无论您喜欢哪个。

于 2013-01-18T09:47:07.203 回答
1

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

于 2013-01-18T09:43:05.303 回答
1

A 和 C 都是有效的并且非常 Pythonic。

B 不是,因为

  1. 0语义上不是单例(它在 cPython 中,但这是一个实现细节)。
  2. 它不适用于 floatab.
  3. 实际上,这可能不适用于 Python 的其他一些实现。
于 2013-01-18T09:56:01.620 回答