реализация тернарного оператора в python с использованием и / или комбинаций - PullRequest
0 голосов
/ 07 ноября 2018

Я изучаю питон, используя отличную книгу Марка Лутца. Я сталкиваюсь с этим утверждением, что троичный оператор в Python, который фактически таков:

if a: 
   b
else: 
   c

можно записать двумя способами:

  1. b if a else c: использование нормального троичного синтаксиса python и

  2. ((a and b) or c): с использованием эквивалентной, но более хитрой and/or комбинации

Меня смущает второе представление, поскольку оно не соответствует моему инстинкту. Я попробовал эти 2 синтаксиса в интерактивной подсказке и нашел разные ответы для особого случая b = 0. (предположим, b = 0, a = 4, c = 20)

  1. 0 if 4 else 20 выходы 0
  2. ((4 and 0) or 20) выходы 20

Похоже, что 2 выражения являются эквивалентами для всех truthy значений b, но не эквивалентны для всех falsy значений b.

Я хочу знать, есть ли здесь что-то, чего мне не хватает. Мой анализ неверен? Почему в книге говорится, что эти два случая эквивалентны. Пожалуйста, просветите мой грубый ум. Я новичок в Python. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Мнение автора здесь иное, что следует учитывать. Позвольте мне попытаться объяснить с помощью кода и встроенных комментариев:

#This if condition will get executed always(because its TRUE always for any number) except when it is '0' which is equivalent to boolean FALSE.
#'a' is the input which the author intends to show here. 'b' is the expected output
if a: 
   print(b)
else: 
   print(c)

#equivalent
print(b) if a else print(c) 
print((a and b) or c)

Вы должны изменить вход и проверить выход. Принимая во внимание, что вы изменяете OUTPUT напрямую и пытаетесь проверить вывод, который не работает. Таким образом, вы проверяете неправильный путь, мое мнение. Вход здесь - это. Выход здесь б. Случай 1: б = 12 а = 1 с = 20

*Case 2:
b = 12
a = 0
c = 20*
*Dont change 'b'. Change only 'a' and test is the conceptual idea. Coz, 'b' is the output.*
0 голосов
/ 07 ноября 2018

Вы правы, второй подход хорош в большинстве случаев.

Из документации по питону:

До того, как этот синтаксис был введен в Python 2.5, распространенной была используйте логические операторы: [выражение] и [on_true] или [on_false]

Сразу после этого они упоминают:

"Однако эта идиома небезопасна, так как она может давать неправильные результаты, когда on_true имеет ложное логическое значение. Поэтому всегда лучше используйте ... если ... еще ... форму.

Вот ссылка: https://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator

Добавление краткого образца по запросу:

a = True
b = False
c = True

# prints False (for b) correctly since a is True
if a:
   print b
else: 
   print c

# prints False (for b) correctly since a is True
print b if a else c 

# prints True (for c) incorrectly since a is True and b should have been printed
print ((a and b) or c) 
...