2010-11-24 3 views
56

어느 쪽이 더 파이썬인가?프로세스를 실행하는 Python 방법 자세히 X times

루프 동안 :

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

편집 : For 루프

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

이 명확 결정에 대한 답을 가지고 있기 때문에 중복되지는 대 방법이없는 범위를 실행합니다 '나는'- 비록 그것이 결국 가장 우아한 것이 었습니다.

+7

Upvoting 아래 표를 보완하기 위해 : 라이오넬이이 질문을한다면, 다른 사람들은 같은 질문을 가지고 있으며, 아래의 답이 유용 할 것입니다. – EOL

+2

"Pythonic"용어는 남용되고 있습니다. 그것은 "읽을 수있는"그리고 "쉽게 이해할 수있는"것에 대한 synonim입니다. 적어도 파이썬에서. – darioo

+0

[iterator 변수없이 범위 루프 용 Python을 구현할 수 있습니까?] (http://stackoverflow.com/questions/818828/is-it-possible-to-implement-a-python-for- 루프가없는 반복기 변수) –

답변

72

는 :

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

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

+10

_ gettext 번역 함수에 매핑되는 것을주의하십시오. –

+6

'_' 변수에 +1. 이것이 제가 제안했을 것입니다. – EOL

+0

이 답변을 주셔서 감사합니다; 이것은 "for"에 사용되지 않은 변수가 있기 때문에 for-loop를 사용하지 않는 주된 이유입니다. – Lionel

1

당신이 루프 내에서 발생하는 ide 효과는 개인적으로 range() 접근 방식을 사용합니다.

루프 내에서 호출하는 함수의 결과에 신경 쓰면 목록 이해 또는 map 접근 방식을 사용합니다. 이런 식으로 뭔가 : 개인적으로

def f(n): 
    return n * n 

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

결과 = (범위 (50)의 i에 대한) –

+1

결과 = itertools.imap (f, range (50)) –

+0

@ralu 반복되거나 무작위로 결과에 접근한다. – aaronasterling

-6

무언가를 반복하는 아주 냉담한 방법은 없습니다.

지도 : 그러나, 그것은 더 나은 방법이다 (람다 인덱스 :) (do_something, xrange (10))

당신이 다음 인덱스를 통과해야하는 경우 :

지도 (람다 지수 : do_something (색인), xrange (10))

결과를 수집해야하므로 결과를 수집하는 것이 도움이 될 수 있다고 생각하십시오.

+0

이것은 실제로 더 좋지 않습니다 (함수 호출 오버 헤드, 덜 알려진 람다 식, 목록에서 사용되지 않은 결과 수집). 10은 반복 가능하지 않습니다. –

+0

예, xrange (10)은 10이 아닙니다. 함수를 작성하거나 루프를 만들 필요가 없기 때문에 더 낫다고 말했습니다. 그러나, 내가 말했듯이, 진짜 파이썬적인 방법은 없습니다. 코드를 변경했습니다. 고마워요. –

1

for 루프는 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" 

대신 범위의 반복을 사용하여 여기에 덜 분명하다. 참조 스타일이 필요한 경우 기본 스타일 가이드는 PEP 20 - The Zen of PythonPEP 8 - Style Guide for Python Code입니다.

또한 범위 버전은 language referencetutorial에 사용 된 명시적인 예입니다.이 경우 값이 사용됩니다. 이것은 폼이 C 스타일 for 루프의 while 확장보다 익숙해 져야 함을 의미합니다.

+0

반복 된 것을 직접 사용하는 것이 낫지 않을까요? 예를 들어'for s in repeat ('10 회 실행', 10) : print s' ?? – F1Rumors

+0

틀림없이! 그러나 샘플 코드의 인쇄본은 반복되는 코드 섹션의 예일 뿐이므로 중앙 개체가 없을 수도 있습니다. –

-4

어때요?

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__() 
관련 문제