Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python`if x不是None`或`if not x是None`?_Python_Coding Style_Nonetype_Boolean Expression_Pep8 - Fatal编程技术网

Python`if x不是None`或`if not x是None`?

Python`if x不是None`或`if not x是None`?,python,coding-style,nonetype,boolean-expression,pep8,Python,Coding Style,Nonetype,Boolean Expression,Pep8,我一直认为if not x is None版本更清晰,但谷歌和谷歌都使用if x not None。是否存在任何微小的性能差异(我假设没有),是否存在一个确实不适合的情况(使另一个成为我的大会的明显赢家)* *我指的是任何单身汉,而不仅仅是None …来比较像 没有一个使用是或不是 谷歌和谷歌的风格指南都是最佳实践: if x is not None: # Do something about x 使用非x可能会导致不必要的结果 见下文: >>> x = 1 >

我一直认为
if not x is None
版本更清晰,但谷歌和谷歌都使用
if x not None
。是否存在任何微小的性能差异(我假设没有),是否存在一个确实不适合的情况(使另一个成为我的大会的明显赢家)*

*我指的是任何单身汉,而不仅仅是
None

…来比较像 没有一个使用是或不是

谷歌和谷歌的风格指南都是最佳实践:

if x is not None:
    # Do something about x
使用
非x
可能会导致不必要的结果

见下文:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False
您可能有兴趣查看Python中计算为
True
False
的文本:


编辑以下评论:

我只是做了更多的测试
not x是None
不会先否定
x
,然后与
None
进行比较。事实上,
is
运算符在这样使用时具有更高的优先级:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False
因此,
not x is None
在我看来是最好避免的


更多编辑:

我只是做了更多的测试,可以确认bukzor的评论是正确的。(至少,我无法证明这一点。)

这意味着
如果x不是None
的确切结果为
如果x不是None
。我被纠正了。谢谢bukzor


然而,我的答案仍然是:如果x不是None,则使用常规的
:]

如果x不是None
与其他编程语言更相似,但是
如果x不是None
对我来说肯定听起来更清晰(在英语中语法更正确)


也就是说,对我来说,这似乎更像是一种偏好。

代码应该首先编写为程序员可以理解,其次是编译器或解释器。“is not”结构与英语比“not is”更为相似。

没有性能差异,因为它们编译为相同的字节码:

>>> import dis
>>> dis.dis("not x is None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("x is not None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

在文体上,我尽量避免使用
而不是x是y
,人类读者可能会误解为
(不是x)是y
。如果我写
x不是y
,那么就没有歧义。

出于文体原因,首选
不是
运算符,而不是否定
的结果。“
如果x不是None:
”与英语一样,但是“
如果不是x是None:
”需要理解运算符优先级,并且与英语不一样


如果存在性能差异,我的钱就花在
上,而不是
,但这几乎肯定不是选择该技术的动机。这显然取决于实施情况。由于
不可重写的,因此应该很容易优化任何区别。

答案比人们所做的要简单

这两种方式都没有技术优势,“x不是y”是其他人都使用的,这使得它显然是赢家。它“看起来更像英语”与否并不重要;每个人都在使用它,这意味着Python的每个用户——甚至是中国用户,他们的语言Python一点也不像——都能一目了然地理解它,而稍微不常见的语法将需要额外的几个大脑周期来解析

不要为了与众不同而与众不同,至少在这个领域

Python
如果x不是None
如果x不是None
? TLDR:字节码编译器将它们解析为
x不是None
——因此为了可读性,如果x不是None,请使用

可读性 我们使用Python是因为我们重视人类可读性、可用性和各种编程范例的正确性,而不是性能

Python优化了可读性,特别是在这种环境下

字节码的解析和编译
not
than
,因此这里没有逻辑上的区别。见:

运算符
不为
测试对象标识:
x为y
为真 当且仅当x和y是同一对象<代码>x不是y
生成 逆真值

在Python中,
不是
是专门为该语言的可读性改进而提供的:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
但是字节编译器实际上会翻译
而不是。。。是
不是

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
因此,为了可读性和按预期使用语言,请使用
is not


不使用它是不明智的。

我更喜欢可读性更强的形式
x不是y
然后我会思考如何最终编写运算符的代码处理优先级,以便生成更可读的代码。

我个人使用

if not (x is None):

每个程序员都能立即理解它,即使是那些不精通Python语法的程序员。

除非同一个人类读者认为它是
x是(不是y)
。但是我倾向于同意你的其他推理。另外,在这种情况下,“is not”不那么模棱两可,“if a not None and b note:“vs”if not a note and b note:“操作符应该是“aint”或“除非”(
if not x是None
->
除非x是None
)最后
x!=None
是最清晰的语法,不需要发明八角轮。我同意这一观点,但我相信遵循惯用风格的观点更为有力。对于大多数非python程序员来说,+1如果x不是None听起来像
如果x是(不是None)
,这很可能是一个编码错误。另一方面,对于大多数python程序员来说,
如果不是(x是None)
听起来好像你没有使用该语言的经验。
不是
本身就是一个操作符。就像
=。如果您喜欢
而不是x,则x是None
th
if not (x is None):