2번째 줄: |
2번째 줄: |
| 순회할 수 있는 데이터형. | | 순회할 수 있는 데이터형. |
| | | |
− | for과 함께 쓰여 순회용으로 만드는 것. | + | for과 함께 쓰여 순회용으로 만드는 것. 루프의 작용을 제어하기 위해 쓰이는 함수. |
| + | |
| + | 연속적인 값들을 만들어낸다. |
| + | |
| + | return이 아닌, yield를 통해 돌려받는다. 이를 이용해 한 번 호출될 때마다 하나의 값을 뱉어낸다.(즉, 인공지능 등에서 학습용 데이터를 메모리에 모두 올려두는 게 아니라, 필요할 때마다 해당 데이터를 빼낼 수 있게 구성된 것이다.) => 덕분에 적은 메모리 만으로도 만들 수 있다. |
| + | |
| + | (근본적으로 함수와 다를 바 없는데.. 함수와 다른 이름으로 분류되네) |
| + | |
| + | === 예 === |
| + | <syntaxhighlight lang="python"> |
| + | def generator(): |
| + | list = range(3) # 0에서 3 미만까지. |
| + | for i in list: |
| + | yield i |
| + | |
| + | mygen = generator() # 제너레이터를 생성하고.. |
| + | for i in mygen: |
| + | print(i) |
| + | |
| + | # 다른 출력법. |
| + | for i in range(3): |
| + | print(next(mygen)) # next함수로 제너레이터의 다음 값을 뽑아낸다. |
| + | </syntaxhighlight>0, 1, 2가 출력된다. |
| + | |
| + | 제너레이터에서 추출할 수 있는 값 이상을 뽑으려 하면 에러가 반환된다. |
| + | |
| + | for 뿐만 아니라 while이나, 반복문 없이 다음과 같이 순차적으로 yield를 사용하는 것도 가능하다.<syntaxhighlight lang="python"> |
| + | def generator(): |
| + | yield 1 |
| + | yield 2 |
| + | yield 3 |
| + | </syntaxhighlight> |
| + | |
| + | == 출력 값이 여러 개인 경우 == |
| + | <syntaxhighlight lang="python"> |
| + | def generator(): |
| + | yield 1, 2 |
| + | </syntaxhighlight>위처럼 1개의 제너레이터에서 2개의 출력값이 나오는 경우, 다음과 같이 인덱스를 사용하여 값에 접근할 수 있다.<syntaxhighlight lang="python"> |
| + | gen = generator() |
| + | next(gen)[0] |
| + | </syntaxhighlight> |
| + | |
| + | == 응용 == |
| + | |
| + | === 제너레이터 길이 === |
| + | 제너레이터의 길이를 알아야 할 때가 있다.(인공지능 모델에 넣는다든가..) |
| + | |
| + | # 제너레이터를 리스트로 변환하여 len()함수를 이용해 체크. <code>len(list(generator))</code>이는 메모리 문제를 일으킬 수 있다. |
| + | # 제너레이터를 하나씩 읽으며 1씩 증가하며 체크... <code>sum(1 for x in generator)</code> |
| + | |
| [[분류:기초]] | | [[분류:기초]] |