Может ли каждое понимание списка быть продублировано в обычном операторе if? - PullRequest
0 голосов
/ 27 апреля 2019

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

Например, можно ли написать то же самое без понимания списка? Если так, возможно ли это без использования else?

a, b = set(), set()
[a.add(i) for i in range(5) if i % 2 == 0 or b.add(i)]

В частности, я демонстрирую ленивую оценку «или» в этом случае, но я не могу понять, как продемонстрировать это вне понимания списка, потому что при использовании «if» в нормальном цикле for, set.add () - это объект, который оценивается в логическом контексте вместо фактического выражения ( i % 2 == 0 ).

1 Ответ

3 голосов
/ 27 апреля 2019

Ваше понимание списка такое же, как:

for i in range(5):
    if i % 2 == 0 or b.add(i):
        a.add(i)

Таким образом, оператор if ничем не отличается от понимания списка.

Ваш код может быть заменен на:

for i in range(5):
    if i % 2 == 0:
        a.add(i)
    else:
        b.add(i)

Я бы посчитал ваш предыдущий пример неоднозначным с точки зрения чтения.Поскольку b.add(i) выполняется на месте, он всегда возвращает None (что интерпретируется как False), поэтому он ничего не делает для условия.Второй фрагмент кода гораздо удобнее для чтения, поскольку ясно, каково ваше намерение.

...