2015-01-20 5 views
0

Я пришел к очень неприятному примеру оператора if-else в python, где код выглядел неплохо, но результат был совершенно иным, чем ожидалось. Вот короткая версия:python if - else приоритет оператора

print 1 + 4 if None else 3 # prints 3 

Operator Precedence Глядя на стол, кажется, что «если - то еще» имеет почти самый низкий приоритет.

Есть ли что-нибудь особенное с «if-else», которое обрабатывает все, что находится слева от «if», как одно выражение?

+3

Как ни странно, ваши C++ пример печатает '4' независимо от' + 'и'? ' 'С относительный приоритет. –

+5

Разве вы не ответили на свой вопрос?Причина, по которой вы видите это поведение, в том, что оператор if/else имеет самый низкий приоритет (за исключением лямбда). – BrenBarn

+3

Я думаю, что скобка - это то, что вы ищете, не так ли? Просто оберните «(4, если нет еще 3)» в скобках, и вы закончили –

ответ

3

Ну, None всегда ложно, так Тат вы всегда получите 3.

1 + 4 будет результат, если вы использовали истинное значение вместо None:

1 + 4 if True else 3 

дает 5.

Именно так из-за низкого приоритета: это то же самое, что и

(1 + 4) if ... else 3 

как знаете - приоритет if ... else ниже, чем у +.

0

Возможно, вы ищете:

print 1 + (4 if None else 3) 

который печатает 4

+0

Я согласен с этим ответом ... –

2

Разница находится в порядке, а не старшинства. Как оператор if ... else в Python, так и оператор ? ... : оператора c c имеют крайне низкий приоритет (ниже + и -, во всяком случае).

Python: result_if_true if conditional else result_if_false

с: conditional ? result_if_true : result_if_false

Рассмотрим порядок вашего примера:

print 1 + 4 if None else 3 

так же, как:

print (1 + 4) if (None) else (3) 

что переводится с как:

cout << (0) ? (1 + 4) : (3); 

где None переведено на 0 с None является ложным в Python.

Чтобы получить с в Python ...

#include <iostream> 
using namespace std; 

int main() { 
    int x = (1 + 0) ? (4) : (3); 
    cout << x; // prints 4 
    return 0; 
} 

Переводит на:

x = 4 if 1 + 0 else 3 
print x 
Смежные вопросы