python中的多个条件语法

时间:2012-05-17 21:45:05

标签: python syntax logic

我有以下代码条件

 if len(content_tags) >= 1 or tags_irrelevant == 'yes'\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

问题在于逻辑和语法。如果if len(sentences)不是>= 3,我希望将其评估为false。但这不会发生。我想我可能需要在某处或某些地方使用一些括号。帮助!

3 个答案:

答案 0 :(得分:1)

and has a higher precidence than or,因此首先评估and,然后评估or,这意味着您在文本中描述的逻辑不是您在代码中描述的逻辑。

如果您希望将第一个or视为单个案例,请在其周围使用括号。

if (len(content_tags) >= 1 or tags_irrelevant == 'yes')\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

那就是说,你没有给我们详细解释你想要的逻辑行为,所以我建议你坐下来正确地解决这个问题。

如果您需要测试您的逻辑,那么使用一个打印出来的简单测试函数,这样您就可以知道评估的内容和时间。

>>> def test(bool):
...    print(bool)
...    return bool
... 
>>> if test(1) or test(2) and test(3) and test(4) and test(False):
...    print("Success")
... 
1
Success
>>> if (test(1) or test(2)) and test(3) and test(4) and test(False):
...     print("Success")
... 
1
3
4
False

您可以清楚地看到评估的第一件事是第一件and,然后它会尝试评估and的左侧,因此获得or。它会尝试对此进行评估,获取第一个值True,然后短路,将True返回and,这也会短路,返回True(井,实际上是1,但是出于本例的目的,True。当括号在那里时,它会以你想要的方式进行评估。

答案 1 :(得分:0)

or部分导致您的问题。只是封装它:

if (len(content_tags) >= 1 or tags_irrelevant == 'yes')\
   and lengthproblem == 0\
   and guess_language.guessLanguage(testlanguage) == 'en'\
   and len(sentences) >= 3:

在这种情况下,我过去倾向于使用中间bool将最终的逻辑语句抽象到更高的级别,例如:

multi_tags = len(content_tags) >= 1
ignore_tags = tags_irrelevant == 'yes'
tags_ok = multi_tags or ignore_tags 

length_ok = lengthproblem == 0
is_english = guess_language.guessLanguage(testlanguage) == 'en'
enough_sentences = len(sentences) >= 3

# Notice how much easier the following is to read!
if tags_ok and length_ok and is_english and enough_sentences:
    pass

[这是人们学不会从博客那里学到的东西,而是从调试糟糕的,几十年前遗留代码的痛苦中解决了if语句和循环终止条件中的大量条件子句。哦,反斜杠也消失了。]

答案 2 :(得分:0)

根据python operator precedence rules运算符优先于运算符。也就是说,如果您希望 len(句子)> = 3 部分支配答案,您应该将其余部分隔离在括号中:

if (len(content_tags) >= 1 or tags_irrelevant == 'yes' and lengthproblem ==0 and guess_language.guessLanguage(testlanguage) =='en') and len(sentences) >= 3