Как я уже упоминал в комментариях, «правильная» версия (обратите внимание на круглые скобки):
[(i**2 if i == 10 else i-5) if i < 7 else i+5 for i in num_arr]
Ваша «проблема» связана с цепочкой ваших if
операторов, которые выполняются в Engli sh порядок чтения (слева направо). Таким образом, это выглядит так:
[i**2 if i == 10 else (i-5 if i < 7 else i+5) for i in num_arr]
- , где
i=5
, i != 10
в «первом выражении», поэтому вы переходите к else
; где i < 7
, чтобы вы получили i-5
, или 0
- , где
i=10
, i == 10
, чтобы вы получили i**2
, или 100
- , где
i=15
i != 10
, поэтому вы переходите на else
, где i
равно , а не меньше 7
, поэтому вы получаете i+5
или 20
Из документации:
Чтобы сделать семантику очень ясной, понимание списка эквивалентно следующему Python коду:
for expr1 in sequence1:
for expr2 in sequence2:
...
for exprN in sequenceN:
if (condition):
# Append the value of
# the expression to the
# resulting list.
Это означает, что ваш выглядит так:
[[expr1] if [condition] else [[expr2] if [condition] else [expr3]] for ...]