Python логика позади отрицания оператора if с оператором и в - PullRequest
0 голосов
/ 23 октября 2019

Я получил следующий код, где я застрял в рассуждениях за вложенной логикой:

if not ((0 <= x <=3) and (0 <= y <= 3)):
    print('A')
elif y < 1 or y > 2:
    print('B')
elif x < 1 or x > 2:
    print('C')
else:
    print('D')

Я пытаюсь определить, какие значения получит строка «D», но я не получаюпервое утверждение if. Я понимаю, что отрицание (0 <= x <= 3) равно (0> x> 3), но как мне продолжить вычислять оператор с оператором and? Означает ли это, что ни один из интервалов x и y не должен быть истинным? Я действительно застрял здесь.

Ответы [ 3 ]

1 голос
/ 23 октября 2019

Я пытаюсь определить, какие значения получит строка "D"

x, y = 2, 2

if not ((0 <= x <=3) and (0 <= y <= 3)):
    print('A')
elif y < 1 or y > 2:
    print('B')
elif x < 1 or x > 2:
    print('C')
else:
    print('D')

Вывод:

D

Если вы нене хотите продолжать отрицание, как if not (<cond1> and <cond2>): - вам нужно разложить условия по-разному и более управляемо .

0 голосов
/ 23 октября 2019

Первое утверждение может быть легче понять, если вы напишите его эквивалентно как:

if (not 0 <= x <= 3) or (not 0 <= y <= 3):
   ...

Ваш код будет проходить мимо него тогда и только тогда, когда 0 <= x <= 3 and 0 <= y <= 3.

Ваш код будет проходить мимо двух elif тогда и только тогда, когда 1 <= y <= 2 и 1 <= x <= 2.

Таким образом, ваш код будет печатать D тогда и только тогда, когда 0 <= x <= 3 and 0 <= y <= 3 and 1 <= y <= 2 and 1 <= x <= 2. В этом логическом утверждении есть избыточность;это эквивалентно: 1 <= x <= 2 and 1 <= y <= 2.

0 голосов
/ 23 октября 2019

Ваша загадка использует только цифры от 0 до 3 для проверки - вы можете легко проверить числа от -1 до 4, чтобы увидеть, какой вывод дается, и «откатить» свою логику - «проверив» свой путь в ваших условиях:

for x in range(-1,5):
    for y in range(-1,5):
        print(x,y,end=" -> ")
        if not ((0 <= x <=3) and (0 <= y <= 3)):
            print('A')
        elif y < 1 or y > 2:
            print('B')
        elif x < 1 or x > 2:
            print('C')
        else:
            print('D',x,y)

Выход:

-1 -1 -> A
-1 0 -> A
-1 1 -> A
-1 2 -> A
-1 3 -> A
-1 4 -> A
0 -1 -> A
0 0 -> B
0 1 -> C
0 2 -> C
0 3 -> B
0 4 -> A
1 -1 -> A
1 0 -> B
1 1 -> D 1 1     # here
1 2 -> D 1 2     # here
1 3 -> B
1 4 -> A
2 -1 -> A
2 0 -> B
2 1 -> D 2 1     # here
2 2 -> D 2 2     # here
2 3 -> B
2 4 -> A
3 -1 -> A
3 0 -> B
3 1 -> C
3 2 -> C
3 3 -> B
3 4 -> A
4 -1 -> A
4 0 -> A
4 1 -> A
4 2 -> A
4 3 -> A
4 4 -> A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...