λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
🀷🏼‍♀️ Etc.../- C, C++, Python, Android

Python Generator & Decorator 파이썬 μ œλ„ˆλ ˆμ΄ν„°μ™€ λ°μ»€λ ˆμ΄ν„°λž€?

by Wonit 2019. 12. 7.

Generator μ œλ„ˆλ ˆμ΄ν„°

μ œλ„ˆλ ˆμ΄ν„°λŠ” κ°„λ‹¨ν•œ ν”„λ‘œκ·Έλž¨λ³΄λ‹€ μ‹œκ°μ  이미지 뢄석 인곡 신경망인 CNN(convolution nural network) λͺ¨λΈμ˜ μ„±λŠ₯을 높이기 μœ„ν•œ 방법 쀑 ν•˜λ‚˜μΈ 데이터 증식에 많이 쓰인닀.

파이썬 μ œλ„ˆλ ˆμ΄ν„°λŠ” μ‹œν€€μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 객체이닀. 기쑴에 μ‚¬μš©ν•˜λ˜ λ°©μ‹μ²˜λŸΌ

 

전체 μ‹œν€€μŠ€λ₯Ό ν•œ λ²ˆμ— λ©”λͺ¨λ¦¬μ— μƒμ„±ν•˜κ³  μ •λ ¬ν•  ν•„μš” 없이

, 잠재적으둜 μ•„μ£Ό 큰 μ‹œν€€μŠ€λ₯Ό μ œλ„ˆλ ˆμ΄ν„°λ‘œ μˆœνšŒν•  수 μžˆλ‹€.

 

μ œλ„ˆλ ˆμ΄ν„°λŠ” μš°λ¦¬κ°€ 전에 μ‚¬μš©ν–ˆλ˜ range() ν•¨μˆ˜λ„ μ œλ„ˆλ ˆμ΄ν„°μ˜ μ’…λ₯˜μ€‘ ν•˜λ‚˜μ΄λ‹€.

 

range()쀑 ν•˜λ‚˜λΌκ³  ν•˜λ©΄ 감이 μž‘νžˆλŠ” μ‚¬λžŒμ΄ 있고 μž‘νžˆμ§€ μ•ŠλŠ” μ‚¬λžŒμ΄ μžˆμ„ν…λ° ν•œ 번 같이 λ”°λΌκ°€λ³΄μž.

 

1μ—μ„œ 100κΉŒμ§€ λ”ν•˜λŠ” 예제
>>> sum(range(1, 101))
5050

μ œλ„ˆλ¦¬μ—ν„°λ₯Ό μˆœνšŒν•  λ•Œ λ§ˆλ‹€, λ§ˆμ§€λ§‰μœΌλ‘œ 호좜된 값을 κΈ°μ–΅ν•˜κ³  κ·Έ λ‹€μŒ 값을 λ°˜ν™˜ν•˜λŠ” 것이 range()의 νŠΉμ„±μΈλ° 일반 ν•¨μˆ˜μ™€ 달리 μ œλ„ˆλ ˆμ΄ν„°λŠ” 이전 ν˜ΈμΆœμ— λŒ€ν•œ λ©”λͺ¨λ¦¬κ°€ μ—†λ‹€λŠ” 점이 μžˆλ‹€.

 

이 사싀을 짚고 이제 잠깐의 μ œλ„ˆλ ˆμ΄ν„°λ₯Ό κ²½ν—˜ν•΄λ³΄μž.

yield

Generatorλ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ” yield ν‚€μ›Œλ“œλ₯Ό μ•Œμ•„μ•Ό ν•˜λŠ”λ°, yield은 ν•¨μˆ˜λ₯Ό μ’…κ²°ν•˜μ§€ μ•Šκ³  값을 계속 λ°˜ν™˜ν•  λ•Œ μ‚¬μš©λœλ‹€.


이 말을 μ’€ 더 ν’€μ–΄μ„œ 말 ν•˜μžλ©΄

반볡적으둜 값을 return ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.

def genFunc():
    yield 1
    yield 2
    yield 3

print(list(genFunc()))
>>> [1, 2, 3]

yield 문이 ν•¨μˆ˜ μ•ˆμ—μ„œ μ–΄λ–€ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” 것을 μ œλ„ˆλ ˆμ΄ν„°λΌκ³  ν•œλ‹€.

 

generator

generator : yieldκ°€ ν¬ν•¨λœ ν•¨μˆ˜ 라고 κ°„λ‹¨ν•˜κ²Œ 이야기 ν•  수 μžˆλ‹€.

 

μ œλ„ˆλ ˆμ΄ν„°μ— λŒ€ν•œ κΉŠμ€ λ‚΄μš©μ€ 좔후에 CNN 신경망에 λŒ€ν•΄ ν•™μŠ΅ν•  λ•Œ 더 깊게 봐보자!

 

λ°μ»€λ ˆμ΄ν„°

λ°μ»€λ ˆμ΄ν„°λž€ ν•˜λ‚˜μ˜ ν•¨μˆ˜λ₯Ό μ·¨ν•΄μ„œ 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

 

μš°λ¦¬κ°€ λ°μ»€λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ μ†ŒμŠ€μ½”λ“œλ₯Ό 바꾸지 μ•Šκ³ , μ‚¬μš©ν•˜κ³  μžˆλŠ” ν•¨μˆ˜λ₯Ό μˆ˜μ •ν•˜μ—¬, ν•¨μˆ˜μ— μ „λ‹¬λœ 인자, 디버깅을 ν•  수 있게 λœλ‹€.

 

λ§Œμ•½ μš°λ¦¬κ°€ λ§€κ°œλ³€μˆ˜ a와 bλ₯Ό λ”ν•΄μ£ΌλŠ” ν•¨μˆ˜κ°€ μžˆλ‹€κ³  ν•΄λ³΄μž.

def adding(a, b):
    return a + b

이제 이 ν•¨μˆ˜μ— λŒ€ν•œ 정보λ₯Ό κ°‘μžκΈ° μ–»κ³  싢을 λ•Œκ°€ μžˆλ‹€.

 

예λ₯Ό λ“€μ–΄ ν•¨μˆ˜ μ΄λ¦„μ΄λΌλ˜μ§€, λ§€κ°œλ³€μˆ˜λ‘œ μ–΄λ–€ 값이 λ“€μ–΄κ°”λŠ”μ§€κ°€ μ•Œκ³ μ‹Άμ„ λ•Œ λ°μ»€λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•œλ‹€.

 

λ°μ»€λ ˆμ΄ν„°
def proove_it(func):
    do_func(*args):
        print('Running function name is : ', func.__name__)
        print('arguments is : ', args)
        result = func(*args)
        print('Result: ', result)
        return result
    return do_func

λ°μ»€λ ˆμ΄ν„°λ₯Ό μƒμ„±ν•˜μ˜€λ‹€.

 

λ°μ»€λ ˆμ΄ν„°μ—λŠ” Running function name에 λŒ€ν•œ 정보와 arguments에 λŒ€ν•œ 정보, λ§ˆμ§€λ§‰μœΌλ‘œ result κ²°κ³Όλ₯Ό 좜λ ₯μ‹œμΌœμ€€λ‹€.

 

κΈ°μ‘΄ ν•¨μˆ˜ addingμ—μ„œλŠ” 단지 result만 좜λ ₯μ‹œμΌ°λ‹€λ©΄ proove_itλ°μ»€λ ˆμ΄ν„°μ—μ„œλŠ” λ‹€μ–‘ν•œ 정보λ₯Ό ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€.

 

λ°μ»€λ ˆμ΄ν„° μ‚¬μš© 방법

λ°μ»€λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μ—λŠ” 두 가지 방법이 μžˆλ‹€.

 

  • μˆ˜λ™μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 방법
    μˆ˜λ™μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 방법은 λ°μ»€λ ˆμ΄ν„° 이름에 인자둜 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•œλ‹€.
def info_it(func):
    def new_function(*args):
        print('Running function', func.__name__)
        print('Positional arguments:', args)
        result = func(*args)
        print('Result: ', result)

        return result
    return new_function

def adding(a, b):
    return a + b

Manual_use = info_it(add_ints)
Manual_use(3, 4)
  • @decorator_name 으둜 ν•¨μˆ˜ μœ„μ— μΆ”κ°€μ‹œν‚€λŠ” 방법
    ν•¨μˆ˜ μœ„μ— μ–΄λ…Έν…Œμ΄μ…˜κ³Ό 같은 λ°©μ‹μœΌλ‘œ μΆ”κ°€ν•œλ‹€.

    def info_it(func):
      def new_function(*args):
          print('Running function', func.__name__)
          print('Positional arguments:', args)
          result = func(*args)
          print('Result: ', result)
    
          return result
      return new_function
    
    @info_it
    def add_ints(a, b):
    return a + b
    
    add_ints(3, 4)
    

     

λ˜ν•œ λ°μ»€λ ˆμ΄ν„°λŠ” λ‹€μ€‘μœΌλ‘œ μ μš©ν•  수 μžˆλ‹€.

λŒ“κΈ€