๐ก ๋ณธ ํฌ์คํ ์ ์์ ๋ด์ฉ, ๊ต์ฌ, ChatGPT๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ํ์ต ๊ธฐ๋ก์ ๋๋ค.
๊ธ๊ณผ ๊ทธ๋ฆผ ๋ฑ ๋ชจ๋ ์ฝํ ์ธ ์ ์ ๋ฆฌ ๋ฐ ์์ฑ์ ๋ณธ ๋ธ๋ก๊ทธ์์ ์ง์ ์ ์๋์์ต๋๋ค.
Python ๊ธฐ์ด๋ถํฐ Streamlilt ๋ฐ์ดํฐ ์๊ฐํ๊น์ง ์ ๋ฆฌํ๋ ํ์ต ๊ธฐ๋ก์ ๋๋ค.
์ด ๊ธ์ '9. [ํ์ด์ฌ] iterator์ generator' ์ ๋๋ค.
ํ์ด์ฌ์ ๊ณต๋ถํ๋ค๋ณด๋ฉด for๋ฌธ์ ์ต์ํ๋ฐ, ์ ์ ๊ทธ ๋ค์์ ์ค์ ๋ก ๋ฌด์์ด ๋์๊ฐ๋์ง๋ ์ ์์ํ์ง ์๊ฒ ๋๋ค.
๋ฆฌ์คํธ, ํํ, ๋ฌธ์์ด, ๋์ ๋๋ฆฌ, set ๊ฐ์ ์๋ฃํ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ณตํด์์ง๋ง, ๊ทธ ๋ฐ๋ณต์ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํต์ฌ ๊ฐ๋ ์ด ๋ฐ๋ก iterable, iterator, generator ๋ค.
ํนํ ์ด์ ํฌ์คํ ์์ ๋ค๋ฃฌ map()๊ณผ filter()๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ง ์๊ณ iterator ์ฑ๊ฒฉ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ์ ์, ์ด๋ฒ ์ฃผ์ ์ค ใ ๋ฐ๋ก ์ฐ๊ฒฐ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ๊ทธ ํ๋ฆ์ ์ด์ด ๋ฐ์, ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด์ ๋ฐ๋ณต์, ๊ทธ๋ฆฌ๊ณ yield๋ฅผ ์ด์ฉํ generator ๊น์ง ํ ๋ฒ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๋ฌด์์ผ๊น
์ฐ๋ฆฌ๊ฐ ํ์ for๋ฌธ์ ๋ฃ๋ ๋๋ถ๋ถ์ ๋์์ iterable ์ด๋ค.
๋ง ๊ทธ๋๋ก "๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด"๋ผ๋ ๋ป์ด๋ค.
์๋ฅผ ๋ค์ด ๋ฆฌ์คํธ๋ ๋ํ์ ์ธ iterable ์ด๋ค.
topics = ["python", "sql", "streamlit"]
for topic in topics:
print(topic)
์คํ ๊ฒฐ๊ณผ
python
sql
streamlit
๋ฌธ์์ด๋ iterable ์ด๋ค.
for ch in "data":
print(ch, end=" ")
์คํ ๊ฒฐ๊ณผ
d a t a
๋์ ๋๋ฆฌ๋ iterable ์ด๋ค. ๋ค๋ง ๊ธฐ๋ณธ์ ์ผ๋ก๋ key๋ฅผ ์ํํ๋ค.
profile = {"name": "Matt", "track": "data"}
for key in profile:
print(key, profile[key])
์คํ ๊ฒฐ๊ณผ
name Matt
track data
์ฆ, iterable์ "for ๋ฌธ์ด ๋ฐ์์ ํ๋์ฉ ๊บผ๋ผ ์ ์๋ ๊ฐ์ฒด"๋ผ๊ณ ์๊ฐํ๋ฉด ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฝ๋ค.
iterable๊ณผ iterator๋ ๊ฐ์ ๋ง์ด ์๋๋ค
iterable๊ณผ iterator๋ ๋น์ทํด ๋ณด์ด์ง๋ง ๊ฐ์ ๊ฐ๋ ์ด ์๋๋ค.
- iterable : ๋ฐ๋ณตํ ์ ์๋ ๊ฐ์ฒด
- iterator : ์ค์ ๋ก ๋ค์ ๊ฐ์ ํ๋์ฉ ๊บผ๋ด๋ ๊ฐ์ฒด
๋ฆฌ์คํธ๋ฅผ ์๋ก ๋ณด๋ฉด ๋ ๋ถ๋ช ํ๋ค.
numbers = [10, 20, 30]
print(numbers)
print(iter(numbers))
์คํ ๊ฒฐ๊ณผ
[10, 20, 30]
<list_iterator object at 0x...>
๋ฆฌ์คํธ ์์ฒด๋ iterable์ด๊ณ , iter(numbers)๋ฅผ ํ์ ๋ ๋ง๋ค์ด์ง๋ ๊ฒ์ด iterator์ด๋ค.
์ฆ, ๋ฆฌ์คํธ๋ "๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ณธ"์ด๊ณ , iterator๋ "ํ์ฌ ์ด๋๊น์ง ์ฝ์๋์ง ๊ธฐ์ตํ๋ฉด์ ํ๋์ฉ ๊บผ๋ด๋ ๋๊ตฌ"๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
iter()์ next()๋ก ์ง์ ํ์ธํด๋ณด๊ธฐ
for๋ฌธ์ด ๋ด๋ถ์ ์ผ๋ก ํ๋ ์ผ์ ์ง์ ๋ณด๊ณ ์ถ๋ค๋ฉด iter()์ next()๋ฅผ ์จ๋ณด๋ฉด ์ข๋ค.
numbers = [10, 20, 30]
iterator = iter(numbers)
print(next(iterator))
print(next(iterator))
print(next(iterator))
์คํ ๊ฒฐ๊ณผ
10
20
30
์ฌ๊ธฐ์ iterator๋ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค.
์ด๋ฏธ ํ ๋ฒ ๊บผ๋ธ ๊ฐ์ ๋ค์ ์ฒ์๋ถํฐ ์๋์ผ๋ก ๋์๊ฐ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊น์ง ๋ค ๊บผ๋ธ ๋ค์ ํ ๋ฒ ๋ next()๋ฅผ ํธ์ถํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.
numbers = [10, 20]
iterator = iter(numbers)
print(next(iterator))
print(next(iterator))
print(next(iterator))
์คํ ๊ฒฐ๊ณผ
10
20
StopIteration
StopIteration์ ๋งค์ฐ ์ค์ํ๋ค.
iterator๋ ๋ ์ด์ ๊บผ๋ผ ๊ฐ์ด ์์ ๋ ์ด ์์ธ๋ก "๋ฐ๋ณต ์ข ๋ฃ"๋ฅผ ์๋ ค์ค๋ค.
for๋ฌธ์ ๋ด๋ถ์ ์ผ๋ก next()๋ฅผ ํธ์ถํ๋ค
์ฐ๋ฆฌ๊ฐ ์ง์ next()๋ฅผ ์์ฃผ ์ฐ์ง๋ ์์ง๋ง, ์ฌ์ค for๋ฌธ์ ๋ด๋ถ์ ์ผ๋ก iterator๋ฅผ ๋ง๋ค๊ณ next()๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ค์ ๋ ์ฝ๋๋ ๊ฐ๋ ์ ์ผ๋ก ๋น์ทํ๋ค.
scores = [80, 90, 100]
for score in scores:
print(score)
์คํ ๊ฒฐ๊ณผ
80
90
100
์ด๊ฒ์ ์กฐ๊ธ ํ์ด์ ์ฐ๋ฉด ์ด๋ฐ ๋๋์ด๋ค.
scores = [80, 90, 100]
iterator = iter(scores)
while True:
try:
score = next(iterator)
print(score)
except StopIteration:
break
์คํ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
์ฆ, for๋ฌธ์ ๋จ์ ๋ฌธ๋ฒ์ด ์๋๋ผ, iterable์ iterator๋ก ๋ฐ๊พธ๊ณ ๋ฐ๋ณต์ ๊ด๋ฆฌํด์ฃผ๋ ํธ๋ฆฌํ ๋ฌธ๋ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
map()๊ณผ filter()๊ฐ iterator๋ผ๋ ์ ๋ ์ฐ๊ฒฐ๋๋ค
์ด์ ํฌ์คํ ์์ ๋ค๋ฃฌ map()๊ณผ filter()๋ Python 3์์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ๋ฐํํ์ง ์๋๋ค.
์ด๋ค์ iterator ์ฑ๊ฒฉ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
mapped = map(lambda x: x * 2, [1, 2, 3])
filtered = filter(lambda x: x >= 2, [1, 2, 3])
print(mapped)
print(filtered)
์คํ ๊ฒฐ๊ณผ
<map object at 0x...>
<filter object at 0x...>
์ค์ ๊ฐ์ ๋ณด๋ ค๋ฉด ๊บผ๋ด์ผ ํ๋ค.
mapped = map(lambda x: x * 2, [1, 2, 3])
filtered = filter(lambda x: x >= 2, [1, 2, 3])
print(list(mapped))
print(list(filtered))
์คํ ๊ฒฐ๊ณผ
[2, 4, 6]
[2, 3]
์ด ์ ์ด ์ค์ํ ์ด์ ๋,
map()๊ณผ filter()๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ถ ๋ง๋ค์ด๋์ง ์๊ณ ํ์ํ ๋ ํ๋์ฉ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ตฌ์กฐ๋ผ๋ ๋ฐ ์๋ค.
์ด๊ฒ ๋ฐ๋ก iterator์ ์ฅ์ ๊ณผ ์ฐ๊ฒฐ๋๋ค.
iterator๋ ํ ๋ฒ ์๋ชจ๋๋ฉด ๋ค์ ์จ์ผ ํ๋ค
iterator๋ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ตํ๋ฏ๋ก, ํ ๋ฒ ๋๊น์ง ์ฌ์ฉํ๋ฉด ๋ค์ ์ฒ์๋ถํฐ ์ฝํ์ง ์๋๋ค.
items = iter(["a", "b", "c"])
print(list(items))
print(list(items))
์คํ ๊ฒฐ๊ณผ
['a', 'b', 'c']
[]
์ฒซ ๋ฒ์งธ list(items)์์ ์ด๋ฏธ ๋ชจ๋ ๊ฐ์ ์๋นํ๊ธฐ ๋๋ฌธ์, ๋ ๋ฒ์งธ์๋ ๋น ๋ฆฌ์คํธ๊ฐ ๋์จ๋ค.
์ด ์ฑ์ง์ generator์์๋ ๋๊ฐ์ด ๋ํ๋๋ค.
์ฆ, iterator๋ "๋ฐ๋ณต๊ฐ๋ฅํ ์ ์ฅ์"๋ผ๊ธฐ๋ณด๋ค "ํ๋ฆ์ ์์ผ๋ก ํ๋ ค๋ณด๋ด๋ ๊ฐ์ฒด"์ ๊ฐ๊น๋ค.
generator๋ ๋ฌด์์ธ๊ฐ
generator๋ iterator๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ํน๋ณํ ํจ์๋ค.
์ผ๋ฐ ํจ์๋ return์ ๋ง๋๋ฉด ๊ฐ์ ํ๋ ๋๋ ค์ฃผ๊ณ ๋๋์ง๋ง, generator ํจ์๋ yield๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ๋ด๋ณด๋ผ ์ ์๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ฅผ ๋ณด์.
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
์คํ ๊ฒฐ๊ณผ
<generator object simple_generator at 0x...>
1
2
3
์ฆ, generator ํจ์๋ ํธ์ถํ๋ค๊ณ ํด์ ๋ฐ๋ก ๋ด๋ถ ์ฝ๋๊ฐ ์ ๋ถ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ,
generator ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ํ์ํ ๋๋ง๋ค ํ ๋จ๊ณ์ฉ ์งํ๋๋ค.
yield๋ return๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅผ๊น
์ด ์ฐจ์ด๋ ๋งค์ฐ ์ค์ํ๋ค.
๋จผ์ ์ผ๋ฐ ํจ์๋ return์ ๋ง๋๋ฉด ์ข ๋ฃ๋๋ค.
def normal_function():
print("start")
return 100
print("end")
print(normal_function())
์คํ ๊ฒฐ๊ณผ
start
100
๋ฐ๋ฉด generator๋ yield์์ ์ ์ ๋ฉ์ถ ๋ค, ๋ค์ ํธ์ถ ๋ ์ด์ด์ ์คํ๋๋ค.
def number_flow():
print("first")
yield 10
print("second")
yield 20
print("third")
yield 30
gen = number_flow()
print(next(gen))
print(next(gen))
print(next(gen))
์คํ ๊ฒฐ๊ณผ
first
10
second
20
third
30
์ฆ, yield๋ ๊ฐ์ ๋ด๋ณด๋ด๋ฉด์ ํจ์์ ์คํ ์ํ๋ฅผ ์ ์ ์ ์ฅํด๋๋ค.
๊ทธ๋์ ๋ค์ next() ํธ์ถ ๋ ์ด์ ์ง์ ๋ถํฐ ๋ค์ ์ด์ด์ ์คํํ ์ ์๋ค.
generator๋ for๋ฌธ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ํํ ์ ์๋ค
์ค์ ๋ก๋ next()๋ฅผ ํ๋์ฉ ์ฐ๊ธฐ๋ณด๋ค, for๋ฌธ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
def countdown():
yield 3
yield 2
yield 1
for number in countdown():
print(number)
์คํ ๊ฒฐ๊ณผ
3
2
1
์ด๋ ๊ฒ ๋ณด๋ฉด generator๋ ๊ฒฐ๊ตญ iterator์ ํ ์ข ๋ฅ๋ผ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๊ฒ ์ดํด๋๋ค.
for๋ฌธ์ generator๋ฅผ ๋ฐ์๋ ๋๊ฐ์ด ์ ๋์ํ๋ค.
range()๋ ๋น์ทํ ์ฒ ํ์ผ๋ก ์ดํดํ ์ ์๋ค
์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฐ๋ range()๋ ๋ฆฌ์คํธ์ฒ๋ผ ์๊ธด ๊ฐ์ ์ ๋ถ ๋ฏธ๋ฆฌ ๋ค๊ณ ์๋ ๊ฒ์ด ์๋๋ผ, ํ์ํ ๋ ๊ฐ์ ๊ณ์ฐํด์ ์ ๊ณตํ๋ ์ชฝ์ ๊ฐ๊น๋ค.
r = range(5)
print(r)
print(list(r))
์คํ ๊ฒฐ๊ณผ
range(0, 5)
[0, 1, 2, 3, 4]
range() ์์ฒด๋ generator๋ ์๋์ง๋ง,
"๋ชจ๋ ๊ฐ์ ํ ๋ฒ์ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด ์ ์ฅํ์ง ์๊ณ , ๋ฐ๋ณตํ ๋ ํ์ํ ๊ฐ์ ์ ๊ณตํ๋ค"๋ ์ ์์ iterator/generator์ ํ์ต ๊ฐ๊ฐ๊ณผ ์ ์ฐ๊ฒฐ๋๋ค๊ณ ํ๋ค.
generator๊ฐ ์ ์ค์ํ๊ฐ
generator์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ '๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์๋ค'๋ ์ ์ด๋ค.
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ง๋ค์ด ์ ์ฅํ์ง ์๊ณ , ํ์ํ ๋๋ง๋ค ํ๋์ฉ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด ํฐ ์ ๋ฒ์๋ฅผ ๋ค๋ฃฐ ๋ ์ฐจ์ด๊ฐ ํฌ๋ค.
numbers_gen = (n * 2 for n in range(5))
print(numbers_gen)
print(list(numbers_gen))
์คํ ๊ฒฐ๊ณผ
<generator object <genexpr> at 0x...>
[0, 2, 4, 6, 8]
๊ฒ์ผ๋ก ๋ณด์ด๋ ๊ฒฐ๊ณผ๋ ๋น์ทํ์ง๋ง, ๋ด๋ถ ์ฒ ํ์ ๋ค๋ฅด๋ค.
- ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ : ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ
- generator expression : ํ์ํ ๋๋ง๋ค ๊ฐ ์์ฑ
์์ ๋ฐ์ดํฐ์์๋ ์ฐจ์ด๋ฅผ ์ฒด๊ฐํ๊ธฐ ์ด๋ ต์ง๋ง, ๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ์ด ์ฐจ์ด๋ ๋งค์ฐ ์ค์ํด์ง๋ค.
generator expression
๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ ๋ฐฐ์ ๋ค๋ฉด generator expression๋ ํจ๊ป ์์๋๋ ๊ฒ์ด ์ข๋ค.
squares_list = [n ** 2 for n in range(1, 6)]
squares_gen = (n ** 2 for n in range(1, 6))
print(squares_list)
print(squares_gen)
print(next(squares_gen))
print(next(squares_gen))
์คํ ๊ฒฐ๊ณผ
[1, 4, 9, 16, 25]
<generator object <genexpr> at 0x...>
1
4
๋ฌธ๋ฒ ์ฐจ์ด๋ ๋๊ดํธ [ ] ๋์ ์๊ดํธ ( )๋ฅผ ์ด๋ค๋ ์ ์ธ๋ฐ, ์๋ฏธ ์ฐจ์ด๋ ํจ์ฌ ํฌ๋ค.
๋ฆฌ์คํธ๋ ์์ฑ๋ ๊ฒฐ๊ณผ์ด๊ณ , generator expression์ "๋์ค์ ํ๋์ฉ ๊บผ๋ผ ์ ์๋ ํ๋ฆ"์ด๋ค.
์ค๋ฌด์ ์ฐ์ด๋ ์์
generator๋ ํ์ผ ์ฝ๊ธฐ, ๋ก๊ทธ ์ฒ๋ฆฌ, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, API ์๋ต ์คํธ๋ฆฌ๋ฐ ๊ฐ์ ๊ณณ์์ ํนํ ๊ฐ๋ ฅํ๋ค.
์๋ฅผ ๋ค์ด ์์ฃผ ๋ง์ ์ค์ด ์๋ ํ์ผ์ ํ๊บผ๋ฒ์ ์ ๋ถ ๋ฆฌ์คํธ๋ก ์ฝ์ด๋ค์ด๋ ๋์ , ํ ์ค์ฉ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ๊ฐ๋ฅํ๋ค.
์๋์ ๊ฐ์ ๋๋์ผ๋ก ์ดํดํ๋ฉด ์ถฉ๋ถํ๋ค.
def even_numbers(limit):
for n in range(limit + 1):
if n % 2 == 0:
yield n
for value in even_numbers(10):
print(value, end=" ")
์คํ ๊ฒฐ๊ณผ
0 2 4 6 8 10
์ด ํจ์๋ ์ง์ ์ ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ฆฌ์คํธ๋ก ๋ง๋๋ ๋์ , ํ๋์ฉ ์ฐจ๋ก๋๋ก ๋ด๋ณด๋ธ๋ค.
์ด๋ฐ ๋ฐฉ์์ ๋ฐ์ดํฐ๊ฐ ์ปค์ง์๋ก ํจ์ฌ ์ ๋ฆฌํ๋ค.
iterable, iterator, generator๋ฅผ ํ ๋ฒ์ ๋น๊ตํด๋ณด์
๋ฆฌ์คํธ๋ iterable ์ด๋ค.
data = [1, 2, 3]
print(hasattr(data, "__iter__"))
print(hasattr(data, "__next__"))
์คํ ๊ฒฐ๊ณผ
True
False
๋ฆฌ์คํธ๋ก๋ถํฐ ๋ง๋ iterator๋ ๋ค์ ๊ฐ์ ๊บผ๋ผ ์ ์๋ค.
data_iter = iter(data)
print(hasattr(data_iter, "__iter__"))
print(hasattr(data_iter, "__next__"))
์คํ ๊ฒฐ๊ณผ
True
True
generator๋ iterator์ ํ ์ข ๋ฅ๋ค.
gen = (x for x in range(3))
print(hasattr(gen, "__iter__"))
print(hasattr(gen, "__next__"))
์คํ ๊ฒฐ๊ณผ
True
True
์ฆ, ๊ด๊ณ๋ฅผ ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
- ๋ฆฌ์คํธ, ๋ฌธ์์ด, ํํ, ๋์ ๋๋ฆฌ, set ๋ฑ์ iterable
- iter(๋ฆฌ์คํธ) ๊ฒฐ๊ณผ๋ iterator
- generator๋ iterator๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ํน๋ณํ ํํ
์ค์ํ๊ธฐ ์ฌ์ด ํฌ์ธํธ
์ฒซ์งธ, iterable๊ณผ iterator๋ฅผ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณด๋ฉด ์ ๋๋ค.
๋ฆฌ์คํธ๋ iterable์ด์ง๋ง, ๋ฐ๋ก next(๋ฆฌ์คํธ)๋ฅผ ํ ์๋ ์๋ค.
items = [1, 2, 3]
# next(items) # TypeError
๋ฐ๋์ iter()๋ก iterator๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
items = [1, 2, 3]
it = iter(items)
print(next(it))
์คํ ๊ฒฐ๊ณผ
1
๋์งธ, iterator๋ ํ ๋ฒ ์๋น๋๋ฉด ๋์ด๋ค.
๊ฐ์ iterator๋ฅผ ๋ค์ ์ฒ์๋ถํฐ ์ฐ๊ณ ์ถ๋ค๋ฉด ์๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ ์งธ, generator ํจ์๋ return์ด ์๋๋ผ yield๋ฅผ ์ค์ฌ์ผ๋ก ์ดํดํด์ผ ํ๋ค.
yield๋ ๊ฐ์ ๋ด๋ณด๋ด๊ณ ๋๋๋ ๊ฒ์ด ์๋๋ผ, ์ ์ ๋ฉ์ถ ๋ค ๋ค์ ํธ์ถ์ ์ด์ด์ ์คํ๋๋ค๋ ์ ์ด ํต์ฌ์ด๋ค.
๋ท์งธ, ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ๊ณผ generator expression์ ๋ฌธ๋ฒ์ด ๋น์ทํ์ง๋ง ๋์ ๋ฐฉ์์ ๋ค๋ฅด๋ค.
ํ๋๋ ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๊ณ , ๋ค๋ฅธ ํ๋๋ ํ์ํ ๋ ๊ฐ์ ๋ง๋ ๋ค.
๋ง๋ฌด๋ฆฌ
iterator์ generator๋ ์ฒ์์๋ ์กฐ๊ธ ์ถ์์ ์ผ๋ก ๋๊ปด์ง ์ ์์ง๋ง, ์ฌ์ค ํ์ด์ฌ์ ๋ฐ๋ณต ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ํต์ฌ ๊ฐ๋ ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ต์ํ๊ฒ ์ฌ์ฉํด์จ for๋ฌธ, map(), filter(), range() ๊ฐ์ ๊ฒ๋ค์ด ๋ชจ๋ ์ด ํ๋ฆ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค.
'Python & SQL > Python Basics' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 11. [ํ์ด์ฌ] Python ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (0) | 2026.03.08 |
|---|---|
| 10. [ํ์ด์ฌ] mutable vs immutable (0) | 2026.03.07 |
| 7. [ํ์ด์ฌ] ํจ์ ๊ธฐ์ด์ ๋งค๊ฐ๋ณ์ (0) | 2026.03.07 |
| 6. [ํ์ด์ฌ] set๊ณผ frozenset (0) | 2026.03.07 |
| 5. [ํ์ด์ฌ] ๋์ ๋๋ฆฌ (0) | 2026.03.06 |