λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Language/Python

[문법] μ œλ„ˆλ ˆμ΄ν„°(Generator)

 πŸ’‘ μ œλ„ˆλ ˆμ΄ν„°(Generator)λž€?

  • λ£¨ν”„μ˜ 반볡(Iteration) λ™μž‘μ„ μ œμ–΄ν•  수 μžˆλŠ” 루틴 ν˜•νƒœμ΄λ‹€. 
  • μ΄ν„°λ ˆμ΄ν„°(Iterator)와 μœ μ‚¬ν•œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ‚˜ μ—„μ—°νžˆ λ‹€λ₯΄λ‹€.
  • μ»΄ν”„λ¦¬ν—¨μ…˜ 문법을 μ‚¬μš©ν•΄μ„œ 생성할 수 μžˆλ‹€. (by 'μ œλ„ˆλ ˆμ΄ν„° ν‘œν˜„μ‹(generator expression)')
  • ν•¨μˆ˜ 문법을 μ‚¬μš©ν•΄μ„œ 생성할 수 μžˆλ‹€.

β€» [μ°Έκ³ ] λ°˜λ³΅κ°€λŠ₯객체(Iterable)κ³Ό μ΄ν„°λ ˆμ΄ν„°(Iterator)

더보기

βœ” μ •μ˜

  • λ°˜λ³΅κ°€λŠ₯객체(Iterable)
    : μš”μ†Œλ₯Ό ν•œλ²ˆμ— ν•˜λ‚˜μ”© κ°€μ Έμ˜¬ 수 μžˆλŠ” 객체λ₯Ό μ˜λ―Έν•œλ‹€. 
    : ν•΄λ‹Ή μžλ£Œν˜•μœΌλ‘œλŠ” '리슀트, λ”•μ…”λ„ˆλ¦¬, νŠœν”Œ, λ¬Έμžμ—΄, μ…‹, range, map''등이 μžˆλ‹€.
    : λ°˜λ³΅κ°€λŠ₯객체의 경우 파이썬 λ‚΄μž₯ν•¨μˆ˜μΈ 'iter()'을 μ΄μš©ν•΄ 반볡자 객체둜 λ§Œλ“€ 수 μžˆλ‹€. 
    l = [10, 20, 30]
    l_iter = iter(l)  # 반볡 κ°€λŠ₯ μžλ£Œν˜•
    
    n = 100
    n_itr = iter(n)  # 반볡 λΆˆκ°€λŠ₯ μžλ£Œν˜• => μ—λŸ¬ λ°œμƒ ('int' object is not iterable)
    
  • μ΄ν„°λ ˆμ΄ν„°(Iterator)
    : '반볡자'라고도 뢈리며, λ°˜λ³΅κ°€λŠ₯κ°μ²΄μ—μ„œ 각 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄κ²Œ ν•˜λŠ” 객체이닀.
    : 반볡 κ°€λŠ₯ν•œ 객체(Iterable)와 μ—„μ—°νžˆ λ‹€λ₯Έ 객체이닀.
    : '__iter__', '__next__' λ©”μ†Œλ“œλ₯Ό κ°€μ§€λ©° next λ©”μ†Œλ“œλ₯Ό 톡해 μš”μ†Œλ₯Ό 순차적으둜 κΊΌλ‚Έλ‹€.

 

βœ” λ™μž‘ κ³Όμ •   

: 반볡 κ°€λŠ₯ 객체 iter() ν•¨μˆ˜ 반볡자 객체(iterator) next() ν•¨μˆ˜/Stop

  1. 반볡 κ°€λŠ₯ν•œ 객체(Iterable)κ°€ '__iter__' λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄ν„°λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ •μ˜ν•œλ‹€.
  2. κ·Έ ν›„ μ΄ν„°λ ˆμ΄ν„°μ˜ '__next__' λ©”μ†Œλ“œλ₯Ό 톡해 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 좜λ ₯ν•˜λ©° 이λ₯Ό λ°˜λ³΅ν•œλ‹€. 
  3. μš”μ†Œκ°€ λͺ¨λ‘ 좜λ ₯되고 더 이상 좜λ ₯ν•  μš”μ†Œκ°€ 없을 경우 StopIteration μ˜ˆμ™Έ μ—λŸ¬μ™€ ν•¨κ»˜ λ°˜λ³΅μ„ μ’…λ£Œν•œλ‹€.
Iterable 객체의 λ™μž‘ κ³Όμ •

 

βœ” 체킹 방법

반볡자 및 반볡객체의 μ—¬λΆ€ 체킹
→객체에 '_iter_' λ©”μ†Œλ“œκ°€ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ²΄ν‚Ήν•˜λ©΄ 됨.  by'dir()'

# dir() : 인자인 객체가 μ–΄λ–€ λ³€μˆ˜μ™€ λ©”μ†Œλ“œ(method)λ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ λ‚˜μ—΄ν•΄μ£ΌλŠ” 파이썬의 λ‚΄μž₯ν•¨μˆ˜.
check = dir([1, 2, 3])
print(check)

 

 


+ 'μ‹œν€€μŠ€ 객체'와 'λ°˜λ³΅κ°€λŠ₯ν•œ 객체' 비ꡐ 

  • μ‹œν€€μŠ€ 객체 : μˆœμ„œ X. 반볡 κ°€λŠ₯ O.
  • λ°˜λ³΅κ°€λŠ₯객체 : μˆœμ„œ O. 반볡 κ°€λŠ₯ O.

 

 

 

 

 β–ͺ️ μ œλ„ˆλ ˆμ΄ν„°(Generator) vs μ΄ν„°λ ˆμ΄ν„°(Iterator)

μ œλ„ˆλ ˆμ΄ν„°(generator)  μ΄ν„°λ ˆμ΄ν„° (iterator)
- ν•¨μˆ˜ μ•ˆμ—μ„œ yieldλΌλŠ” ν‚€μ›Œλ“œλ§Œ μ‚¬μš©ν•˜λ©΄ κ΅¬ν˜„ μ™„λ£Œ.
- __next__ λ©”μ„œλ“œ λ™μž‘μ‹œ, yieldμ—μ„œ μ§€μ •ν•œ 값이 λ°˜ν™˜λ¨.
- ν•¨μˆ˜μ˜ 끝 λ„λ‹¬μ‹œ μžλ™μœΌλ‘œ StopIteration μ˜ˆμ™Έκ°€ λ°œμƒ.
- μ—¬λŸ¬λ²ˆ 값을 κ°€μ Έμ˜¬ μˆ˜κ°€ μ—†λ‹€. (κ°’ μ†ŒλΉ„. 이전/이후 κ°’ X)
- λ©”λͺ¨λ¦¬λ₯Ό 비ꡐ적 적게 μ‚¬μš©ν•œλ‹€. 
-ν•˜λ‚˜μ˜ ν•¨μˆ˜μ—μ„œ μ—¬λŸ¬ νƒ€μž…μ˜ κ°’ 생성 κ°€λŠ₯.
- __iter__, __next__,__getitem__ λ©”μ„œλ“œλ“€ κ΅¬ν˜„ μš”κ΅¬.
- __next__ λ©”μ„œλ“œ λ™μž‘μ‹œ, 직접 return으둜 값을 λ°˜ν™˜ν•¨.
- 반볡 μ’…λ£Œμ‹œ raise둜 StopIterationλ₯Ό 직접 λ°œμƒμ‹œν‚΄.
- μ—¬λŸ¬λ²ˆ 값을 κ°€μ Έμ˜¬ μˆ˜κ°€ μžˆλ‹€. 
- λ©”λͺ¨λ¦¬λ₯Ό 비ꡐ적 많이 μ‚¬μš©ν•œλ‹€. 
-ν•˜λ‚˜μ˜ ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ μ·¨κΈ‰.

 

β€» [μΆ”κ°€μžλ£Œ] Iterator vs Generator's λ™μž‘ 방식 비ꡐ

더보기

βœ” Iterator의 λ™μž‘ 방식

→ λͺ¨λ“  λ™μž‘μ„ μ™„λ£Œν•œ ν›„ κ²°κ³Όλ₯Ό ν•œλ²ˆμ— λ©”λͺ¨λ¦¬ 적재 μ‹œν‚΄.

 

βœ” Generator의 λ™μž‘ 방식

 κ°κ°μ˜ yieldμ—μ„œ ν•œ 번 μ‹€ν–‰μ‹œν‚¨ ν›„ λŒ€κΈ° μƒνƒœμ— λ“€μ–΄κ°€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•¨.

이후 λ‹€μŒ μ½”λ“œλ₯Ό μ§„ν–‰ν•˜μ—¬ 또 λ‹€μ‹œ yieldλ₯Ό λ§Œλ‚  경우 λŒ€κΈ° μƒνƒœμ— λ“€μ–΄κ°€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•¨.

 

 

 

 

 β–ͺ️ μ œλ„ˆλ ˆμ΄ν„°(Generator)의 νŠΉμ§• 및 μž₯점

 'μž„μ˜μ˜ 쑰건으둜 숫자 1μ–΅κ°œλ₯Ό λ§Œλ“€μ–΄λ‚΄ κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.' 라고 κ°€μ •ν•΄λ³΄μž. μ œλ„ˆλ ˆμ΄ν„°κ°€ μ—†λ‹€λ©΄ λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— λ§Œλ“€μ–΄λ‚Έ 숫자 1μ–΅ 개λ₯Ό λ³΄κ΄€ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€. ν—ˆλ‚˜ μ œλ„ˆλ ˆμ΄ν„°λ₯Ό μ΄μš©ν•œλ‹€λ©΄ λ‹¨μˆœνžˆ μ œλ„ˆλ ˆμ΄ν„°λ§Œ 생성해두고 ν•„μš”ν•  λ•Œ μ–Έμ œλ“  숫자λ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆλ‹€. νŠΉνžˆλ‚˜ 1μ–΅ 개 쀑 100개 μ •λ„λ§Œ 쓰인닀면 μ°¨μ΄λŠ” λ”μš± 클 것이닀

 

  1. λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±
    리슀트의 경우 데이터λ₯Ό ν•œ λ²ˆμ— λ©”λͺ¨λ¦¬μ— μ μž¬ν•˜κΈ° λ•Œλ¬Έμ—, λ©”λͺ¨λ¦¬ λΆ€μ‘±ν˜„μƒμ΄ 일어날 경우 ν”„λ‘œκ·Έλž¨μ΄ κ°‘μžκΈ° 죽을 수 μžˆλ‹€. ν—ˆλ‚˜ μ œλ„ˆλ ˆμ΄ν„°λŠ” 값인 데이터에 μ ‘κ·Όν•  λ•Œ λ§ˆλ‹€ λ©”λͺ¨λ¦¬μ— μ μž¬ν•˜κΈ° λ•Œλ¬Έμ—, 큰 데이터λ₯Ό λ‹€λ£¨λŠ” 경우 보닀 μ•ˆμ •μ μ΄κ³  νš¨μœ¨μ μ΄λ‹€.
  2. 게으λ₯Έ μ—°μ‚°
    리슀트의 경우 리슀트 μ»΄ν”„λ¦¬ν•Έμ…˜μ„ μˆ˜ν–‰μ‹œ, λͺ¨λ“  값을 λ¨Όμ € μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μˆ˜ν–‰λ˜λŠ” 연산이 였래 κ±Έλ¦¬κ±°λ‚˜ μ—°μ‚°λœ 값에 μ ‘κ·Όν•˜λŠ” μ‹œκ°„μ΄ κ½€ κ±Έλ¦°λ‹€. ν—ˆλ‚˜ μ œλ„ˆλ ˆμ΄ν„°λŠ” κ·Έ λ•Œ κ·Έ λ•Œ yieldλ₯Ό 톡해 값에 μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— μˆ˜ν–‰ μ‹œκ°„μ΄ κΈ΄ 연산을 ν•„μš”ν•œ μˆœκ°„κΉŒμ§€ 늦좜 수 μžˆλ‹€λŠ” 점이 μž₯점이닀. 

 

λ”°λΌμ„œ μ΄λŸ¬ν•œ νŠΉμ§•λ“€μ„ μœ λ…ν•˜μ—¬ ν•„μš”ν•œ 곳에 μ‚¬μš©ν•œλ‹€λ©΄ 보닀 μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ°κ³Ό μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆμ„ 것이닀. :) 

 

 

728x90