어느 것이 더 비단뱀입니까?
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))
결과를 컬렉션으로 반환한다는 것을 고려하십시오. 따라서 결과를 수집해야하는 경우 도움이 될 수 있습니다.