본문 바로가기
Python 과 머신러닝/I. 기초 문법

Python 기초 5장. 함수 (2)

by JoyfulS 2019. 9. 30.

< 공부한 내용 >

4. 중첩함수

5. nonlocal 그리고 getter와 setter

6. 함수 장식자

7. 재귀함수

 

4. 중첩함수

'''
중첩함수
형식)
def outer() :
     실행문
     def inner() :
          실행문
     return inner
'''

# 1. 중첩함수 예
def a() :
     print('a')
     def b():
          print('b')
     return b

a() # a
b = a()
b() # b
'''
inner 함수 호출은 반환 객체를 이용한다.
클로저 함수 : outer 함수에 의해서 반환된 inner 함수
'''

# 2. 중첩함수 활용 예
'''
outer 함수 : 자료(data) 생성, inner 함수 포함
inner 함수 : 자료 연산/처리(합계, 평균)
'''

def calc_func(data) : # outer 함수
     dataset = data # 자료 생성

     def sum_func() :
          tot = sum(dataset)
          return tot

     def avg_func(tot) :
          avg = tot / len(dataset)
          return avg

return sum_func, avg_func    # 클로저 함수 반환

data = list(range(1,101))    # 1~100 정수

# data 생성, 클로저 함수 반환
sum_func, avg_func = calc_func(data)

# 합계 계산
tot = sum_func()
avg = avg_func(tot)
print('tot = %d, avg = %.3f' %(tot, avg)) # tot = 5050, avg = 50.500

 

5. nonlocal 그리고 getter와 setter

# nonlocal
# - outer의 data inner에서 사용할 경우
'''
getter() : 함수 내의 변수값을 외부로 반환 함수 (return 있음)
-> 잔액 확인 함수
setter() : 함수 내의 변수값을 외부에서 수정 함수 (인수 있음)
-> 입금 함수, 출금 함수
'''

# 중첩함수 정의
def main_func(data) : # outer : data 생성
     dataset = data # data 생성

     def get_data() : # inner : getter 역할
          return dataset

     def set_data(update) : # inner : setter 역할
          #dataset = update # local
          nonlocal dataset # outer 변수
          dataset = update

     return get_data, set_data  # 클로저 함수 반환

# 외부함수 호출 : data 생성
get_data, set_data = main_func(100)

# 내부함수 호출 : getter()
print('dataset =', get_data()) # getter

# 내부함수 호출 : setter()
set_data(200# 100 -> 200 수정

 

 

6. 함수 장식자

'''
함수 장식자(decorator)
- 기존 함수의 시작부분과 종료부분에 기능을 추가하는 역할
- 랩핑 함수(Wrapping function)

형식)
@함수 장식자
def 함수() :
     실행문
'''
# 랩퍼 함수
def wrap(func) : # outter
     def decorated() : # inner
          print("반가워요~")
          func()
          print("잘가요~")
     return decorated

# 인사말 함수
@wrap
def hello() :
     print('Hi~', "홍길동")

hello()
'''
반가워요~ - wrapper
Hi~ 홍길동
잘가요~  - wrapper
'''

 

7. 재귀함수

'''
재귀함수(recursive function)
- 함수 내부에서 자신의 함수를 반복 호출하는 기법
- 용도 : 반복적으로 변수를 변경해서 연산(카운터 : n=n+1, 누적, 팩토리얼(5!=1*2*3*4*5)
'''


# 1. 카운터 (1~n)
def Counter(n) : # n = 5 -> 1, 2, 3, 4, 5
     # 종료 조건
     if n == 0 :
          return 0 # break
     else :
          Counter(n-1) # 재귀 호출 : stack[5(first), 4, 3, 2, 1] | 0 ]
          '''
          1. 1씩 감소하면서 자신함수 호출, 호출과정에서 생성된 n값은 stack에 저장
          2. stack[5, 4, 3, 2, 1]
          3. 종료조건 -> return 값은 stack에 저장 안됨
             재귀호출 다음 문장 실행(stack 역순 출력), stack : LIFO(후입선출)
          '''
          print(n, end= ' ') # stack 역순으로 출력

Counter(0) # 0 반환
Counter(5) # 1 2 3 4 5

# 2. 누적 : (n) = 1 + 2 + 3 + ... + n
def Adder(n) :
     if n == 1 : # 종료조건
          return 1
     else :
          result = n + Adder(n-1) # 누적변수
          '''
          1. 1씩 감소하면서 자신함수 호출, 호출과정에서 생성된 n 값은 stack에 저장(계산하지 않음)
             stack[5(first), 4, 3, 2, 1]
          2. 종료 조건 : 1 + [2 + 3 + 4 + 5] = result
          '''
          return result

# 재귀호출 없는 경우
print('n=1 :', Adder(1))    # n=1 : 1
# 재귀호출 있는 경우 
print('n=5 :', Adder(5))    # n=5 : 15
print('n=100 :', Adder(100))    # n=100 : 5050

 

------------------------------------------------------- example -------------------------------------------------------

 

 

exam03.py
0.00MB
exam04.py
0.00MB

댓글