이터레이터를 만드는 간단하고도 강력한 도구
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 |