Более Pythonic способ запустить процесс X раз - PullRequest
68 голосов
/ 24 ноября 2010

Что является более питоническим?

Пока цикл:

count = 0
while count < 50:
    print "Some thing"
    count = count + 1

Для цикла:

for i in range(50):
    print "Some thing"

Редактировать: не дублировать, потому что здесь есть ответы, чтобы определить, что лучше, в отличие от того, как запустить диапазон без «i» - хотя это и оказалось самым элегантным

Ответы [ 5 ]

85 голосов
/ 24 ноября 2010

Лично:

for _ in range(50):
    print "Some thing"

, если вам не нужно i.Если вы используете Python <3 и хотите многократно повторять цикл, используйте <code>xrange, так как нет необходимости генерировать весь список заранее.

2 голосов
/ 15 декабря 2014

Цикл for определенно более питоничен, поскольку использует встроенную функциональность Python более высокого уровня, чтобы передать то, что вы делаете, более четко и кратко.Издержки range против xrange и присвоения неиспользованной переменной i возникают из-за отсутствия оператора, подобного оператору Verilog repeat.Основная причина, по которой стоит придерживаться решения для диапазона, заключается в том, что другие способы более сложны.Например:

from itertools import repeat

for unused in repeat(None, 10):
    del unused   # redundant and inefficient, the name is clear enough
    print "This is run 10 times"

Использование повторения вместо диапазона здесь менее понятно, потому что это не так хорошо известная функция, и более сложное, потому что вам нужно импортировать ее.Основными руководствами по стилю, если вам нужна ссылка, являются PEP 20 - Zen of Python и PEP 8 - Руководство по стилю для кода Python .

Мы также отмечаем, что версия для диапазона является явным примером, используемым как в справочнике по , так и в учебнике , хотя в этом случае используется значение.Это означает, что форма обязана быть более знакомой, чем в то время как расширение цикла в стиле C для.

1 голос
/ 24 ноября 2010

Если вам нужны побочные эффекты, возникающие в цикле, я бы лично выбрал подход range().

Если вам небезразличен результат выполнения любых функций, которые вы вызываете в цикле, ябы пойти на понимание списка или map подход.Как то так:

def f(n):
    return n * n

results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))
0 голосов
/ 09 июня 2015

Как насчет?

while BoolIter(N, default=True, falseIndex=N-1):
    print 'some thing'

или более уродливо:

for _ in BoolIter(N):
    print 'doing somthing'

или если вы хотите поймать последний раз через:

for lastIteration in BoolIter(N, default=False, trueIndex=N-1):
    if not lastIteration:
        print 'still going'
    else:
        print 'last time'

где:

class BoolIter(object):

    def __init__(self, n, default=False, falseIndex=None, trueIndex=None, falseIndexes=[], trueIndexes=[], emitObject=False):
        self.n = n
        self.i = None
        self._default = default
        self._falseIndexes=set(falseIndexes)
        self._trueIndexes=set(trueIndexes)
        if falseIndex is not None:
            self._falseIndexes.add(falseIndex)
        if trueIndex is not None:
            self._trueIndexes.add(trueIndex)
        self._emitObject = emitObject


    def __iter__(self):
        return self

    def next(self):
        if self.i is None:
            self.i = 0
        else:
            self.i += 1
        if self.i == self.n:
            raise StopIteration
        if self._emitObject:
            return self
        else:
            return self.__nonzero__()

    def __nonzero__(self):
        i = self.i
        if i in self._trueIndexes:
            return True
        if i in self._falseIndexes:
            return False
        return self._default

    def __bool__(self):
        return self.__nonzero__()
0 голосов
/ 15 декабря 2014

Нет действительно питонного способа повторения чего-либо.Однако это лучший способ:

map(lambda index:do_something(), xrange(10))

Если вам нужно передать индекс, то:

map(lambda index:do_something(index), xrange(10))

Учтите, что он возвращает результаты в виде коллекции.Так что, если вам нужно собрать результаты, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...