更多Pythonic方式运行进程X次

时间:2010-11-24 08:10:25

标签: python loops

哪个更pythonic?

while循环:

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

For循环:

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

编辑:不重复,因为这有答案可以确定哪个更清楚,而不是如何在没有'i'的情况下运行范围 - 尽管最终是最优雅的

5 个答案:

答案 0 :(得分:83)

个人:

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

如果您不需要i。如果你使用Python&lt; 3,你想重复循环很多次,使用xrange,因为不需要事先生成整个列表。

答案 1 :(得分:1)

如果您正处理循环内发生的副作用,我个人会采用range()方法。

如果你关心你在循环中调用的任何函数的结果,我会选择列表理解或map方法。像这样:

def f(n):
    return n * n

results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))

答案 2 :(得分:1)

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"

在这里使用repeat而不是range不太清楚,因为它不是一个众所周知的函数,而且更复杂,因为你需要导入它。如果您需要参考,主要的样式指南是PEP 20 - The Zen of PythonPEP 8 - Style Guide for Python Code

我们还注意到for range版本是language referencetutorial中使用的显式示例,但在这种情况下使用了该值。它确实意味着表单必然比C-style for循环的while扩展更熟悉。

答案 3 :(得分:-3)

怎么样?

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__()

答案 4 :(得分:-5)

没有一种真正的pythonic方式可以重复某些事情。 但是,这是一种更好的方式:

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

如果你需要传递索引,那么:

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

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

相关问题