본문 바로가기

컴퓨터/Python

제너레이터

이터레이터를 만드는 간단하고도 강력한 도구

return 대신 yield를 적으면 함수를 끝내지 않고 호출한 곳에 값을 전달

>>> def reverse(data):

for index in range(len(data) - 1, -1, -1):

yield data[index]

>>> for char in reverse('golf'):

print(char)

f

l

o

g


yield는 호출한 곳에 값을 돌려주고 함수는 메모리에 그대로 있음




>>> def abc():

data = "abc"

for char in data:

return char

>>> it = iter(abc())

>>> next(it)

'a'

>>> next(it)

Traceback (most recent call last):

  File "<pyshell#15>", line 1, in <module>

    next(it)

StopIteration

두번째 호출에선 예외 발생

abc함수가 끝나 버렸기 때문




>>> def abc():

data = "abc"

for char in data:

yield char

>>> abc

<function abc at 0x1037850d8>

>>> abc()

<generator object abc at 0x1037840a0>

>>> it = iter(abc())

>>> next(it)

'a'

>>> next(it)

'b'

>>> next(it)

'c'

abc()가 실행되면 제너레이터 객체가 반환


제너레이터는 필요할 때마다 데이터를 생성

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> sum(a)

55

>>> b = (i for i in range(11))

>>> b

<generator object <genexpr> at 0x1037840a0>

>>> sum(b)

55




피보나치 수열 구현

>>> def Fibonacci():

a, b = 0, 1

while 1:

yield a

a, b = b , a+b

>>> for i, ret in enumerate(Fibonacci()):

if i < 20: print(i, ret)

else: break

0 0

1 1

2 1

3 2

4 3

5 5

6 8

7 13

8 21

9 34

10 55

11 89

12 144

13 233

14 377

15 610

16 987

17 1597

18 2584

19 4181



enumerate() 함수는 순회 가능한 객체에서 인덱스 값과 요소의 값을 둘 다 반환

>>> for i, season in enumerate(['Spring','Summer','Fall', 'Winter']):

print(i, season)

0 Spring

1 Summer

2 Fall

3 Winter

'컴퓨터 > Python' 카테고리의 다른 글

조건식의 참/거짓 판단  (0) 2013.07.09
if 문  (0) 2013.07.09
이터레이터(iterator)  (0) 2013.07.08
__doc__ 속성과 help 함수  (0) 2013.07.08
pass  (0) 2013.07.08