Подумайте о функции, которую я вызываю из-за ее побочных эффектов, а не возвращаемых значений (например, вывод на экран, обновление графического интерфейса, печать в файл и т. Д.).
def fun_with_side_effects(x):
...side effects...
return y
Теперь Pythonic использует списки для вызова этой функции:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Обратите внимание, я нигде не сохраняю список
Или мне следует называть эту функцию так:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Что лучше и почему?
python
list-comprehension
синан
источник
источник
for ... in
используется в обоих случаях, что приводит к таким вопросам, как этот!Ответы:
Это очень антипитонический поступок, и любой опытный питонист устроит вам ад. Промежуточный список выбрасывается после того, как он создается, и он потенциально может быть очень и очень большим, и, следовательно, его создание дорого.
источник
for
раньше, чтобы избавиться от негоif
).Вы не должны использовать понимание списка , потому что, как говорили люди, это создаст большой временный список, который вам не нужен. Следующие два метода эквивалентны:
с определением
consume
соitertools
страницы руководства :Конечно, последнее более понятно и понятно.
источник
map
возможно, не будете настолько интуитивно понятны, если раньше не занимались функциональным программированием.consume = collections.deque(maxlen=0).extend
Компоненты списков предназначены для создания списков. И если вы на самом деле не создаете список, вам не следует использовать его понимание.
Поэтому я бы выбрал второй вариант, просто перебирая список, а затем вызывая функцию, когда применяются условия.
источник
Второй лучше.
Подумайте о человеке, который должен понимать ваш код. С первой можно легко получить плохую карму :)
Вы можете пойти посередине между ними, используя filter (). Рассмотрим пример:
источник
lambda x : x > 3
.for el in (x for x in y if x > 3):
.el
иx
может иметь то же имя, но это может сбить с толку людей.Зависит от вашей цели.
Если вы пытаетесь выполнить какую-либо операцию с каждым объектом в списке, следует принять второй подход.
Если вы пытаетесь создать список из другого списка, вы можете использовать понимание списка.
источник
Ты можешь сделать
но это не очень красиво.
источник
Использование списка побочных эффектов уродливо, непитонично, неэффективно, и я бы не стал этого делать.
for
Вместо этого я бы использовал цикл, потому чтоfor
цикл указывает на процедурный стиль, в котором важны побочные эффекты.Но если вы абсолютно настаиваете на использовании понимания списка для его побочных эффектов, вам следует избегать неэффективности, используя вместо этого выражение генератора. Если вы абсолютно настаиваете на этом стиле, сделайте одно из этих двух:
или:
Это выражения-генераторы, и они не генерируют случайный список, который можно выбросить. я думаю
all
форма, возможно, немного более ясна, хотя я думаю, что обе они сбивают с толку и не должны использоваться.Я думаю, что это некрасиво, и я бы не стал делать это в коде. Но если вы настаиваете на реализации ваших циклов таким образом, я бы сделал это именно так.
Я склонен полагать, что понимание списков и тому подобное должно сигнализировать о попытке использовать что-то, хотя бы отдаленно напоминающее функциональный стиль. Добавление вещей с побочными эффектами, которые нарушают это предположение, заставит людей читать ваш код более внимательно, и я думаю, что это плохо.
источник
fun_with_side_effects
вернет True?itertools.consume
больше не существует, вероятно, потому, что использование понимания с побочными эффектами некрасиво.