哪个更pythonic?
While循环:
count = 0
while count < 50:
print "Some thing"
count = count + 1
对于循环:
for i in range(50):
print "Some thing"
编辑:不重复,因为这有答案可以确定哪个更清晰,而不是如何在不使用“ i”的情况下运行范围-即使最终结果是最优雅的
哪个更pythonic?
While循环:
count = 0
while count < 50:
print "Some thing"
count = count + 1
对于循环:
for i in range(50):
print "Some thing"
编辑:不重复,因为这有答案可以确定哪个更清晰,而不是如何在不使用“ i”的情况下运行范围-即使最终结果是最优雅的
Answers:
亲身:
for _ in range(50):
print "Some thing"
如果你不需要i
。如果您使用Python <3,并且想重复多次循环,请使用,xrange
因为不需要事先生成整个列表。
i
。
i
吗?
for循环绝对是Python风格的,因为它使用Python的更高级别的内置功能来更清楚,简洁地传达您正在做的事情。范围与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"
在这里使用repeat而不是range不太清楚,因为它不是一个众所周知的函数,而更加复杂,因为您需要导入它。如果需要参考,则主要的样式指南为PEP 20-The Zen of Python和PEP 8-Python代码样式指南。
我们还注意到,for range版本是在语言参考和教程中,尽管在这种情况下使用的是值。这确实意味着该形式肯定比C样式for循环的while扩展更熟悉。
for s in repeat('This is run 10 times', 10): print s
??
range()
twitter.com/raymondh/status/1144527183341375488
int
为每次迭代查找或创建不同的对象。但是,程序员的时间可能比执行时间更有价值。
如果您是在循环中发生副作用,我个人会考虑 range()
方法。
如果您关心循环中调用的任何函数的结果,那么我将寻求列表理解或map
方法。像这样:
def f(n):
return n * n
results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))
怎么样?
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))
考虑它返回结果作为一个集合。因此,如果您需要收集结果,它将有所帮助。