programing

무한 반복기에 대한 표현이 있습니까?

lovejava 2023. 7. 18. 21:22

무한 반복기에 대한 표현이 있습니까?

무한 반복기를 생성할 수 있는 직설적인 표현이 있습니까?

이것은 순전히 이론적인 질문입니다.여기서 "실용적인" 대답은 필요 없습니다 :)


예를 들어, 생성자 식을 사용하여 유한 반복기를 만드는 것은 쉽습니다.

my_gen = (0 for i in xrange(42))

그러나 무한 확장을 위해서는 가짜 기능으로 네임스페이스를 "오염"해야 합니다.

def _my_gen():
    while True:
        yield 0
my_gen = _my_gen()

별도의 파일로 작업을 수행하고 있습니다.import-잉은 나중에 중요하지 않습니다.


나는 또한 알고 있습니다itertools.repeat정확히 이렇게 합니다.저는 그것이 없는 원라인 솔루션이 있는지 궁금합니다.

itertools 세 가지 무한 반복기를 제공합니다.

나는 표준 도서관에 있는 다른 어떤 것도 모릅니다.


당신이 원라이너를 요청한 이후로:

__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