Один вкладыш с вложенными условиями if / else - PullRequest
2 голосов
/ 07 апреля 2020

Реальный python noob здесь, и я немного озадачен, глядя на результат этого вложенного if / else one-liner:

>>> num_arr = [5, 10, 15]
>>> [i**2 if i == 10 else i-5 if i < 7 else i+5 for i in num_arr]
[0, 100, 20]

Разве результат не должен быть [0, 15, 20] поскольку 10 больше 7?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2020

Как я уже упоминал в комментариях, «правильная» версия (обратите внимание на круглые скобки):

[(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 ...]
1 голос
/ 07 апреля 2020

Вот расширенная версия однострочного:

for i in num_arr:
    if i == 10:
        i ** 2
    else:
        if i < 7:
            i - 5
        else:
            i + 5

Однострочный оператор if в основном: [action] if [condition] else [action]. Другими словами, сделайте это, если указанное условие выполнено. В противном случае выполните это действие.

Это причина, по которой мне не нравятся однострочники, потому что они становятся меньше Pythoni c. Приведенный выше код более подробный, но его легче понять.

0 голосов
/ 07 апреля 2020

Значение, если условие истинно, указывается перед if, а значение, если False, следует за остальным (см. https://docs.python.org/2.5/whatsnew/pep-308.html).

Результатом является i-5 для 5 потому что мне не 10, но это <7 </p>

Результатом является i ** 2 для 10, потому что я == 10

Результатом является i + 5 для 15, потому что я не 10, и это не <7 </p>

Следовательно [0, 100, 20]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...