생성기는 PEP 255와 함께 도입된 이후로 파이썬의 중요한 부분이었습니다.
Python의 Generator는 루프의 반복 동작을 제어하는 데 사용할 수 있는 특수 루틴입니다. 생성기는 배열을 반환하는 함수와 유사합니다. 제너레이터에는 매개변수가 있는데, 이를 호출할 수 있으며 일련의 숫자를 생성합니다. 그러나 전체 배열을 반환하는 함수와 달리 제너레이터는 메모리를 덜 필요로 하는 한 번에 하나의 값을 생성합니다.
"yield" 키워드가 있는 모든 파이썬 함수는 제너레이터로 호출될 수 있습니다. 일반적인 파이썬 함수는 첫 번째 줄에서 실행을 시작하고 return 문이나 예외가 발생하거나 함수가 끝날 때까지 계속됩니다. 제너레이터의 경우 yield 키워드를 만나면 함수의 상태가 고정되고 제너레이터가 다시 호출될 때까지 모든 변수가 메모리에 저장됩니다.
반복자에 따라 제너레이터를 사용하거나 "next" 키워드를 사용하여 명시적으로 호출할 수 있습니다.
일반적으로 Python의 생성기:
- def 키워드로 정의됨
- 수익률 키워드 사용
- 여러 가지 수익 키워드를 포함할 수 있습니다.
- 반복자를 반환합니다.
반복자가 있는 생성기
def generator_thr_iter(): yield 'xyz' yield 246 yield 40.50 for i in generator_thr_iter(): print(i)
출력
xyz 246 40.5
다음을 사용하는 생성기
def generator_thr_iter(): yield 'xyz' yield 246 yield 40.50 >>> g = generator_thr_iter() >>> g.__next__() 'xyz' >>> g.__next__() 246 >>> g.__next__() 40.5 >>> g.__next__() Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> g.__next__() StopIteration
제너레이터는 한 번에 모두가 아니라 여러 항목을 하나씩 반환하는 것으로 생각할 수 있으며 다음 항목이 요청될 때까지 제너레이터 기능이 일시 중지됩니다.
1에서 n까지의 제곱을 출력하는 프로그램
1에서 n까지 숫자의 제곱을 계산하려고 한다고 가정해 봅시다. 여기서 n은 정말 큰 숫자이므로 최대 'n'까지의 숫자 목록을 생성하면 전체 시스템 메모리 공간을 차지하게 됩니다.
제너레이터가 없다면 우리의 접근 방식은 다음과 같을 것입니다 -
>>> n= 200000000000 >>> number_list = range(1, n+1) >>> for i in number_list: print(i*i)
위의 접근 방식은 시스템 메모리를 많이 소모합니다. 더 나은 접근 방식은 시스템 메모리가 점유되지 않도록 숫자 목록을 생성하지 않고 숫자를 반복하는 것입니다. 다음은 생성기의 사용입니다.
동일한 생성기 프로그램은 -
def num_generator(n): num =1 while True: yield num if num == n: return else: num += 1 for i in num_generator(200000000000): print (i*i)
따라서 위의 접근 방식에서 for 루프가 처음 초기화될 때 num_generator가 호출되고 n =200000000000의 값이 메모리에 저장되고 num=1이 초기화되고 영원히 루프하는 while 루프에 입력됩니다. 그런 다음 yield num이 발생합니다. 이때 while 루프가 고정되고 모든 지역 변수가 메모리에 저장됩니다. num=1이므로 yield num이 for 루프로 반환되고 I에 할당됩니다. 여기서 1(i*i)이 인쇄되고 num_generator에 대한 다음 호출이 수행됩니다.
이제 실행은 이전에 고정된 지점에서 시작하므로 num ==n (1 ==200000000000) 행을 실행합니다. 이는 false이므로 num +=1이 실행되어 num =2가 되고 while 루프는 다음과 같습니다. 다시 한 번 실행되고 프로세스가 계속됩니다.
마지막으로 n=200000000000까지 루프를 실행하다가 200000000000이 나오면 다음 줄 'num ==n'(200000000000 ==200000000000)이 실행되는데 이것이 true이기 때문에 return 문이 실행됩니다.
따라서 제너레이터가 return 문을 실행하거나 예외가 발생하거나 제너레이터의 끝에 도달하면 "StopIteration" 예외가 발생하고 for 루프 반복이 순간 중지됩니다. 따라서 위에서 우리는 큰 시스템 메모리를 차지할 큰 숫자 목록을 생성하지 않고 최대 200000000000까지의 숫자의 제곱을 인쇄할 수 있습니다.
위의 시나리오를 고려하면 일상적인 프로그래밍 실습에서 생성기를 사용하여 보다 효율적인 프로그램을 만들 수 있습니다.>