[python] 프로세스를 X 번 실행하는 더 파이썬적인 방법

어느 것이 더 비단뱀입니까?

While 루프 :

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

For 루프 :

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

편집 : 중복되지 않는 이유는 ‘i’없이 범위를 실행하는 방법과 비교해 더 명확한 결정에 대한 답변이 있기 때문입니다.



답변

몸소:

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

필요하지 않은 경우 i. Python <3을 사용하고 루프를 여러 번 반복하려면 xrange미리 전체 목록을 생성 할 필요가 없으므로 사용 하십시오.


답변

for 루프는 더 명확하고 간결하게 수행하는 작업을 전달하기 위해 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 Python PEP 8-Style Guide for Python Code입니다. 입니다.

또한 for range 버전은 언어 참조tutorial 모두에서 사용되는 명시적인 예제 이지만이 경우 값이 사용됩니다. 이는 형식이 C 스타일 for 루프의 while 확장보다 더 친숙하다는 것을 의미합니다.


답변

루프 내에서 발생하는 부작용을 겪고 있다면 개인적으로 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__()


답변

무언가를 반복하는 정말 비단뱀적인 방법은 없습니다. 그러나 더 나은 방법입니다.

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

색인을 전달해야하는 경우 :

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

결과를 컬렉션으로 반환한다는 것을 고려하십시오. 따라서 결과를 수집해야하는 경우 도움이 될 수 있습니다.


답변