【问题标题】:Operators in Python If statementPython If 语句中的运算符
【发布时间】:2014-10-18 04:55:41
【问题描述】:

这是我拥有的一个简单的 sn-p 代码:

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11']
>>> for i in test:
...     if '11' in i:
...         print i
...
rertrtt11

按预期工作。现在要捕获包含 11 或 12 的元素,我这样做:

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11']
>>> for i in test:
...     if '11' or '12' in i:
...         print i
...
asas
asa12
sdsdsd12
vccvcvcv
rertrtt11

这出乎意料。我希望只捕获其中包含 11 或 12 的元素,但输出包含所有元素。

在尝试进行故障排除时,我尝试了 and 运算符来尝试了解行为:

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11']
>>> for i in test:
...     if '11' and '12' in i:
...         print i
...
asa12
sdsdsd12

现在我完全糊涂了,因为我期待一个空集,因为其中没有包含 11 和 12 的元素。我对操作符在 python 中的功能的理解完全错误吗?

【问题讨论】:

    标签: python if-statement operators


    【解决方案1】:

    '11' or '12' in i 是这样评估的

    ('11') or ('12' in i)
    

    所以,第一部分总是真实的。这就是为什么所有这些都被打印出来的原因。第二种情况,

    ('11') and ('12' in i)
    

    在这里,第一部分始终是 Truthy,因此它只打印包含 12 的项目。你可能想做

    if '11' in i and '12' in i:
    

    if all(item in i for item in ('11', '12')):
    

    要拥有或条件,可以使用any函数,像这样

    if any(item in i for item in ('11', '12')):
    

    【讨论】:

      【解决方案2】:

      为了给你一个小而简单的修复,你应该尝试:

      if (('11' in i) or ('12' in i)):
          #do something 
      

      if (('11' in  i) and ('12' in i)):
          #do another thing 
      

      这不是意外错误,请参考文档

      【讨论】:

        【解决方案3】:

        orand 运算符不会像您认为的那样链接。

        if '11' and '12' in i: #this problem is the same for or
        

        第一个 python 将执行'12' in i,因为in 的优先级高于and。然后它将and 使用'12'in 测试返回,它可以隐式转换为True

        要获得您真正想要的效果,您需要这样做:

        if '11' in i and '12' in i: # same for or
        

        这将正确检查'11'是否在i中,然后如果'12'i中,然后and/or这两个测试的结果一起。

        【讨论】: