Python список недоразумений - PullRequest
2 голосов
/ 27 января 2020

В этом примере что-то не так:

item = [x**2 if x %2 == 0 for x in range(10)]

Но я могу написать так:

item = [x**2 if x % 2 == 0 else x**3 for x in range(10)]

Или:

item = [x**2 for x in range(10) if x % 2 == 0]

Насколько важен порядок здесь и почему я не могу использовать 'if' без 'else' в первом примере?

Ответы [ 2 ]

5 голосов
/ 27 января 2020

Здесь есть два разных, не связанных между собой использования ключевого слова if:

  1. Как часть условного выражения в форме ... if ... else ...:

    item = [<b>x**2 if x % 2 == 0 else x**3</b> for x in range(10)]
  2. В качестве фильтра для понимания списка в форме if ...:

    item = [x**2 for x in range(10) <b>if x % 2 == 0</b>]

В первом примере у вас есть некорректное условное выражение что отсутствует его else. Далее семантика другая. В 1) вы получаете некоторое значение в списке для каждого значения в range(10). В 2) вы только получаете значение в списке для четных значений.

1 голос
/ 27 января 2020

Это происходит потому, что если вы поместите if в первую часть, которая определяет значение, а if считается троичным оператором.

Это означает, что вы не можете получить его без другого точно так же, как вы не можете написать

item = 2 if other_item == 3

Поскольку правая сторона оценивается как ... что, когда other_item не равно 3?

Итак, вам нужно что-то вроде

item = 2 if other_item == 3 else 4

Ваш пример такой же.

Если вместо этого у вас есть это в конце, это условие, которое полностью исключает значение, поэтому от вас не ожидается альтернативы: вы в основном говорите «не включайте это значение в результаты».

...