Python中的if语句中的OR和AND

时间:2014-09-29 17:38:42

标签: python if-statement boolean-expression

我正在尝试创建一个if语句,该语句在满足其中一个条件并且两个变量小于或大于特定数字时执行:

if (
    (opponentBoard[row][col] == const.MISSED) or 
    (opponentBoard[row][col] == const.HIT) or
    (row == 12)
   ) and ((row > 5) and (col < 6)):

使用此代码时,或者语句有效,但当它到达AND部分时,如果row小于5且col小于6,则它将转到语句的else部分。我希望如果行小于5且col大于6,则语句只会转到else。

4 个答案:

答案 0 :(得分:0)

也许这个:

if ((opponentBoard[row][col] == const.MISSED) or 
(opponentBoard[row][col] == const.HIT) or (row == 12)) and 
((row > 5) or (col < 6)):

答案 1 :(得分:0)

我将行和柱测试移到前面;您可以简化opponentBoard测试:

if row >= 5 and col <= 6 and (row == 12 or opponentBoard[row][col] in (const.MISSED, const.HIT):

所以必须满足三个条件

  • 行数为5或更大
  • 该列为6或更低
  • 其中一个:
    • 行号为12
    • 单元格单元格包含MISSED
    • 单元格单元格包含HIT

在所有其他情况下,不满足条件并执行else套件。

请注意>=<=的使用!

如果您在网格中可视化,if语句仅适用于标有x的单元格:

┌─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │0│1│2│3│4│5│6│7│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│0│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│1│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│2│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│3│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│4│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│5│x│x│x│x│x│x│x│ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│6│x│x│x│x│x│x│x│ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│7│x│x│x│x│x│x│x│ │
└─┴─┴─┴─┴─┴─┴─┴─┴─┘
如果没有elsexHIT区域MISS,则else语句将适用于其他所有单元格,第12行除外。

如果您希望x套件仅适用于未标有if row >= 5 and col <= 6: if row == 12 or opponentBoard[row][col] in (const.MISSED, const.HIT): # do something else: 的单元格,无论其状态如何,那么您需要拆分测试:

{{1}}

答案 2 :(得分:0)

if ((opponentBoard[row][col] == const.MISSED) or (opponentBoard[row][col] == const.HIT) or (row == 12)):
    if ((row > 5) and (col < 6)):
       exec_func();

通常你会尽量避免在每一行上花费太多,因为它会让人更难以看到发生的事情并推断它会导致什么。

答案 3 :(得分:0)

看起来你的方向比较错误。试试(row < 5) and (col > 6)

当编写这样复杂的布尔逻辑时,我喜欢将其拆分为单独的变量,例如

# tried to make up appropriate names but not sure how accurate they really are
cell_is_used = ((opponentBoard[row][col] == const.MISSED) or 
    (opponentBoard[row][col] == const.HIT) or
    (row == 12))

cell_in_bounds = row < 5 and col > 6

if cell_is_used and cell_in_bounds:
    # do your stuff...

我喜欢这种形式,因为在调试器中我可以查看不同的子表达式,并确保它们正在做我认为他们正在做的事情。它也更容易阅读和理解;有时我会注意到我只是通过尝试命名布尔表达式的不同部分而产生的错误。