更多Pythonic方法来运行一个过程X次

哪个更pythonic?

while循环:

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

For循环:

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

编辑:不重复,因为这有答案,以确定哪一个更清晰,与如何运行一个范围没有“我” – 即使这最终是最优雅的

亲自:

 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内置的更高级function来更清晰简洁地传达你正在做的事情。 范围与xrange的开销,以及分配一个未使用的ivariables,源于没有像Verilog的repeat陈述这样的陈述。 坚持范围解决scheme的主要原因是其他方法更复杂。 例如:

 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" 

使用重复而不是范围在这里是不太清楚,因为它不是一个众所周知的function,更复杂,因为你需要导入它。 如果您需要参考,主要风格指南是PEP 20 – Python的Zen和PEP 8 – Python代码的风格指南 。

我们还注意到,范围版本是在语言参考和教程中使用的一个明确的例子,尽pipe在这种情况下使用了该值。 这确实意味着forms必然比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__() 

重复一些东西并不是一种真正的pythonic方式。 但是,这是一个更好的方法:

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

如果你需要通过索引然后:

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

考虑到它将结果作为集合返回,所以如果您需要收集结果,可以提供帮助。