์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: Python

Python

ํŒŒ์ด์ฌ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ฐจ์ด์  ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ ์‚ฌ๋ก€๋ฅผ

๋ฐ˜๋ณต์ž์™€ ์ƒ์„ฑ๊ธฐ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ ์‚ฌ๋ก€๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.



๋‹ต๋ณ€

iterator๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค์— next๋ฉ”์†Œ๋“œ ( __next__Python 3)์™€ ๊ทธ __iter__๋ฉ”์†Œ๋“œ ๊ฐ€์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค return self.

๋ชจ๋“  ์ƒ์„ฑ๊ธฐ๋Š” ๋ฐ˜๋ณต์ž์ด์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ yieldํ‘œํ˜„์‹ ( yieldPython 2.5 ๋ฐ ์ด์ „ ๋ฒ„์ „์˜ ๋ช…๋ น๋ฌธ) ์ด์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋นŒ๋“œ๋˜๋ฉฐ ์ด์ „ ๋‹จ๋ฝ์˜์˜ ์ •์˜๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค iterator.

์ƒํƒœ ์œ ์ง€๊ฐ€ ๋‹ค์†Œ ๋ณต์žกํ•œ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ next(and __iter__๋ฐ __init__) ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋…ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๊ธฐ ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ (๋•Œ๋กœ๋Š” ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•œ ์š”๊ตฌ, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹ )๋กœ ์ถฉ๋ถ„ํ•˜๋ฉฐ ์ƒํƒœ ์œ ์ง€ (ํ•ฉ๋‹นํ•œ ํ•œ๊ณ„ ๋‚ด)๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ ˆ์ž„์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์žฌ๊ฐœ ๋จ์œผ๋กœ์จ โ€œ์™„๋ฃŒโ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋”ฉ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์„ฑ๊ธฐ :

def squares(start, stop):
    for i in range(start, stop):
        yield i * i

generator = squares(a, b)

๋˜๋Š” ๋“ฑ๊ฐ€ ์ƒ์„ฑ๊ธฐ ํ‘œํ˜„์‹ (genexp)

generator = (i*i for i in range(a, b))

์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ˜๋ณต์ž๋กœ ๋นŒ๋“œํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

class Squares(object):
    def __init__(self, start, stop):
       self.start = start
       self.stop = stop
    def __iter__(self): return self
    def next(self): # __next__ in Python 3
       if self.start >= self.stop:
           raise StopIteration
       current = self.start * self.start
       self.start += 1
       return current

iterator = Squares(a, b)

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ์ˆ˜์—…์„ ํ†ตํ•ด Squares์ถ”๊ฐ€ ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    def current(self):
       return self.start

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ.


๋‹ต๋ณ€

๋ฐ˜๋ณต์ž์™€ ์ƒ์„ฑ๊ธฐ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐ ์‚ฌ๋ก€๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์•ฝ : ๋ฐ˜๋ณต์ž๋Š”์ด ๊ฐœ์ฒด __iter__์™€์„ __next__( nextํŒŒ์ด์ฌ 2) ๋ฐฉ๋ฒ•. ์ƒ์„ฑ๊ธฐ๋Š” ๋ฐ˜๋ณต๊ธฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‰ฝ๊ณ  ๋‚ด์žฅ ๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

yield๊ฐ€์žˆ๋Š” ํ•จ์ˆ˜๋Š” ์—ฌ์ „ํžˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

def a_function():
    "when called, returns generator object"
    yield

์ƒ์„ฑ๊ธฐ ํ‘œํ˜„์‹์€ ๋˜ํ•œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

a_generator = (i for i in range(0))

๋ณด๋‹ค ์‹ฌ์ธต์  ์ธ ์„ค๋ช…๊ณผ ์˜ˆ์ œ๋ฅผ ๋ณด๋ ค๋ฉด ๊ณ„์† ์ฝ์œผ์‹ญ์‹œ์˜ค.

์ƒ์„ฑ๊ธฐ ๋Š” ๋ฐ˜๋ณต์ž์ž…๋‹ˆ๋‹ค

ํŠนํžˆ generator๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ํ•˜์œ„ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

>>> import collections, types
>>> issubclass(types.GeneratorType, collections.Iterator)
True

๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์ˆ˜์œจ์ด์žˆ๋Š” ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋˜๋ฉด ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

>>> def a_function():
        "just a function definition with yield in it"
        yield
>>> type(a_function)
<class 'function'>
>>> a_generator = a_function()  # when called
>>> type(a_generator)           # returns a generator
<class 'generator'>

๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๊ธฐ๋Š” ๋‹ค์‹œ ๋ฐ˜๋ณต์ž์ž…๋‹ˆ๋‹ค.

>>> isinstance(a_generator, collections.Iterator)
True

๋ฐ˜๋ณต์ž ๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅ

Iterator๋Š” Iterable์ž…๋‹ˆ๋‹ค.

>>> issubclass(collections.Iterator, collections.Iterable)
True

__iter__๋ฐ˜๋ณต์ž๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค .

>>> collections.Iterable()
Traceback (most recent call last):
  File "<pyshell#79>", line 1, in <module>
    collections.Iterable()
TypeError: Can't instantiate abstract class Iterable with abstract methods __iter__

iterables์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋‚ด์žฅ ํŠœํ”Œ, ๋ชฉ๋ก, ์‚ฌ์ „, ์„ธํŠธ, โ€‹โ€‹๊ณ ์ • ๋œ ์„ธํŠธ, ๋ฌธ์ž์—ด, ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด, ๋ฐ”์ดํŠธ ๋ฐฐ์—ด, ๋ฒ”์œ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ทฐ์ž…๋‹ˆ๋‹ค.

>>> all(isinstance(element, collections.Iterable) for element in (
        (), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))
True

๋ฐ˜๋ณต์ž ์—๋Š”next ๋˜๋Š” __next__๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค

ํŒŒ์ด์ฌ 2์—์„œ :

>>> collections.Iterator()
Traceback (most recent call last):
  File "<pyshell#80>", line 1, in <module>
    collections.Iterator()
TypeError: Can't instantiate abstract class Iterator with abstract methods next

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์ฌ 3์—์„œ :

>>> collections.Iterator()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Iterator with abstract methods __next__

๋‹ค์Œ iterํ•จ์ˆ˜ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด์žฅ ๊ฐ์ฒด (๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด)์—์„œ ๋ฐ˜๋ณต์ž๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

>>> all(isinstance(iter(element), collections.Iterator) for element in (
        (), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))
True

__iter__๋‹น์‹ ์ด์— ๋Œ€ํ•œ ๋ฃจํ”„์™€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ __next__๋ฐ˜๋ณต์ž ๊ฐ์ฒด ์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฃจํ”„์— ๋Œ€ํ•œ ๊ฐ ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๊ธฐ๊ฐ€ StopIteration์†Œ์ง„๋˜๋ฉด ์˜ฌ๋ผ๊ฐ€๊ณ  ๊ทธ ์‹œ์ ์—์„œ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ค๋ช…์„œ์—์„œ

๋‚ด์žฅ ์œ ํ˜• ๋ฌธ์„œ ์˜ ๋ฐ˜๋ณต์ž ์œ ํ˜• ์„น์…˜์˜ ์ƒ์„ฑ๊ธฐ ์œ ํ˜• ์„น์…˜์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค .

ํŒŒ์ด์ฌ์˜ ์ƒ์„ฑ๊ธฐ๋Š” ๋ฐ˜๋ณต๊ธฐ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด์˜ __iter__()๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒ์„ฑ์ž๋กœ ๊ตฌํ˜„๋˜๋ฉด, __iter__()๊ทธ๋ฆฌ๊ณ  next()[ __next__()in Python 3] ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ณต์ž ๊ฐ์ฒด (๊ธฐ์ˆ ์ ์œผ๋กœ ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด)๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ์‚ฐ๋Ÿ‰ ํ‘œํ˜„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

(๊ณตํฌ๋„ ์ถ”๊ฐ€๋จ)

์ด๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” Generators๊ฐ€ (ํŽธ๋ฆฌํ•œ) Iterator ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์ž ๊ฐ์ฒด ์˜ˆ

์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ Iterator ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Yes(collections.Iterator):

    def __init__(self, stop):
        self.x = 0
        self.stop = stop

    def __iter__(self):
        return self

    def next(self):
        if self.x < self.stop:
            self.x += 1
            return 'yes'
        else:
            # Iterators must raise when done, else considered broken
            raise StopIteration

    __next__ = next # Python 3 compatibility

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ„๋‹จํžˆ Generator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

def yes(stop):
    for _ in range(stop):
        yield 'yes'

๋˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ์ƒ์„ฑ๊ธฐ ํ‘œํ˜„์‹ (๋ชฉ๋ก ์ดํ•ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™) :

yes_expr = ('yes' for _ in range(stop))

๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

>>> stop = 4
>>> for i, y1, y2, y3 in zip(range(stop), Yes(stop), yes(stop),
                             ('yes' for _ in range(stop))):
...     print('{0}: {1} == {2} == {3}'.format(i, y1, y2, y3))
...
0: yes == yes == yes
1: yes == yes == yes
2: yes == yes == yes
3: yes == yes == yes

๊ฒฐ๋ก 

๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ Python ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•  ๋•Œ Iterator ํ”„๋กœํ† ์ฝœ์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ yieldGenerator Iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ Generator Expressions๋ฅผ ๊ณ ๋ คํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค .

๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒ์„ฑ๊ธฐ๋Š” ์ฝ” ๋ฃจํ‹ด์œผ๋กœ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. โ€˜์ œ์ž‘โ€™ํ‚ค์›Œ๋“œ์˜ ๊ธฐ๋Šฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? โ€˜์— ๋Œ€ํ•œ ๋‹ต๋ณ€์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์„ค๋ช… yieldํ•ฉ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋ฐ˜๋ณต์ž :

๋ฐ˜๋ณต์ž๋Š” next()๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ ํ•˜์—ฌ ๋‹ค์Œ ์ˆœ์„œ ๊ฐ’์„ ์–ป๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค .

๋ฐœ์ „๊ธฐ :

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” yield๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ จ์˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค .

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ (์˜ˆ : ์•„๋ž˜ ์˜ˆ์ œ์˜ ํ•จ์ˆ˜)์—์„œ ๋ฐ˜ํ™˜ ๋œ next()์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด (์˜ˆ : f์•„๋ž˜ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ)์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์€ foo()๋‹ค์Œ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. next()๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ ๋˜๋ฉด ํ•จ์ˆ˜๋Š” yield ๋ฌธ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜์—ฌ yield ๊ฐ’์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์œจ์€ ๋งˆ์ง€๋ง‰ ์‹คํ–‰์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ next()ํ˜ธ์ถœ์€ ์ด์ „ ๊ฐ’์—์„œ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด์—์„œ yield์™€ next ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

>>> def foo():
...     print "begin"
...     for i in range(3):
...         print "before yield", i
...         yield i
...         print "after yield", i
...     print "end"
...
>>> f = foo()
>>> f.next()
begin
before yield 0            # Control is in for loop
0
>>> f.next()
after yield 0
before yield 1            # Continue for loop
1
>>> f.next()
after yield 1
before yield 2
2
>>> f.next()
after yield 2
end
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

๋‹ต๋ณ€

๊ธฐ์กด ๋‹ต๋ณ€์ด ๊ณต์‹ ๋ฌธํ—Œ์˜ ํ˜ผ๋™์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ต๋ณ€ ์ถ”๊ฐ€

์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜ ๋Š”yield๋Œ€์‹ ์—์ •์˜ ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹คreturn. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋Š”next()๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ๋ฅผ ํ˜ธ์ถœnext()ํ•˜๋ฉด ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜์—์„œ ์ƒ์„ฑ ๋œ ๋‹ค์Œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ฝ์€ Python ์†Œ์Šค ๋ฌธ์„œ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ โ€œ์ œ๋„ˆ๋ ˆ์ดํ„ฐโ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์šฉ์–ด๋Š” ๊ทธ๋™์•ˆ, ๋ฐœ์ „๊ธฐ ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค ํŒŒ์ด์ฌ ์œ„ํ‚ค๊ฐ€ ๋ฐœ์ƒ ๊ฐœ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํŒŒ์ด์ฌ ํŠœํ† ๋ฆฌ์–ผ์€ ํ˜„์ €ํ•˜๊ฒŒ ์•”์‹œํ•˜๋Š” ๊ด€๋ฆฌ ๋‘ ์„ธ ๋ฌธ์žฅ์˜ ๊ณต๊ฐ„์—์„œ ์šฉ๋„๋ฅผ :

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘์„ฑ๋˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค yield ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. next ()๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๊ธฐ๋Š” ์ค‘๋‹จ ๋œ ์œ„์น˜์—์„œ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค (๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ’๊ณผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰ ๋œ ๋ช…๋ น๋ฌธ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค).

์ฒ˜์Œ ๋‘ ๋ฌธ์žฅ์€ ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ์ƒ์„ฑ๊ธฐ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์„ธ ๋ฒˆ์งธ ๋ฌธ์žฅ์€ ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ํ˜ผ๋ž€์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  , ๋ช…ํ™•ํ•˜๊ณ  ์ตœ์ข… ๋‹จ์–ด์— ๋Œ€ํ•œ ํŒŒ์ด์ฌ ์–ธ์–ด ์ฐธ์กฐ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

yield ํ‘œํ˜„์‹์€ ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ํ•จ์ˆ˜ ์ •์˜ ๋ณธ๋ฌธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ •์˜์—์„œ yield ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ •์˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋Œ€์‹  ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ƒ์„ฑ๊ธฐ๋ผ๋Š” ๋ฐ˜๋ณต๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ์ƒ์„ฑ๊ธฐ๋Š” ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์˜ ์‹คํ–‰์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณต์‹์ ์ด๊ณ  ์ •ํ™•ํ•œ ์‚ฌ์šฉ๋ฒ•์—์„œ โ€œ์ œ๋„ˆ๋ ˆ์ดํ„ฐโ€๋น„ ํ•œ์ •์ž๋Š” ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ฐธ์กฐ๋Š” Python 2์— ๋Œ€ํ•œ ๊ฒƒ์ด์ง€๋งŒ Python 3 ์–ธ์–ด ์ฐธ์กฐ ๋Š” ๊ฐ™์€ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ด์ฌ 3 ์šฉ์–ด ๋Š”

generator โ€ฆ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด์ง€ ๋งŒ ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ๋Š” ์ƒ์„ฑ๊ธฐ ๋ฐ˜๋ณต๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๋„ ๋œ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ „์ฒด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจํ˜ธ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ •๋ง ํ›Œ๋ฅญํ•˜๊ณ  ์ž์„ธํ•œ ๋‹ต๋ณ€์„ ์–ป์—ˆ์œผ๋ฉฐ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ฐœ๋…์ ์œผ๋กœ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์งง์€ ๋ช‡ ์ค„์˜ ๋‹ต๋ณ€์„์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์‹  ๋งŒ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๋งŒ๋“ค๋ฉด ์•ฝ๊ฐ„ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ตœ์†Œํ•œ iter์™€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฒˆ๊ฑฐ ๋กœ์›€์„ ํ”ผํ•˜๊ณ  ๋ฐ˜๋ณต๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ํŒŒ์ด์ฌ์€ ๋ฐ˜๋ณต์ž๋ฅผ ์ •์˜ํ•˜๋Š” ์ง€๋ฆ„๊ธธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜๋ฉด ๋ฐ˜๋ณต์ž์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” โ€ ๋ญ”๊ฐ€ โ€œ๋ฅผ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค (๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  for ๋ฃจํ”„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ์ด ์ผ์ด ์ƒ์„ฑ๊ธฐ๋ผ๋Š” ํŒŒ์ด์ฌ์—์„œ ์ด๋ฆ„์ด

๊ทธ๊ฒƒ์ด ์กฐ๊ธˆ ๋ช…ํ™• ํ•ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์ด์ „ ๋‹ต๋ณ€์€์ด ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์—๋Š” close๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฐ˜๋ณต์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด close๋ฉ”์†Œ๋“œ StopIteration๋Š” ์ƒ์„ฑ๊ธฐ์—์„œ ์˜ˆ์™ธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค .finally ํ•ด๋‹น ๋ฐ˜๋ณต๊ธฐ ์ ˆ์—์„œ ์ •๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๊ธฐํšŒ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์ด ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ๋ฐ˜๋ณต์ž๋ณด๋‹ค ๋Œ€๊ทœ๋ชจ์—์„œ ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋‹ซ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฐœ์ธ์ ์ธ ๋Œ€๋‹ต์€ : iteratable์—๋Š” __iter__๋ฉ”์†Œ๋“œ ๋งŒ ์žˆ๊ณ , ์ „ํ˜•์ ์ธ ๋ฐ˜๋ณต์ž๋Š” __next__๋ฉ”์†Œ๋“œ ๋งŒ ์žˆ๊ณ , ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์—๋Š” __iter__a __next__์™€ a ๋ฐ ์ถ”๊ฐ€๊ฐ€ close์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋‚ด ๊ฐœ์ธ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค ๋” ํƒ„๋ ฅ ์ดํ›„ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค์—, ๋‚˜๋Š” ๋ฐœ์ „๊ธฐ๋ฅผ ๋งŽ์ด ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ๋‹ค์Œ close์˜ ๋ฉ”์†Œ๋“œ์™€ ๋” ํฐ์˜ ์กฐํ•ฉ ์„ฑ์„ yield from. ๋กœ์ปฌ์—์„œ๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‰ํ‰ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ (๋ฐ˜๋ณต๊ธฐ๊ฐ€ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Œ)์ด๊ณ  ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹๋‹ค์†Œ ์งง์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ• ๋งŒํ•œ ์ด์œ ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŠนํžˆ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹๋๋‚˜๊ธฐ ์ „์— ์ค‘์ง€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ„ฐ๋Ÿด์„ ์ œ์™ธํ•˜๊ณ  ๋ฐ˜๋ณต์ž๋ฅผ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋กœ ๋ณด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์–ด ํ๋ฆ„ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ๊ธฐ๋Š” ์•ฝ์†๋งŒํผ์ด๋‚˜ ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ถ”์ƒ์ ์ด๋ฉฐ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋ฐœ์ „๊ธฐ ๊ธฐ๋Šฅ, ๋ฐœ์ „๊ธฐ ๊ฐ์ฒด, ๋ฐœ์ „๊ธฐ :

๋ฐœ์ „๊ธฐ ๊ธฐ๋Šฅ์€ ํŒŒ์ด์ฌ์—์„œ ์ •๊ทœ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ์ด์ง€๋งŒ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จ๋˜์–ด yield๋ฌธ์„. ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋Š” Iterator ๊ฐ์ฒด๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž ์ƒ์„ฑ ๊ธฐ๋Šฅ์— ์˜ํ•ด ์˜ค๋ธŒ์ ํŠธ returend๋„ ๋ถˆ๋ฆฐ๋‹ค ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด ๋˜๋Š” ๋ฐœ์ „๊ธฐ .

์ด ์˜ˆ์ œ์—์„œ๋Š” Generator ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Generator ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค <generator object fib at 0x01342480>. ๋‹ค๋ฅธ ๋ฐ˜๋ณต์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Generator ๊ฐ์ฒด๋Š” for๋ฃจํ”„์—์„œ ๋˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ next()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๊ธฐ์—์„œ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

def fib(max):
    a, b = 0, 1
    for i in range(max):
        yield a
        a, b = b, a + b
print(fib(10))             #<generator object fib at 0x01342480>

for i in fib(10):
    print(i)               # 0 1 1 2 3 5 8 13 21 34


print(next(myfib))         #0
print(next(myfib))         #1
print(next(myfib))         #1
print(next(myfib))         #2

๋”ฐ๋ผ์„œ ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋Š” Iterator ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์ž :

๋ชจ๋“  ์ƒ์„ฑ๊ธฐ ๊ฐ์ฒด ๋Š” ๋ฐ˜๋ณต์ž ์ด์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ __iter__ํ•˜๊ณ  __next__๋ฉ”์†Œ๋“œ (๋ฐ˜๋ณต์ž ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ ๋„ ํ•จ) ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ˜๋ณต์ž ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜, ๋ฐœ์ „๊ธฐ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๋‹ค ๋ฐ˜๋ณต์ž๋ฅผ ๊ทธ๋“ค์˜ ์ƒ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜๋Š” ๋ฐ˜๋ณต์ž๋Š” ๋‹น์‹ ์—๊ฒŒ ๋” ๋งŽ์€ ์ž์œ ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์•„๋ž˜์˜ ์˜ˆ์™€ ๊ฐ™์ด ๋‹น์‹ ์€ ๋˜ํ•œ ๋‹น์‹ ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Fib:
    def __init__(self,max):
        self.current=0
        self.next=1
        self.max=max
        self.count=0

    def __iter__(self):
        return self

    def __next__(self):
        if self.count>self.max:
            raise StopIteration
        else:
            self.current,self.next=self.next,(self.current+self.next)
            self.count+=1
            return self.next-self.current

    def __str__(self):
        return "Generator object"

itobj=Fib(4)
print(itobj)               #Generator object

for i in Fib(4):
    print(i)               #0 1 1 2

print(next(itobj))         #0
print(next(itobj))         #1
print(next(itobj))         #1

์ด ๊ธ€์€ Python ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.