상세 컨텐츠

본문 제목

[Python] Iterable과 Iterator 특징 및 비교

프로그래밍/Python

by jisooo 2019. 8. 10. 19:12

본문

 

 

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/

 

[Python] Iterable, Iterator, Generator

파이썬의 Iterable, Iterator, Generator 객체에 대해 알아본다.

nachwon.github.io

 

https://www.geeksforgeeks.org/python-difference-iterable-iterator/

 

Python | Difference between iterable and iterator - GeeksforGeeks

Iterable is an object, which one can iterate over. It generates an Iterator when passed to iter() method. Iterator is an object, which is used… Read More »

www.geeksforgeeks.org

https://www.w3schools.com/python/python_iterators.asp

 

Python Iterators

Python Iterators Python Iterators An iterator is an object that contains a countable number of values. An iterator is an object that can be iterated upon, meaning that you can traverse through all the values. Technically, in Python, an iterator is an objec

www.w3schools.com

 

 

 

관련글 더보기

댓글 영역