Python의 생성기

시작 노트



이 블로그를 읽기 전에 이 블로그는 전적으로 Python에서 생성기가 작동하는 방식에 대한 이해를 바탕으로 작성되었음을 분명히 밝히고 싶습니다. 앞으로 나아가려면 Python의 중급자여야 합니다.

반복자



셀 수 있는 값을 포함하는 개체입니다. 다음 값은 next(object_name) 매개변수로 액세스할 수 있습니다.

반복자에 대한 자세한 내용은 여기에서 확인할 수 있습니다. Iterators by W3 Schools

사례



당신이 회사에서 일하고 있고 회사에서 일련의 숫자를 찾는 프로그램을 작성하라는 작업을 준다고 가정해 보겠습니다. 각 숫자는 이전 숫자와 12의 차이가 있습니다. 따라서 시리즈는 다음과 같습니다. [12,24,36,48.....]

사용자가 지정한 숫자까지 시리즈를 찾고 다른 사람들이 루프를 사용하여 해당 값을 얻을 수 있도록 결과를 어딘가에 저장해야 합니다.

따라서 사용자가 10을 입력하면 프로그램은 12,24,36,........,120과 같은 계열을 반환합니다.

당신은 다음과 같을 것입니다: 알겠습니다. 쉽습니다.

def gen_series():
    n = int(input("What's n? "))
    a = []
    d = 11
    for i in range(1, n+1):
        a.append(i + d)
        d += 11
    return a

if __name__ == "__main__":
    print(gen_series())


이제 사용자가 12, 23, 89, 74와 같은 숫자를 입력하면 프로그램이 제대로 작동합니다.

이 코드를 직접 테스트하고 1000000000000000과 같은 숫자를 입력하면 어떻게 될까요?
코드가 멈추기 시작하고 프로그램이 원활하게 작동하지 않습니다. 따라서 이것은 일련의 숫자를 얻는 최선의 방법이 아닙니다.

이 코드를 약간 리팩토링해 봅시다

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)

def series(n):
    a = []
    d = 11
    for i in range(1, n+1):
        a.append(i + d)
        d += 11
    return a

if __name__ == "__main__":
    gen_series()


이제 프로그램은 동일하게 실행되지만 문제는 아직 해결되지 않았습니다. 우리는 각 숫자가 이전 숫자와 12의 차이가 있는 일련의 숫자를 생성하고 싶고 프로그램에서 원하는 만큼의 숫자를 생성하기를 원합니다.

다음 코드를 실행해 보세요.

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)


def series(n):
    d = 11
    for i in range(1, n+1):
        yield i + d
        d += 11


if __name__ == "__main__":
    gen_series()


이 코드를 실행하고 숫자를 20으로 입력하면 출력이 <generator object series at 0x0000020B20684350>로 표시됩니다. 이제 다시 실행하고 1000000000000000과 같은 큰 숫자를 입력하면 프로그램이 지연되지 않는 것을 알 수 있습니다. 그것은 완벽하게 잘 작동하고 출력을 얻습니다.
yield 키워드는 이 함수를 생성기로 만드는 역할을 합니다.
series 함수는 이제 반복자를 생성하는 생성기 함수입니다. W3 Schools 기사를 읽었다면 루프를 사용하여 이터레이터에서 값에 쉽게 액세스할 수 있다는 것을 확실히 알 수 있습니다.

여기 제너레이터의 정의가 있습니다.

발전기



제너레이터는 반복자를 반환하는 함수입니다.

프로그램으로 돌아가기



이제 시리즈의 값을 인쇄하기 위해 다른 함수를 사용할 수 있습니다.

def print_series():
    a = gen_series()
    for i in a:
        print(i)


전체 코드:

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)
    return a


def print_series():
    a = gen_series()
    for i in a:
        print(i)


def series(n):
    d = 11
    for i in range(1, n+1):
        yield i + d
        d += 11


if __name__ == "__main__":
    print_series()


결론


  • 생성기는 반복자를 반환하는 함수입니다
  • .
  • yield 키워드
  • 를 사용하여 일반 함수를 생성기로 전환할 수 있습니다.

    이해하지 못했다면 댓글에서 저를 비판하는 것을 잊지 마세요. 더 나은 설명을 찾는 데 도움이 될 것입니다. 내가 당신의 시간을 낭비했다면 나를 비난해도 괜찮습니다. 또한 궁금하신 사항은 댓글로 문의주세요

    좋은 웹페이지 즐겨찾기