제너레이터 질문

9 views
Skip to first unread message

graphy21

unread,
Oct 3, 2010, 2:14:09 AM10/3/10
to Python 3 질문 게시판
책에서 제너레이터에 관한 설명이 함수에 return 대신 yield를 이용하면 그 함수를 호출할때 제너레이터 객체가 생성되는 것
으로 이해 하였습니다. 그런데 b = (i for i in range(11)) 과 같이 하여도 제너레이터가 생성된다는 것이 이해
가 되지 않습니다.
a = 'abc'
for i in a:
print(i)
에서의 과정이
temp_a = iter(a)와 같이 a를 담는 이터레이터 객체가 생기고 이터레이터 클래스 안의 __next__()메소드가 호출
되어 a의 값이 하나씩 return되는 걸로 이해하는데
b=(i for i in range(11))은 어떤 과정에서 어떻게 generator가 생성되는지 이해가 되지 않습니다.

그리고 이터레이터처럼 제너레이터를 생성하는 함수가 없는지 yield 이외에 언제 제너레이터가 생성되는지 알려주세요.

평면우주

unread,
Oct 4, 2010, 10:11:06 PM10/4/10
to Python 3 질문 게시판
안녕하세요.

우선 제너레이터를 생성하는 함수는 없습니다. 제너레이터는 yield에서 생성하는 방법과
Generator Expression을 이용하는 방법 2가지가 있습니다.
Generator Expression은 제네레이터를 간편하게 쓸수 있는 방법으로 책의 범위를 넘어가는 부분이였습니다.

본문에서 b = ( i for i in range(11)) 이 바로 Generator Expression입니다.

Generator Expression은 리스트 내장(list comprehension)과 비슷하게 생겼지만
리스트 내장은 리스트가 생성되고 Generator Expression은 제너레이터 객체가 생기는게 다른 점입니다.
제네레이터의 강점을 설명 하려다 보니 Generator Expression을 사용했습니다.

Generator expression의 형태를 보면 아래와 같습니다.
<expression> for <declarations> in <iterator> [if|unless <condition>]

예를 들면 1부터 10까지 홀수 값만 구하고 싶다면 아래와 같이 사용하면 됩니다.

>>> oddNumbers = (i for i in range(10) if i % 2)

>>> for i in oddNumbers:
print(i)


1
3
5
7
9

감사합니다.

graphy21

unread,
Oct 5, 2010, 7:19:20 AM10/5/10
to Python 3 질문 게시판
답변 대단히 감사드립니다.
Reply all
Reply to author
Forward
0 new messages