Wednesday_July_1
.
.
.
๋ธ๋ก๊ทธ์ ์ ๋ฆฌ๋ฅผ ํ๋ ค๋๋ฐ ์ค์ํ ์ฌ์ค์ ์์๋ค.
Iterable๊ณผ Iterator๋ ๋ค๋ฅด๋ค
์์๋ค์ ํ๋์ฉ ์ฐจ๋ก๋ก ๋ฐํ์ด ๊ฐ๋ฅํ Object๋ฅผ ๋ปํ๋ค.
๋ํ์ ์ธ ์๋ก Sequence type์ธ list, tuple, str๋ฑ์ด ์๋ค.
Iterator๋ next()๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅํ object์ด๋ค. ๋ง์ฝ next()๋ก ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ ๊ฒฝ์ฐ, StopIteration Exception ์ ๋ฐ์์ํจ๋ค.
์ฌ๊ธฐ์ ๊ถ๊ธํ๋๊ฒ Iterableํ Object๋ค์ ๋ค Iterator์ธ๊ฐ??
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด Iterable์ด๋ผ๊ณ ๋ฐ๋์ Iterator๋ ์๋๋ค.
L = [1, 2, 3] print(next(L))
์ถ๋ ฅ ๊ฒฐ๊ณผ
TypeError: 'list' object is not an iterator
L์ด๋ผ๋ list๋ Iterableํ ๊ฐ์ฒด์ธ๋ฐ, list๋ Iteratorํ์ ์ด ์๋๋ผ๋ ์๋ฌ๊ฐ ๋ฌ๋ค.
์๊น ๋งํ๋ฏ, Iterator๋ next()๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์ฌ๊ธฐ์ Iterable ๊ฐ์ฒด๋ค์ nextํจ์๋ก ํธ์ถ์ด ๊ฐ๋ฅํ Iterator ๊ฐ์ฒด๋ค๋ก ๋ฐ๊ฟ์ฃผ๊ณ ์ถ๋ค๋ฉด, iter()๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
์ฐจ์ด์ ์ ์ฝ๋๋ก ๋ณด์ฌ์ฃผ์๋ฉด,
L = [1, 2, 3] print(type(L)) print(type(iter(L)))
์ถ๋ ฅ ๊ฒฐ๊ณผ
<class 'list'> <class 'list_iterator'>
L์ด๋ผ๋ list์ 1,2,3 ์ด๋ผ๋ ์์๋ฅผ ์ฃผ๊ณ , ๊ฐ ์์์ ์ ๊ณฑ์ ์ถ๋ ฅํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
L = [1, 2, 3] for x in L: print(x ** 2)
์ฌ๊ธฐ์ L์ด๋ผ๋ list๊ฐ ๋ฐ๋ณต์ด ๊ฐ๋ฅํ ๊ฐ์ฒด์ธ์ง ์ด๋ป๊ฒ ์๊น?
dir() ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ (๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ) ํจ์๊ฐ ์๋์ง ๋ณด๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ dir() ํจ์๋ '์ด๋ ํ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ณ์์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋์ง๋ฅผ ๋์ดํด์ฃผ๋ ํจ์'์ด๋ค. ๊ทธ๋ฆฌ๊ณ (๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ)๋ผ๋ ๋ฉ์๋๊ฐ ์กด์ฌ ํ๋ค๋ ๊ฒ์ ๊ทธ ๊ฐ์ฒด๊ฐ ๋ฐ๋ณต์ด ๊ฐ๋ฅํ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
L = [1, 2, 3] print(dir(L))
์ถ๋ ฅ ๊ฒฐ๊ณผ
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
(๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ) ํจ์๊ฐ ์กด์ฌํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
= ๋ฐ๋ณต์ด ๊ฐ๋ฅํ ๊ฐ์ฒด๋ผ๋ ๋ป
๊ทธ ๋ค์์ (๋๋ธ์ธ๋๋ฐ)next(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋์ ๋์์ ํ์ธํด ๋ณด๋ ค๊ณ ํ๋ค.
์ผ๋จ L์ list์์ (๋๋ธ์ธ๋๋ฐ)next(๋๋ธ์ธ๋๋ฐ)๋ผ๋ ๋ฉ์๋๊ฐ ์์ ๊ฒ์ด๋ค. ์๋ํ๋ฉด L ์ด๋ผ๋ list๋ Iterable์ด์ง Iterator๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๋งํ๋ฏ, Iterable์ Iterator๋ก ๋ฐ๊ฟ์ฃผ๋ ค๋ฉด (๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
iterator_L ์ด๋ผ๋ ๋ณ์์ L์ด๋ผ๋ ๋ฆฌ์คํธ์ (๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ)๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด, iterator_L์ด๋ผ๋ ๋ณ์๋ next() ๋ฉ์๋๊ฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ Iterator๊ฐ ๋๋ค.
๊ทธ๋ฆฌ๊ณ (๋๋ธ์ธ๋๋ฐ)next(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋์ ๊ธฐ๋ฅ์ ๋ณด๊ธฐ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.
L = [1, 2, 3] iterator_L = L.__iter__() print(iterator_L.__next__()) print(iterator_L.__next__()) print(iterator_L.__next__()) print(iterator_L.__next__())
์ถ๋ ฅ ๊ฒฐ๊ณผ
1 2 3 Traceback (most recent call last): File "/Users/minholee/Desktop/test_python/test3.py", line 7, in <module> print(iterator_L.__next__()) StopIteration
๋ง์ง๋ง ๋ถ๋ถ์ StopIteration์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅํ๋ค.
list์ index์์ ๋ฒ์ด๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๊ฐ์ด ๋ฒ์ด๋์ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ฉด StopIteration์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋ฌ๋ค.
(๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋์ (๋๋ธ์ธ๋๋ฐ)next(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋๋ฅผ ํธํ๊ฒ ์ฌ์ฉํด์ฃผ๋ iter์ next๊ฐ ์๋ค.
iter(๊ฐ์ฒด) ๋ ๊ฐ์ฒด์ (๋๋ธ์ธ๋๋ฐ)iter(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๊ณ ,
next(๊ฐ์ฒด) ๋ ๊ฐ์ฒด์ (๋๋ธ์ธ๋๋ฐ)next(๋๋ธ์ธ๋๋ฐ)๋ฉ์๋๋ฅผ ํธ์ถํด์ค๋ค.L์ด๋ผ๋ ๋ฆฌ์คํธ๊ฐ ์์ ๋,
this_is_iterator = L.__iter__() # 1 this_is_iterator = iter(L) # 2 X = this_is_iterator.__next__() # 3 X = next(this_is_iterator) # 4
1์ด๋ 2๊ฐ ๊ฐ์ ๋ง์ด๊ณ , 3์ด๋ 4๊ฐ ๊ฐ์ ๋ง์ด๋ผ๋ ๋ป์ด๋ค.
L = [1, 2, 3] for x in L: print(x ** 2)
์์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
L = [1, 2, 3] I = iter(L) while True: try: X = next(I) except StopIteration: break print(X ** 2)
โ๏ธโ๏ธโ๏ธ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ for๋ฌธ์ ๋ค์ด์ค๋ iterable์ loopingํ๋ ๋์, python ๋ด๋ถ์์ ์์๋ก ๊ทธ Iterable์ Iterator๋ก ์๋์ผ๋ก ๋ณํํด์ค๋ค๊ณ ํ๋ค.
D = {'a': 1, 'b': 2, 'c': 3} for key in D: print(key)
๋์ ๋๋ฆฌ๋ ๋ฐ๋ณต๊ฐ๋ฅํ ๊ฐ์ฒด๋ผ์ ์์๋ณธ ๋ฆฌ์คํธ์ ๊ฐ์ด iterํจ์์ nextํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ํ์ด์ฌ ๊ธฐ๋ณธํจ์์ธ iter, next ๋ํ ์ฌ์ฉํ ์ ์๋ค. ๋ค์์ ๊ฐ๋จํ ํค๋ฅผ ์ถ๋ ฅํ๋ ๋์ ๋๋ฆฌ์ ๋ํ for ๋ฌธ์ while๋ฌธ์ผ๋ก ๊ตฌํํด ๋ณด์.
D = {'a': 1, 'b': 2, 'c': 3} changed_iterator = iter(D) while True: try: element = next(changed_iterator) except StopIteration: break print(element)
๋์ ๋๋ฆฌ๋ ์๋์ผ๋ก key๊ฐ๋ง ์ถ๋ ฅ์ด ๋๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ key๊ฐ๊ณ value ๊ฐ์ ๊ฐ์ด ์ฃผ๊ณ ์ถ๋ค๋ฉด,์ถ๋ ฅ ๋ถ๋ถ๋ง
print(element, D[element])
๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.