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?