Ответ 1
Лично:
for _ in range(50):
print "Some thing"
если вам не нужен i
. Если вы используете Python < 3, и вы хотите многократно повторять цикл, используйте xrange
, поскольку вам не нужно заранее генерировать весь список.
Что больше pythonic?
Пока цикл:
count = 0
while count < 50:
print "Some thing"
count = count + 1
Для цикла:
for i in range(50):
print "Some thing"
Изменить: не дублировать, потому что у этого есть ответы, чтобы определить, что является более ясным, и как запустить диапазон без "i" - хотя это оказалось самым элегантным
Лично:
for _ in range(50):
print "Some thing"
если вам не нужен i
. Если вы используете Python < 3, и вы хотите многократно повторять цикл, используйте xrange
, поскольку вам не нужно заранее генерировать весь список.
Если вы столкнулись с побочными эффектами, которые происходят в цикле, я лично подойду для подхода range()
.
Если вы заботитесь о результатах любых функций, которые вы вызываете в цикле, я бы пошел на понимание списка или map
. Что-то вроде этого:
def f(n):
return n * n
results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))
Цикл for определенно более pythonic, так как он использует более высокий уровень Python, встроенный в функциональность, чтобы передать то, что вы делаете как более четко, так и кратко. Накладные расходы по диапазону vs 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.
Мы также отмечаем, что версия диапазона - это явный пример, используемый как в ссылке на язык, так и tutorial, хотя в этом случае используется значение. Это означает, что форма должна быть более знакомой, чем расширение цикла цикла C.
Как насчет?
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__()
Не существует действительно пифонического способа повторения чего-то. Однако это лучший способ:
map (индекс лямбда: do_something(), xrange (10))
если вам нужно передать индекс, то:
map (lambda index: do_something (index), xrange (10))
Учтите, что он возвращает результаты в виде коллекции, поэтому, если вам нужно собрать результаты, которые это может помочь.