9. [ํŒŒ์ด์ฌ] iterator์™€ generator

2026. 3. 7. 09:10ยทPython & SQL/Python Basics
๐Ÿ’ก ๋ณธ ํฌ์ŠคํŒ…์€ ์ˆ˜์—… ๋‚ด์šฉ, ๊ต์žฌ, 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
'Python & SQL/Python Basics' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • 11. [ํŒŒ์ด์ฌ] Python ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
  • 10. [ํŒŒ์ด์ฌ] mutable vs immutable
  • 7. [ํŒŒ์ด์ฌ] ํ•จ์ˆ˜ ๊ธฐ์ดˆ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜
  • 6. [ํŒŒ์ด์ฌ] set๊ณผ frozenset
J. Son
J. Son
Petit à petit l'oiseau fait son nid.
  • J. Son
    Steady Study Log
    J. Son
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (170) N
      • Python & SQL (63)
        • Python Basics (21)
        • Python Problems (23)
        • Python Practice (11)
        • MySQL (1)
        • Git & GitHub (7)
      • ML & DL (7) N
      • Projects (5)
        • Project Portfolio (5)
      • AI Camp (4)
        • Camp Reflection (4)
      • Concept Notes (6)
        • Statistics & Stata (4)
        • Mathematics (2)
      • Archive (84)
        • Java (24)
        • R (1)
        • Languages (49)
        • Miscellaneous (10)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
    • WikiDocs
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ ํ”„ํˆฌํŒŒ์ด์ฌ ์—ฐ์Šต๋ฌธ์ œ
    ๋ณตํ•ฉ๊ณผ๊ฑฐ
    Python
    ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ 300์ œ
    ํŒŒ์ด์ฌ ๋ฌธ์ œ
    ์ ํ”„ํˆฌํŒŒ์ด์ฌ ์—ฐ์Šต๋ฌธ์ œ ํ’€์ด
    Le Petit Prince
    ํŒŒ์ด์ฌ
    streamlit
    ์ž๋ฐ”
    ์–ด๋ฆฐ์™•์ž ํ”„๋ž‘์Šค์–ด
    MySQL
    ๋ถˆ์–ด ๊ณต๋ถ€
    ํ”„๋กœ์ ํŠธ ์˜ค์ผ๋Ÿฌ
    Stata
    ํŒŒ์ด์ฌ ํฌ๋กค๋ง
    ํ”„๋ž‘์Šค์–ด ๊ณต๋ถ€
    ๋จธ์‹ ๋Ÿฌ๋‹
    ์–ด๋ฆฐ์™•์ž ๋ถˆ์–ด
    Github
    GIT
    ๋งฅ git
    share.streamlit.io
    ํŒŒ์ด์ฌ streamlit
    ๋ถˆ์–ด ๊ด€๊ณ„๋Œ€๋ช…์‚ฌ
    ๊ฐ์ฒด
    passe compose
    machine learning
    python problem
    python streamlit
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
J. Son
9. [ํŒŒ์ด์ฌ] iterator์™€ generator
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”