Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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 &引用;x不在y中;或;不是“y中的x”;_Python_Syntax_Operators - Fatal编程技术网

Python &引用;x不在y中;或;不是“y中的x”;

Python &引用;x不在y中;或;不是“y中的x”;,python,syntax,operators,Python,Syntax,Operators,在测试会员资格时,我们可以使用: x not in y 或者: not x in y 根据x和y的不同,此表达式可能有多种上下文。例如,它可以用于子字符串检查、列表成员资格、dict键是否存在 这两种形式总是等价的吗 是否有首选语法 在Python中,没有区别。而且没有偏好。 不,没有区别 运算符不在被定义为具有中的的反真值 - 我认为不在中是首选,因为它更明显,而且他们为它添加了一个特例 从语法上讲,它们是相同的语句。我会很快指出,在“垃圾邮件和鸡蛋”中不“火腿”表达了更清晰的意图,但

在测试会员资格时,我们可以使用:

x not in y
或者:

not x in y
根据
x
y
的不同,此表达式可能有多种上下文。例如,它可以用于子字符串检查、列表成员资格、dict键是否存在

  • 这两种形式总是等价的吗
  • 是否有首选语法

在Python中,没有区别。而且没有偏好。

  • 不,没有区别

    运算符
    不在
    被定义为具有中的
    的反真值

    -
  • 我认为
    不在
    中是首选,因为它更明显,而且他们为它添加了一个特例

  • 从语法上讲,它们是相同的语句。我会很快指出,
    在“垃圾邮件和鸡蛋”中不“火腿”表达了更清晰的意图,但我看到过这样的代码和场景:
    在“垃圾邮件和鸡蛋”中不“火腿”表达了比另一个更清晰的含义。

    它们总是给出相同的结果

    事实上,“垃圾邮件和鸡蛋”中的非“火腿”似乎是一种特殊情况,它执行一个“不在”操作,而不是一个“在”操作,然后否定结果:

    >>> import dis
    
    >>> def notin():
        'ham' not in 'spam and eggs'
    >>> dis.dis(notin)
      2           0 LOAD_CONST               1 ('ham')
                  3 LOAD_CONST               2 ('spam and eggs')
                  6 COMPARE_OP               7 (not in)
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE    
    
    >>> def not_in():
        not 'ham' in 'spam and eggs'
    >>> dis.dis(not_in)
      2           0 LOAD_CONST               1 ('ham')
                  3 LOAD_CONST               2 ('spam and eggs')
                  6 COMPARE_OP               7 (not in)
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE    
    
    >>> def not__in():
        not ('ham' in 'spam and eggs')
    >>> dis.dis(not__in)
      2           0 LOAD_CONST               1 ('ham')
                  3 LOAD_CONST               2 ('spam and eggs')
                  6 COMPARE_OP               7 (not in)
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE        
    
    >>> def noteq():
        not 'ham' == 'spam and eggs'
    >>> dis.dis(noteq)
      2           0 LOAD_CONST               1 ('ham')
                  3 LOAD_CONST               2 ('spam and eggs')
                  6 COMPARE_OP               2 (==)
                  9 UNARY_NOT           
                 10 POP_TOP             
                 11 LOAD_CONST               0 (None)
                 14 RETURN_VALUE      
    
    起初我认为它们总是给出相同的结果,但是
    not
    本身只是一个低优先级的逻辑求反运算符,它可以像其他布尔表达式一样容易地应用于b
    中的
    a,而
    not in
    是一个单独的运算符,以方便和清晰


    上面的分解很有启发性!显然,
    not
    是一个逻辑否定运算符,而b
    中的形式
    nota是特殊情况,因此它实际上没有使用一般运算符。这使得
    非b中的a与
    非b中的a在字面上是相同的表达式,而不仅仅是导致相同值的表达式。

    其他人已经非常清楚地表明,这两个语句在相当低的级别上是等效的

    然而,我认为还没有人足够强调,既然这让你有选择权,你应该

    选择使代码尽可能可读的格式。
    而且不一定对任何人来说都是可读的,即使这当然是一件好事。不,请确保代码尽可能可读,因为您是最有可能稍后返回此代码并尝试阅读它的人。

    它们的含义相同,但首选
    not in
    操作符:

    E713:成员资格测试应
    不在


    另请参阅,以了解非常类似的样式选择。

    请记住,这只是一个实现细节。我甚至在文档中找不到xs中提到的
    而不是x
    。@phant0m绝对;你认为
    不是xs中的x
    的方式是
    不是(xs中的x)
    。但是,它是通过将其解析为与
    x not in xs
    完全相同的字节码来实现的,这一事实非常清楚地表明,它们必须始终相同,而不是像
    not x==y
    vs
    x!=y
    应该给出相同的结果,但不必(取决于
    \uuuuu eq\uuuu
    \uu ne\uuuu
    的实现);其他Python实现(如Jython和IronPython)可以自由忽略或复制的编译时优化(它不是语言规范的一部分)。如果您在一个大型团队中工作,或者在一段时间内可能不会涉及到的代码上工作,那么很可能需要其他人来维护它。