运行进程X次的最Pythonic方式[关闭]

问题描述 投票:0回答:5

哪个更Pythonic?

While循环:

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

For循环:

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

编辑:不重复,因为这有答案来确定哪个更清晰,以及如何在没有“i”的情况下运行范围——尽管这最终是最优雅的

python loops anti-patterns
5个回答
150
投票

个人:

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

如果你不需要

i
。如果您使用 Python < 3 and you want to repeat the loop a lot of times, use
xrange
,因为无需事先生成整个列表。


3
投票

for 循环绝对更Pythonic,因为它使用Python 的更高级别的内置功能来更清晰、更简洁地传达您正在做的事情。 range 与 xrange 的开销以及分配未使用的

i
变量的开销源于缺乏像 Verilog 的
repeat
语句这样的语句。坚持使用 for range 解决方案的主要原因是其他方法更加复杂。例如:

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 - The Zen of PythonPEP 8 - Python Code 风格指南

我们还注意到,for range 版本是语言参考教程中使用的明确示例,尽管在这种情况下使用了该值。这确实意味着该形式肯定比 C 样式 for 循环的 while 扩展更熟悉。


2
投票

如果您追求循环内发生的副作用,我个人会选择

range()
方法。

如果您关心循环中调用的任何函数的结果,我会选择列表理解或

map
方法。像这样的东西:

def f(n):
    return n * n

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

-7
投票

怎么样?

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

-7
投票

没有一种真正的 Python 方式来重复某些事情。 然而,这是一个更好的方法:

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

如果需要传递索引则:

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

考虑它以集合形式返回结果。 因此,如果您需要收集结果,它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.