Iterable이란 우선 반복할 수 있는 객체이다.
iter() 메소드를 사용하여 Iterator 객체를 생성할 수 있다.
String, Lists, tuples, dictionaries, and sets는 Iterable 객체이다.
Iterator 객체는 __next__() 메소드를 가지며, 다음 순서의 item을 리턴한다.
모든 Iterator는 Iterable이 될 수 있지만, 모든 Iterable은 Iterator가 될 수 없다.
예를 들어, list 객체는 iterable 하지만 iterator 객체가 아니다.
str1 = "The time has come"
# str1을 공백으로 잘라 list로 저장
str_list = '\w+'.findall(str1)
print(str_list)
>>> ['The', 'time', 'has', 'come']
print(next(str_list))
# TypeError: 'list' object is not an iterator
마지막 문장처럼 next() 메소들를 이용하면 list 객체가 iterator가 아니여서 TypeError가 난다.
대신에, 모든 Iterable한 객체에 iter() 메소드를 사용하면 Iterator 객체를 만들 수 있다.
# iter() 메소드는 iterable 객체를 iterator 객체로 만들어 반환한다.
str_iter = iter(str_list)
print(next(str_iter))
print(next(str_iter))
print(next(str_iter))
print(next(str_iter))
>>>
The
time
has
come
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
>>>
b
a
n
a
n
a
iter() 메소드를 통해 iterator 객체를 리턴하려면, 아래의 두 메소드 중 하나라도 구현이 되어야 한다.
__iter__ : Iterator 객체를 리턴하는 메소드
__getItem__ (self, index): 인자의 인덱스(0부터 시작)에 따른 item을 리턴하는 내용을 작성한 메소드
* 예를 들어 리스트의 경우 __getItem__ 메소드에 return list[index] 와 같이 작성해주면 되겠다.
아래는 MyNumbers라는 숫자를 리턴하는 Iterator 객체를 구현해본 것이다.
숫자는 1부터 시작하고 각 순서대로 숫자가 1씩 증가된다.
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
>>>
* Iterator에서 next() 메소드를 사용할 때 더이상 반복할 item 이 없으면 StopIteration을 리턴한다.
# list of cities
cities = ["Berlin", "Vienna", "Zurich"]
# intialize the object
iterator_obj = iter(cities)
print(next(iterator_obj))
print(next(iterator_obj))
print(next(iterator_obj))
print(next(iterator_obj))
>>>
Berlin
Vienna
Zurich
StopIteration
# 더이상 반복할 item 이 없으면 StopIteration을 리턴한다.
* 객체가 iterable 한지 체크하기 위해 iter() 메소드로 체크할 수 있다.
# Function to check object
# is iterable or not
def iterable(obj):
try:
iter(obj)
return True
except TypeError:
return False
# Driver Code
for element in [34, [4, 5], (4, 5),
{"a":4}, "dfsdf", 4.5]:
print(element, " is iterable : ", iterable(element))
<참고 사이트>
https://nachwon.github.io/iterable/
https://www.geeksforgeeks.org/python-difference-iterable-iterator/
https://www.w3schools.com/python/python_iterators.asp
[pyenv-virtualenv] 파이썬 프로젝트 별 가상 환경 설정하기. (0) | 2019.12.29 |
---|---|
[redis] redis incr, expire command 동시에 사용하기. (0) | 2019.10.26 |
[Python, asyncio] Coroutine과 task, event_loop 개념과 사용법 정리. (0) | 2019.09.28 |
[Python] Generator란? Generator와 Iterator. (0) | 2019.08.25 |
[Python, aioresponses] pytest 테스트 코드 작성시 외부 api Mocking 하기. (0) | 2019.08.10 |
댓글 영역