< 공부한 내용 >
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 -------------------------------------------------------
'Python 과 머신러닝 > I. 기초 문법' 카테고리의 다른 글
Python 기초 7장. 파일 입출력 (0) | 2019.10.10 |
---|---|
Python 기초 6장. 클래스(Class) (0) | 2019.10.02 |
Python 기초 5장. 함수 (1) (0) | 2019.09.30 |
Python 기초 4장. 정규표현식 (0) | 2019.09.30 |
Python 기초 3장. 자료구조 (0) | 2019.09.30 |
댓글