머리말
Yield가 무엇인지 이해하려면 먼저 생성자(generator
)가 무엇인지 이해해야 합니다. 생성자에 대해 이야기하기 전에 목록(iterator
)을 만들 때 반복자(list
)에 대해 알아보겠습니다. 각 항목을 하나씩 읽어나가는 것을 반복(iteration
)이라고 합니다.
>>> mylist = [1, 2, 3] >>> for i in mylist : ... print(i) 1 2 3
mylist
은 반복 가능한 객체입니다. 목록 이해를 사용하여 목록을 생성하면 반복 가능한 객체가 생성됩니다.
>>> mylist = [x*x for x in range(3)] >>> for i in mylist : ... print(i) 0 1 4
"for··· in ···
"을 사용하여 list
, string
, files
과 같은 반복 가능한 객체를 조작할 수 있습니다. 이러한 반복 객체는 원하는 대로 반복해서 읽을 수 있기 때문에 사용하기 매우 편리합니다. . 하지만 모든 요소를 미리 메모리에 저장해야 하며 해당 개체에 요소가 많으면 모든 항목이 유용하지는 않습니다.
생성기도 반복 가능한 객체이지만 모든 값을 메모리에 저장하지 않고 동적으로 값을 생성하므로 한 번만 읽을 수 있습니다.
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator : ... print(i) 0 1 4
[]를 ()로 바꾸는 것 외에는 별 차이가 없는 것 같습니다. 그러나 생성기는 한 번만 반복할 수 있기 때문에 for i in mygenerator
를 다시 사용할 수 없습니다. 먼저 0을 계산하고 계속해서 1을 계산한 다음 4를 차례로 계산합니다...
yield
은 이 함수가 생성기를 반환한다는 점을 제외하면 return
과 유사한 키워드입니다.
>>> def createGenerator() : ... mylist = range(3) ... for i in mylist : ... yield i*i ... >>> mygenerator = createGenerator() # create a generator >>> print(mygenerator) # mygenerator is an object! <generator object createGenerator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 4
이 예제 자체는 의미가 없지만 함수가 한 번만 읽을 수 있는 값 집합을 반환한다는 점을 명확하게 보여줍니다. Yield를 마스터하려면 가장 먼저 이해해야 할 것은 생성기 함수를 호출할 때, 위의 예 createGenerator()
에서와 같이 프로그램은 함수 본문의 코드를 실행하지 않고 생성기 개체만 반환합니다. 이 방법은 매우 미묘합니다. 함수 본문 내부의 코드는 생성기의 각 루프 반복(for)이 완료될 때까지 실행되지 않습니다.
첫 번째 반복에서는 함수가 실행되어 처음부터 yield
키워드에 도달한 다음 첫 번째 반복의 반환 값으로 yield
뒤의 값을 반환합니다. 그런 다음 이 함수가 실행될 때마다. , 계속 실행됩니다. 다음에 함수 내부에 정의한 루프에서 반환할 항목이 더 이상 남지 않을 때까지 해당 값을 다시 반환합니다.
yield
키워드가 생성기 내부에 정의되어 있지 않으면 생성기가 비어 있는 것으로 간주됩니다. 이는 루프가 부족하거나 if/else 조건이 충족되지 않기 때문에 발생할 수 있습니다.
요약
위 내용은 이 글의 전체 내용입니다. Python을 배우거나 사용하는 모든 분들께 이 글의 내용이 도움이 되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요.