Я изучал понимание списка и наткнулся на возможность добавления нескольких условий. Я не знаю, какое поведение я ожидал, но я не могу объяснить, что я получаю. Почему 1 превращается в 3, 2 остается в 2, а 3 превращается в 6?
a = [x if x % 2 == 0 else x * 2 if x % 3 == 0 else x * 3 for x in range(1, 11)]
Выход:
[3, 2, 6, 4, 15, 6, 21, 8, 18, 10]
Обратите внимание, что это не столько «стандартное» условие, используемое при распознавании списка (которое фильтрует ввод, поэтому вывод обычно содержит меньше элементов), а вложенное троичное условие. Этот пример можно использовать и за пределами понимания списка.
Это также попадает в категорию: не делайте этого, если только вы не пытаетесь принять участие в запутанном конкурсе Python (для которого это плохая запись, но все же).
Для 1 это выглядит так:
1 % 2 = 1, так что это относится к пункту else,
1 % 3 = 1, так что это также относится к пункту else
И он попадает в x*3 который 1*3 = 3
Когда вы пишете x if condition else y, вы получаете x, только если условие истинно. Итак, поскольку условие ложно, вы переходите к пункту else. Вы можете посмотреть на это так:
x if x % 2 == 0 else (x * 2 if x % 3 == 0 else x * 3) for x in range(1, 11)
Переписывание в виде цикла и преобразование условных выражений в полные операторы if/elif/else может помочь объяснить это:
a = []
for x in range(1, 11):
if x % 2 == 0:
temp = x
elif x % 3 == 0:
temp = x * 2
else:
temp = x * 3
a.append(temp)
Вы должны хотя бы попытаться объяснить код, который вы написали.