С каждым днем я люблю питона все больше и больше.
Сегодня я писал такой код:
for i in xrange(N):
do_something()
Я должен был сделать что-то N раз. Но каждый раз не зависел от значения i
(индексная переменная). Я понял, что создаю переменную, которую никогда не использовал ( i
), и подумал: «Безусловно, существует более питонический способ сделать это без необходимости этой бесполезной индексной переменной».
Итак ... вопрос в том: знаете ли вы, как выполнить эту простую задачу более (питонически) красиво?
coding-style
for-loop
python
Мануэль Араос
источник
источник
range
вместо этого.Ответы:
Немного более быстрый подход, чем цикл
xrange(N)
:источник
Используйте переменную _, как я узнал, когда задавал этот вопрос , например:
источник
Я просто использую
for _ in range(n)
, это прямо к делу. В Python 2 будет сгенерирован весь список огромных чисел, но если вы используете Python 3, это не проблема.источник
Так как функция является первоклассным гражданином, вы можете написать небольшую оболочку (из ответов Алекса)
тогда вы можете передать функцию в качестве аргумента.
источник
_ - это то же самое, что и x. Однако это идиома Python, которая используется для обозначения идентификатора, который вы не собираетесь использовать. В python эти идентификаторы не запоминаются и не выделяют место, как переменные в других языках. Это легко забыть. Это просто имена, которые указывают на объекты, в данном случае целое число на каждой итерации.
источник
Я нашел различные ответы очень элегантными (особенно ответы Алекса Мартелли), но я хотел измерить производительность из первых рук, поэтому я подготовил следующий сценарий:
Я также придумал альтернативное решение, которое основано на Мартелли и использует
map()
для вызова функции полезной нагрузки. Хорошо, я немного обманул, потому что я взял на себя свободу заставить полезную нагрузку принимать параметр, который отбрасывается: я не знаю, есть ли способ обойти это. Тем не менее, вот результаты:таким образом, использование карты дает улучшение примерно на 30% по сравнению со стандартным циклом и на 19% больше, чем у Мартелли.
источник
Предположим, что вы определили do_something как функцию, и вы хотите выполнить это N раз. Может быть, вы можете попробовать следующее:
источник
fn() for fn in itertools.repeat(do_something, N)
и сохранить предварительную генерацию массива ... это моя любимая идиома.Как насчет простого цикла while?
У вас уже есть переменная; почему бы не использовать его?
источник