Как понять понимание списка Python при использовании «и» или «или» в формуле деривации? - PullRequest
0 голосов
/ 25 мая 2019

Использование «и» или «или» в понимании списка, но результаты не были получены. Почему?

> [print(i) and print(i) for i in range(1)] 
0

> [print(i) or print(i) for i in range(1)]
0
0

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Это не имеет ничего общего со списком:

>>> print(0) and print(0)
0
>>> print(0) or print(0)
0
0

Это нормальное поведение логических операторов в Python :

Выражение x и y сначала оценивает x ; если x равен false, его значение возвращается

Выражение x или y сначала оценивает x ; если x истинно, возвращается его значение; в противном случае y оценивается и возвращается полученное значение.

(см. https://en.wikipedia.org/wiki/Short-circuit_evaluation).

Если вы знаете, что print(0) возвращает None:

>>> print(0) is None
0
True

А это:

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

У вас есть ответ:

  • and case: оцените print(0) (печатает 0 как побочный эффект), то есть false, и верните его значение (None)
  • or case: оцените print(0) (печатает 0), что ложно, а затем вычислите второе print(0) (печатает 0), возвращающее его значение (None).
0 голосов
/ 25 мая 2019

Операторы and и or поддерживают отложенную оценку или короткое замыкание.

В вашем первом примере:

[print(i) and print(i) for i in range(1)]

Сначала выполняется print(i), который записывает в стандартный вывод. Он ничего не возвращает (None). Теперь python знает, что это выражение является частью операции and. Поскольку None имеет ложное логическое значение, нет смысла оценивать 2-е print, поскольку первое из них потребуется для возврата истинного логического значения.

Со вторым:

[print(i) or print(i) for i in range(1)]

То же самое начинается. Так как or, 2-й print оценивается, потому что есть шанс, что он будет успешным. Вот почему два 0 пишутся на стандартный вывод.

Фактические результаты обоих теряются, поскольку понимание списка ни к чему не привязано. Результаты будут [None] для обоих. 2 логических оператора проверяют логические значения, но также возвращают задействованные объекты.

При x and y объект y всегда возвращается. С x or y,

  • , если x является "правдивым" объектом, возвращается x
  • в противном случае y возвращается
...