Generators in Python

References: Python Wiki, WikiDocs, [์ฑ…] ํŒŒ์ด์ฌ ์ฝ”๋”ฉ์˜ ๊ธฐ์ˆ 

What is Generator in Python?

1. Generator ๋ž€?

Iterator๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ

ํ•จ์ˆ˜ ๋‚ด๋ถ€์— yield keyword๊ฐ€ ํฌํ•จ๋˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Generator๊ฐ€ ๋œ๋‹ค

  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” iterator์˜ ์ผ์ข…

  • ์ œ๋„ค๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฒผ์ง€๋งŒ yield ๊ตฌ๋ฌธ ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ์‹œ์ ์— ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋Š” ์ง„์ž…์ ์ด ํ•˜๋‚˜๋ผ๋ฉด ์ œ๋„ค๋ ˆ์ดํ„ฐ๋Š” ์ง„์ž…์ ์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค

    • ์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ์‹œ์ ์— ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

  • Iterator๋Š” class ์— __iter__, __next__ ๋˜๋Š” __getitem__ method๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ,

    • Generator๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ yield keyword ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋์ž„

  • Generator๋Š” Iterator๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

  • Generator๋ฅผ ๋ฐœ์ƒ์ž ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ

  • Generator ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Generator ๊ฐ์ฒด๋ฅผ return ํ•œ๋‹ค

    ex)

    def generator_example():
        print('Print 1')
        print('Print 2')
        yield
    
    g = generator_example()
    print(g)
    next(g)

    Result

    image-20200726165007727
  • ํ•จ์ˆ˜ ์•ˆ์—์„œ yield๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋Š” Generator๊ฐ€ ๋˜๋ฉฐ, yield์—๋Š” ๊ฐ’(๋ณ€์ˆ˜)๋ฅผ ์ง€์ •ํ•œ๋‹ค

    ex)

    def number_generator():
        yield 0
        yield 1
        yield 2
        
    for number in number_generator():
        print(number)

    Result

    image-20200726162511720

  • ํ•จ์ˆ˜์— yield ๋งŒ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ iterator๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

  • Iterator๋Š” __next__ method์•ˆ์—์„œ ์ง์ ‘ return์œผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ์ง€๋งŒ,

    • Generator๋Š” yield์— ์ง€์ •ํ•œ ๊ฐ’์ด __next__ method์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋‚˜์˜ด

  • Iterator๋Š” raise๋กœ StopIteration ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ๋ฐœ์ƒ์‹œ์ผฐ์ง€๋งŒ,

    • Generator๋Š” ํ•จ์ˆ˜์˜ ๋๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด StopIteration ์˜ˆ์™ธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•จ

  • Generator๋Š” generator ๊ฐ์ฒด์—์„œ ๋‚ด์žฅํ•จ์ˆ˜ __next__ method ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ์•ˆ์˜ yield ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, yield์—์„œ ๊ฐ’์„ ๋ฐœ์ƒ์‹œํ‚ด

    • ๊ทธ๋ž˜์„œ ์ด๋ฆ„์ด Generator!!

  • generator์—์„œ yield์— ์ „๋‹ฌํ•œ ๊ฐ’์„ iterator๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค

    • Generator์—์„œ ๋ฐ˜ํ™˜ํ•œ iterator๋Š” gerator ํ•จ์ˆ˜์˜ ์•ˆ์— ์žˆ๋Š” yield ํ‘œํ˜„์‹์— ์ „๋‹ฌ๋œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค

  • Generator๋Š” ํ•จ์ˆ˜๋ฅผ ๋๋‚ด์ง€ ์•Š์€ ์ƒํƒœ์—์„œ yield๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ฐ–์œผ๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค

    • return์€ ๋ฐ˜ํ™˜ ์ฆ‰์‹œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€๋งŒ,

    • yield๋Š” ์ž ์‹œ ํ•จ์ˆ˜ ๋ฐ–์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์–‘๋ณด๋ฅผ ํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๋’ค, ๋‹ค์‹œ Generator ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

2. Generator ๋™์ž‘

  1. yield ๋ฌธ์ด ํฌํ•จ๋œ ์ œ๋„ค๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ œ๋„ค๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ ์ด ๋•Œ๋Š” ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

  2. next()๋ผ๋Š” ๋นŒํŠธ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ next() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์ ์œผ๋กœ iterator ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ __next__() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

  3. ์ฒ˜์Œ __next__() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์„ ์‹คํ–‰ํ•˜๋‹ค yield ๋ฌธ์„ ๋งŒ๋‚ฌ์„ ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

  4. ์ด ๋•Œ ๋ชจ๋“  local state ๋Š” ์œ ์ง€๋˜๋Š”๋ฐ ๋ณ€์ˆ˜์˜ ์ƒํƒœ, ๋ช…๋ น์–ด ํฌ์ธํ„ฐ, ๋‚ด๋ถ€ ์Šคํƒ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ƒํƒœ๋ฅผ ํฌํ•จํ•œ๋‹ค.

  5. ๊ทธ ํ›„ ์ œ์–ด๊ถŒ์„ ์ƒ์œ„ ์ปจํ…์ŠคํŠธ๋กœ ์–‘๋ณด(yield)ํ•˜๊ณ  ๋˜ __next__()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ œ๋„ค๋ ˆ์ดํ„ฐ๋Š” ์ค‘๋‹จ๋œ ์‹œ์ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

3. Generator์˜ ์žฅ์ 

  • Generator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ˆ„์ ๋œ ๊ฒฐ๊ณผ์˜ list๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ์— ๋ช…ํ™•ํ•˜๋‹ค

  • Generator๋Š” ๋ชจ๋“  ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ memory์— ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ž…๋ ฅ๊ฐ’์˜ ์–‘์„ ์•Œ๊ธฐ ์–ด๋ ค์šธ ๋•Œ๋„ ์—ฐ์†๋œ ์ถœ๋ ฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

  • ์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด yield ๋ฅผ ํ†ตํ•ด ๊ทธ๋•Œ๊ทธ๋•Œ ํ•„์š”ํ•œ ๊ฐ’๋งŒ์„ ๋ฐ›์•„ ์“ฐ๊ธฐ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๊ฒŒ๋œ๋‹ค

4. Generator์˜ ๋‹จ์ 

  • ๋‹ค๋งŒ ์ œ๋„ค๋ ˆ์ดํ„ฐ๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ํ•„์š”ํ•œ ๊ฐ’์„ ๋˜์ ธ์ฃผ๊ณ  ๊ธฐ์–ตํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— a ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด b ์ œ๋„ค๋ ˆ์ดํ„ฐ๋Š” ํ•œ๋ฒˆ ์‚ฌ์šฉ๋œ ํ›„ ์†Œ์ง„๋œ๋‹ค

  • ์ด๋Š” ๋ชจ๋“  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๋ฐ List, Set ์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€๋งŒ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์•„๋‹ˆ๊ธฐ์— ์†Œ์ง„๋˜์ง€ ์•Š๋Š”๋‹ค

Last updated

Was this helpful?