반복기 변수 없이 범위 루프용 파이썬을 구현할 수 있습니까?
를 제외하고 다음 작업을 수행할 수 있습니까?
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)
하지만 제 생각에 당신은 단지 여분의 변수를 가지고 살 수 있습니다.
여기 변수를 사용할 수 있는 옵션이 있습니다. 실제로는 또 다른 변수일 뿐입니다.
for _ in range(n):
do_something()
는 대화형 파이썬 세션에서 반환된 마지막 결과를 할당받습니다.
>>> 1+2
3
>>> _
3
이러한 이유로, 나는 그것을 이런 식으로 사용하지 않을 것이다. 나는 라이언이 언급한 어떤 관용구도 모른다. 그것은 당신의 통역사를 망칠 수 있다.
>>> for _ in xrange(10): pass
...
>>> _
9
>>> 1+2
3
>>> _
9
에 따르면 다음과 같은 변수 이름을 사용할 수 있습니다.
identifier ::= (letter|"_") (letter | digit | "_")*
사용하지 않는 값에 할당하는 일반적인 관용구는 이름을 지정하는 것입니다.
for _ in range(times):
do_stuff()
반복기를 사용하는 데 어떤 문제가 있는지에 따라 답이 달라질 수 있습니다. 사용할 수도 있습니다.
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)
하지만 솔직히 나는 그런 접근법을 사용하는 것이 의미가 없다고 생각한다.
당신은 아마도 찾고 있을 것이다.
for _ in itertools.repeat(None, times): ...
이것은 파이썬에서 시간을 반복하는 가장 빠른 방법이다.
모든 사람들이 당신에게 사용하라고 제안하는 것은 - 그것이 아니라 - 기능 중 하나의 바로 가기로 자주 사용되기 때문에, 만약 당신이 당신의 소프트웨어를 두 개 이상의 언어로 사용하기를 원한다면, 당신은 그것을 다른 목적으로 사용하는 것을 피하는 것이 최선이다.
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print _('This is a translatable string.')
여기 (학대?)를 활용하는 무작위 아이디어가 있다. ()
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
일반 도서관에도 이런 게 있는지 궁금하다.
나는 일반적으로 위에 제시된 해결책에 동의한다. 즉, 다음과 같습니다.
- 루프에서 밑줄 사용(2개 이상의 선)
- 일반 카운터 정의(3개 이상의 라인)
- 구현이 포함된 사용자 지정 클래스 선언(더 많은 줄)
에서와 같이 개체를 정의하려면 프로토콜을 구현하거나 적용할 것을 권장합니다.
더 나아가 나는 또 다른 해결책을 제안한다. 그것은 3 라이너이고 최고의 우아함은 아니지만 패키지를 사용하기 때문에 흥미로울 수 있다.
from itertools import (chain, repeat)
times = chain(repeat(True, 2), repeat(False))
while next(times):
print 'do stuff!'
이 예제에서는 루프를 반복하는 횟수를 나타냅니다. 두 개의 반복기를 감싸는 것으로, 첫 번째는 제한적이지만 두 번째는 무한하다. 이러한 개체는 실제 반복기 개체이므로 무한 메모리가 필요하지 않습니다. 분명히 이것은 해결책보다 훨씬 느리다. 함수의 일부로 작성되지 않는 한 변수에 대한 정리가 필요할 수 있습니다.
_11(또는 임의의 숫자 또는 다른 잘못된 식별자)을 사용하여 gettext와의 이름 충돌을 방지할 수 있습니다. 언더스코어 + 잘못된 식별자를 사용할 때마다 루프에 사용할 수 있는 더미 이름을 얻을 수 있습니다.
다음은 무엇입니까?
while range(some_number):
#do something
불필요한 카운터 대신 불필요한 목록이 표시됩니다. 가장 좋은 해결책은 "_"로 시작하는 변수를 사용하는 것입니다. 이 변수는 사용자가 변수를 사용하지 않는다는 것을 구문 검사자에게 알려줍니다.
x = range(5)
while x:
x.pop()
print "Work!"
#Return first n items of the iterable as a list
list(itertools.islice(iterable, n))
에서 가져옴
우리는 다음과 같이 재미있게 이야기를 나누었습니다.
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
OP와 같은 반복 변수, 원하지 않는 목록 또는 원하지 않는 생성기가 원하는 시간을 반환하는 등의 이름을 사용하지 않으려면 다음 작업을 수행할 수 있습니다.
for type('', (), {}).x in range(somenumber):
dosomething()
이 방법은 익명 클래스를 만들어 이름이 비어 있는 클래스를 만들지만 이름이 비어 있지 않은 경우에도 로컬 또는 글로벌 네임스페이스에 삽입되지 않는 NB를 만드는 것입니다. 그런 다음 해당 클래스의 멤버를 반복 변수로 사용합니다. 이 변수는 클래스가 연결할 수 없기 때문에 연결할 수 없습니다.
가 간단한 기능이거나 하나로 포장될 수 있는 경우, 간단한 캔은 다음을 반복합니다.
# 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)
인수를 에 전달하려는 경우 다음과 같은 판독값을 찾을 수 있습니다.
동일한 인수를 전달하려면:
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)
우리는 while & yield를 사용할 수 있고, 이렇게 우리만의 루프 함수를 만들 수 있습니다. 여기서 당신은 관계자를 참조할 수 있습니다.
def my_loop(start,n,step = 1):
while start < n:
yield start
start += step
for x in my_loop(0,15):
print(x)
파이썬 3.9.2에서
x = range(5)
while x:
무한 루프를 생성합니다.
'개발하자' 카테고리의 다른 글
Kubernetes: 동일한 포트에서 실행되는 마이크로 서비스? (0) | 2022.11.26 |
---|---|
파이썬 스크립트가 있는 Kubernetes Pod가 메모리를 너무 많이 사용함 (0) | 2022.11.25 |
DNS가 Kubernetes에서 NGINX로 확인되지 않음 (0) | 2022.11.24 |
Python: 상속된 부모 클래스 메서드 호출 실패 (0) | 2022.11.23 |
Typescript에서 암시적으로 튜플 만들기 (0) | 2022.11.23 |