
Iterators
문자열, 리스트, 튜플 및 딕셔너리 등은 container object로 분류된다.
for 문에서 container object의 iter() 메서드가 호출된다.
iter() 메서드는 __next__() 메서드를 포함하는 iterator object를 반환한다.
__next__() 메서드는 정의된 요소를 하나씩 반환하며, 더 이상 반환할 요소가 없는 경우 StopIteration 예외를 발생시킨다.
<코드 1>
hello = 'hello'
print(type(hello))
hello_iter = iter(hello)
print(type(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
print(next(hello_iter))
<코드 1>은 파이썬 내장 함수 iter()와 next()를 사용한 예이다.

여섯번째 next(hello_iter) 호출 시 더 이상 반환할 값을 갖고 있지 않아 StopInteration 예외가 발생한다

<코드 2>
hello = 'hello'
hello_iter = iter(hello)
for e in hello_iter:
print(e)
<코드 1>에서 반복적으로 next() 함수를 호출하는 대신 for 문을 사용해 hello_iter의 요소를 하나씩 출력한다.

<코드 3>
class HelloClass:
def __init__(self):
self.hello = 'hello'
self.len = len(self.hello)
self.index = -1
def __iter__(self):
return self
def __next__(self):
self.index += 1
if self.index >= self.len:
raise StopIteration
else:
return self.hello[self.index]
myhello = HelloClass()
for e in myhello:
print(e)
<코드 1>에서 iter() 함수로 생성한 hello_iter와 동일한 결과를 갖는 클래스 HelloClass를 작성해 본다.

Generators
Generators는 Iterators를 생성하는 간단한 도구라는 설명이 있는데 코드로 확인해 본다.
<코드 4>
def char_to_number(data):
for c in data:
yield int(c) * 10
for n in char_to_number('12345'):
print(type(n), n)
<코드 4>에서 char_to_number() 함수 내 yield 키워드로 반환하고자 하는 데이터를 지정한다.
for 문은 char_to_number() 함수가 종료될 때까지 yield 키워드에 의해 반환된 값을 사용하게 된다.

<코드 5>
def char_to_number():
yield 100
yield 200
yield 300
for n in char_to_number():
print(type(n), n)
<코드 5>를 통해 char_to_number() 함수가 실행되는 동안 3개의 yield 문이 하나씩 실행되고, for 문의 n 값도 100, 200, 300으로 변함을 확인할 수 있다.

<코드 6>
numbers = (i for i in range(1, 10, 2))
print(type(numbers))
print(sum(numbers))
<코드 6>은 리스트 컴프리헨션과 유사하게 괄호를 이용해 Generator를 만드는 예를 보여준다.

참고로 내장 함수 sum()의 파라미터 정의는 다음과 같다.
sum(iterable, /, start=0)
'코딩 > 파이썬 기초' 카테고리의 다른 글
| 파이썬 튜토리얼 045. shutil 라이브러리의 copy 함수로 파일 복사 (0) | 2021.09.17 |
|---|---|
| 파이썬 튜토리얼 044. shutil 라이브러리의 copyfile 함수로 파일 복사 (0) | 2021.09.15 |
| 파이썬 튜토리얼 042. 클래스의 상속과 supper 클래스 (0) | 2021.09.03 |
| 파이썬 튜토리얼 041. 클래스 정의 및 클래스 attributes (0) | 2021.08.24 |
| 파이썬 튜토리얼 040. global, nonlocal 키워드를 통한 namespace 이해 (0) | 2021.08.20 |