무한 반복기에 대한 표현이 있습니까?
무한 반복기를 생성할 수 있는 직설적인 표현이 있습니까?
이것은 순전히 이론적인 질문입니다.여기서 "실용적인" 대답은 필요 없습니다 :)
예를 들어, 생성자 식을 사용하여 유한 반복기를 만드는 것은 쉽습니다.
my_gen = (0 for i in xrange(42))
그러나 무한 확장을 위해서는 가짜 기능으로 네임스페이스를 "오염"해야 합니다.
def _my_gen():
while True:
yield 0
my_gen = _my_gen()
별도의 파일로 작업을 수행하고 있습니다.import
-잉은 나중에 중요하지 않습니다.
나는 또한 알고 있습니다itertools.repeat
정확히 이렇게 합니다.저는 그것이 없는 원라인 솔루션이 있는지 궁금합니다.
itertools
세 가지 무한 반복기를 제공합니다.
count(start=0, step=1)
: 0, 1, 2, 3, 4, ...cycle(p)
p[0], p[1], ..., p[-1], p[0], ...repeat(x, times=∞)
x, x, x, x, ...
나는 표준 도서관에 있는 다른 어떤 것도 모릅니다.
당신이 원라이너를 요청한 이후로:
__import__("itertools").count()
for x in iter(int, 1): pass
- 두 주장
iter
제로페이퍼 콜 가능 + 센티넬 값 int()
항상 되돌아옴0
그러므로,iter(int, 1)
무한 반복기입니다.이 특정 테마에는 분명히 엄청난 수의 변형이 있습니다(특히 한 번 추가하면).lambda
혼용).특정 노트의 한 가지 변형은 다음과 같습니다.iter(f, object())
새로 생성된 객체를 센티넬 값으로 사용하면 첫 번째 인수로 사용된 호출에 관계없이 무한 반복기를 거의 보장할 수 있습니다.
호출 가능한 것에 대해 반복할 수 있으며, 항상 반복자의 보초와 다른 상수를 반환할 수 있습니다.
g1=iter(lambda:0, 1)
OS가 무한 생성기로 사용할 수 있는 것을 제공할 수 있습니다.Eg on 리눅스
for i in (0 for x in open('/dev/urandom')):
print i
분명히 이것은만큼 효율적이지 않습니다.
for i in __import__('itertools').repeat(0)
print i
꽤 못생기고 미친 것이지만(매우 재미있지만), 몇 가지 속임수를 사용하여(필요에 따라 네임스페이스를 "오염"하지 않고) 표현식으로 자신만의 반복기를 만들 수 있습니다.
{ print("Hello world") for _ in
(lambda o: setattr(o, '__iter__', lambda x:x)
or setattr(o, '__next__', lambda x:True)
or o)
(type("EvilIterator", (object,), {}))() }
클래스/함수/제너레이터로 정의된 다른 무한 반복기를 내부적으로 사용하지 않는 경우(not -expression, 함수)yield
생성기 식은 항상 반복 가능한 테이블에서 추출하며 항목 필터링 및 매핑만 수행합니다.한정된 항목에서 무한한 항목으로 이동할 수 없습니다.map
그리고.filter
니가 필요한while
(또는 a)for
그것은 종료되지 않습니다, 그것은 정확히 우리가 사용할 수 없는 것입니다.for
및 유한 반복기).
트리비아: PEP 3142는 표면적으로 유사하지만 자세히 조사해 보면 여전히 필요한 것 같습니다.for
절 (그러므로 아니오)(0 while True)
사용자를 위해), 즉, 바로 가기만 제공합니다.itertools.takewhile
.
예를 들어 다음과 같은 장식가를 사용할 수 있습니다.
def generator(first):
def wrap(func):
def seq():
x = first
while True:
yield x
x = func(x)
return seq
return wrap
용도(1):
@generator(0)
def blah(x):
return x + 1
for i in blah():
print i
사용량(2)
for i in generator(0)(lambda x: x + 1)():
print i
그 추악한 놈들을 제거하는 것이 더 개선될 수 있다고 생각합니다.()
그러나 생성하려는 시퀀스의 복잡성에 따라 달라집니다.일반적으로 말해서, 당신의 시퀀스가 함수를 사용하여 표현될 수 있다면, 모든 발전기의 복잡성과 통사적 설탕은 장식기나 장식기 같은 함수 안에 숨겨져 있을 수 있습니다.
언급URL : https://stackoverflow.com/questions/5737196/is-there-an-expression-for-an-infinite-iterator
'programing' 카테고리의 다른 글
대용량 데이터에서 NA를 가장 빠르게 대체할 수 있는 방법.표 (0) | 2023.07.18 |
---|---|
Python에서 IP 주소를 검증하는 방법은 무엇입니까? (0) | 2023.07.18 |
C++에서 어레이 또는 std:: 벡터를 사용하면 성능 차이가 어떻게 됩니까? (0) | 2023.07.18 |
Python 반복기에서 마지막 항목을 가져오는 가장 깨끗한 방법 (0) | 2023.07.18 |
XPath를 BeautifulSoup과 함께 사용할 수 있습니까? (0) | 2023.07.18 |