문제

없이 따라갈 수 있습니까? i?

for i in range(some_number):
    # do something

만약 당신이 단지 N 시간을하고 싶고 반복자가 필요하지 않은 경우.

도움이 되었습니까?

해결책

내 머리 꼭대기에서, 아니요.

당신이 할 수있는 최선은 다음과 같은 것입니다.

def loop(f,n):
    for i in xrange(n): f()

loop(lambda: <insert expression here>, 5)

하지만 나는 당신이 추가로 살 수 있다고 생각합니다 i 변하기 쉬운.

다음은 다음을 사용하는 옵션입니다 _ 실제로는 변수가 또 다른 변수입니다.

for _ in range(n):
    do_something()

주목하십시오 _ 대화식 파이썬 세션에서 반환 된 마지막 결과가 할당됩니다.

>>> 1+2
3
>>> _
3

이런 이유로, 나는 이런 식으로 그것을 사용하지 않을 것입니다. Ryan이 언급 한 바와 같이 나는 어떤 관용구도 알지 못합니다. 통역사를 엉망으로 만들 수 있습니다.

>>> for _ in xrange(10): pass
...
>>> _
9
>>> 1+2
3
>>> _
9

그리고에 따르면 파이썬 문법, 허용 가능한 변수 이름입니다.

identifier ::= (letter|"_") (letter | digit | "_")*

다른 팁

당신은 찾고있을 수 있습니다

for _ in itertools.repeat(None, times): ...

이것은 반복하는 가장 빠른 방법입니다 times 파이썬의 시간.

사용되지 않은 값에 할당하는 일반적인 관용구는 이름을 지정하는 것입니다. _.

for _ in range(times):
    do_stuff()

_를 사용하도록 제안하는 모든 사람은 _가 자주 바로 가기로 자주 사용된다는 것입니다. getText 기능이 있으므로 소프트웨어를 여러 언어로 사용할 수 있으려면 다른 목적으로 소프트웨어를 사용하지 않는 것이 가장 좋습니다.

import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print _('This is a translatable string.')

다음은 (학대?)를 활용하는 임의의 아이디어입니다. 데이터 모델 (PY3 링크).

class Counter(object):
    def __init__(self, val):
        self.val = val

    def __nonzero__(self):
        self.val -= 1
        return self.val >= 0
    __bool__ = __nonzero__  # Alias to Py3 name to make code work unchanged on Py2 and Py3

x = Counter(5)
while x:
    # Do something
    pass

표준 라이브러에 이와 같은 것이 있는지 궁금합니다.

_11 (또는 숫자 또는 다른 유효하지 않은 식별자)을 사용하여 GetText로 이름 색상을 방지 할 수 있습니다. 밑줄 + 유효하지 않은 식별자를 사용할 때마다 루프에 사용할 수있는 더미 이름이 표시됩니다.

답변이 될 수 있습니다. 반복자를 사용하는 데 어떤 문제가 있는지에 달려 있습니까? 사용될 수 있습니다

i = 100
while i:
    print i
    i-=1

또는

def loop(N, doSomething):
    if not N:
        return
    print doSomething(N)
    loop(N-1, doSomething)

loop(100, lambda a:a)

그러나 솔직히 나는 그러한 접근법을 사용하는 데 아무런 의미가 없습니다.

t=0    
for _ in range(10):
    print t
    t = t+1

산출:

0
1 
2 
3 
4 
5 
6 
7
8
9

나는 일반적으로 위에 주어진 솔루션에 동의합니다. 즉, :

  1. 밑줄 사용 for-루프 (2 개 이상의 라인)
  2. 정의 정의 while 카운터 (3 개 이상의 라인)
  3. 커스텀 클래스를 선언합니다 __nonzero__ 구현 (더 많은 라인)

객체를 안에서 정의하는 경우 #3 프로토콜을 구현하는 것이 좋습니다 ~와 함께 예어 또는 적용하십시오 contextLib.

또한 또 다른 해결책을 제안합니다. 3 라이너이며 우아함이 아니지만 사용합니다. Itertools 따라서 패키지이므로 관심이있을 수 있습니다.

from itertools import (chain, repeat)

times = chain(repeat(True, 2), repeat(False))
while next(times):
    print 'do stuff!'

이 예에서 2 루프를 반복하는 횟수입니다. 체인 둘을 감싸고 있습니다 반복하다 반복자, 첫 번째는 제한되어 있지만 두 번째는 무한합니다. 이것들은 진정한 반복 객체이므로 무한 메모리가 필요하지 않습니다. 분명히 이것은 솔루션보다 훨씬 느립니다 #1. 함수의 일부로 작성되지 않는 한 타임스 변하기 쉬운.

우리는 다음과 같이 재미있게 공유하는 것이 흥미 롭습니다.

class RepeatFunction:
    def __init__(self,n=1): self.n = n
    def __call__(self,Func):
        for i in xrange(self.n):
            Func()
        return Func


#----usage
k = 0

@RepeatFunction(7)                       #decorator for repeating function
def Job():
    global k
    print k
    k += 1

print '---------'
Job()

결과:

0
1
2
3
4
5
6
---------
7

만약에 do_something 간단한 기능이거나 하나로 랩핑 할 수 있습니다. map() ~할 수 있다 do_something range(some_number) 타임스:

# Py2 version - map is eager, so it can be used alone
map(do_something, xrange(some_number))

# Py3 version - map is lazy, so it must be consumed to do the work at all;
# wrapping in list() would be equivalent to Py2, but if you don't use the return
# value, it's wastefully creating a temporary, possibly huge, list of junk.
# collections.deque with maxlen 0 can efficiently run a generator to exhaustion without
# storing any of the results; the itertools consume recipe uses it for that purpose.
from collections import deque

deque(map(do_something, range(some_number)), 0)

논쟁을 전달하려면 do_something, 당신은 또한 찾을 수 있습니다 Itertools repeatfunc 레시피 잘 읽음 :

동일한 주장을 통과하려면 :

from collections import deque
from itertools import repeat, starmap

args = (..., my args here, ...)

# Same as Py3 map above, you must consume starmap (it's a lazy generator, even on Py2)
deque(starmap(do_something, repeat(args, some_number)), 0)

다른 주장을 통과하려면 :

argses = [(1, 2), (3, 4), ...]

deque(starmap(do_something, argses), 0)

불필요한 카운터 대신 이제 불필요한 목록이 있습니다. 최상의 솔루션은 "_"로 시작하는 변수를 사용하는 것입니다. 구문 검사기에게 변수를 사용하지 않는다는 것을 알고 있음을 알려줍니다.

x = range(5)
while x:
  x.pop()
  print "Work!"

만약 너라면 진짜 이름 (OP에서와 같이 반복 변수 또는 원치 않는 목록 또는 원치 않는 발전기 또는 원치 않는 발전기가 원하는 시간을 반환하는 것을 피하고 싶다).

for type('', (), {}).x in range(somenumber):
    dosomething()

사용되는 트릭은 익명 클래스를 만드는 것입니다. type('', (), {}) 이로 인해 빈 이름을 가진 클래스가 발생하지만 NB는 로컬 또는 글로벌 네임 스페이스에 삽입되지 않습니다 (비어 있지 않은 이름이 제공 되더라도). 그런 다음 해당 클래스의 멤버를 반복 변수로 사용합니다.

#Return first n items of the iterable as a list
list(itertools.islice(iterable, n))

가져 왔습니다 http://docs.python.org/2/library/itertools.html

는 어때:

while range(some_number):
    #do something
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top