Каков порядок вычисления условного выражения в Python? - PullRequest
1 голос
/ 22 марта 2012

Я знаю, что условное выражение в Python - это X, если C еще Y, но у меня возникли некоторые проблемы с его использованием.

У меня есть два кода для сравнения.

Код1:

def fun(p):
    if len(p) >= 2:
        p[1] = 'Ok'
    else:
        p.append('Ok')
p = [1]
fun(p)
print p

Вывод кода 1:

[1, 'Ok']

Код 2:

def fun(p):
    (p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')

p = [1]
fun(p)
print p

Вывод кода 2:

    (p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
      ^
SyntaxError: invalid syntax

Я знаю в коде 1, формат которого "если C: X else: Y", порядок оценки:

  1. C
  2. X
  3. Y

Код 2 вызывает синтаксическую ошибку, причина может быть в том, что p [1] не существует.Поэтому я предполагаю, что формат «X, если C иначе Y» оценивается следующим образом:

  1. X
  2. C
  3. Y

Но это только мое предположение.Кто-нибудь знает реальную причину, по которой код 2 неправильный, а код 1 правильный?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Причина, по которой у вас есть SyntaxError, заключается в том, что Python различает выражения и выражения .

Назначения, как

p[1] = 'Ok'

являются операторами и не могут быть частью выражения , включая условное выражение. См. В чем разница между выражением и оператором в Python? для получения дополнительной информации.

Порядок оценки в него не входит - SyntaxError s происходит до любого кода , когда выполняется его анализ.

В обоих if выражениях и условных выражениях порядок вычислений ether

  1. Состояние
  2. Правдивое утверждение

или

  1. Состояние
  2. Ложное утверждение

Итак, в

if condition:
    true_statement
else:
    false_statement

или

true_statement if condition else false_statement

только истинное или выражение fase оценивается в зависимости от истинности условия.

0 голосов
/ 22 марта 2012

Назначение не является выражением (другие указали на это). Отсюда синтаксическая ошибка.

Относительно вашего вопроса относительно порядка оценки :

В выражениях if-else (!) Сначала оценивается операнд условия, затем оценивается либо тогда-операнд (крайний левый), либо операнд else (крайний правый). Другой операнд не оценивается.

В выражениях или операнды вычисляются от крайнего левого до крайнего правого (a or b or c or d or ...), но только до тех пор, пока не будет найден один, булево значение которого равно True. Остальные выражения не оценены.

В выражениях и операнды оцениваются от крайнего левого до крайнего правого (a and b and c and d and ...), но только до тех пор, пока не будет найден один, булево значение которого равно False. Остальные выражения не оценены.

Внутренние выражения оцениваются перед внешними выражениями (конечно): third(second(first()))

В во всех остальных случаях (a() + b(), f(g(), h()), a[b[c]] = d() + e) порядок определяется как , указанный . Обычно это слева направо, за исключением присвоения (где оно находится справа перед левым).

0 голосов
/ 22 марта 2012

Как указывает Дэн Д., вы не можете иметь выражения в контекстах выражений.

В интересах обучения - я не рекомендую делать это таким образом - я покажу вам, как выможно использовать встроенный X if C else Y, чтобы выполнить то, что вы пытаетесь сделать:

def fun(p):
    p.__setitem__(1, 'Ok') if len(p) >= 2 else p.append('OK')

Как видите, ваша первая версия гораздо более читабельна.

...