함수는 일등 시민(first-class citizen)
일등 시민(first-class citizen)이라고? 정말 생소한 개념이다.
익숙하진 않지만, 다음 조건을 충족한다면 일등 시민이라고 할 수 있다.
변수나 데이터에 할당 할 수 있어야 한다.
객체의 인자로 넘길 수 있어야 한다.
객체의 리턴값으로 리턴 할 수 있어야 한다.
엥? 그거 다 되는거 아니야? 싶겠지만 파이썬에서는 독특하게도 함수도 위와 같은 기능을 수행한다.
이러한 특징을 가진 일급 객체(first-class citizen)를 사용하면 손쉽게 함수를 재활용 할 수 있다.
1. 함수를 변수에 할당 가능
return x * xf1 = square_numbers # f1이라는 '변수'에 함수를 할당!f2 =
괄호를 붙이고 안붙이고 차이를 알아야 한다.
괄화를 안 붙이면
print(id(square)
과 id(f1))
을 출력해보자.
2. 함수를 함수의 인자로 전달 가능
return x ** 2result =for i in arg_lists:# func()는 함수를 호출한 '결과(return)' 값을 얻는다.&nbnbsp; # 여기서 얻어진 값들을 빈 result 리스트에 넣는다.num_list =squares = # square 함수를 인자(argument)로 해서 전달한다!print(squares)>>> 출력결과
먄악, 함수를 인자로 전달하는 기능이 없다면 중복되는 코드가 많이 발생한다. 아마 아래처럼.
result =for i in arg_list:return resultresult =for i in arg_list:return result
3. 함수를 다른 함수 내에서 정의 가능 (4번에서 같이 살펴보자)
4. 함수의 결과값으로 또 다른 함수를 리턴 가능
처음 보면 이해하기 힘들다. 차근차근 살펴보자.
# 1급 객체의 특징 : 함수를 리턴할 수 있다.#1 , #3#4, #10print("Log : ", msg) #11return log_message #5log_hi = #2, #6print(log_hi) #6 #7#9>>> 출력결과<function log.<locals>.log_message at 0x7f8638260c80> #8Log : Hello Everybody #11
인터프리터의 해석 순서대로
#
번호를 따라간다.#2번
에서 log함수의 리턴값을log_message
라는 '변수'에 할당하고 있다.log 함수가 어떻게 생겨먹는지 보러가자.
#3번
에 있다.log_message
함수를 정의해주고 #4에서 #5로 넘어간다. 무언가를 리턴해주고 있다.log_message가 어떻게 생겨먹었는지
#6
에서 프린트로 찍어보자#8
를 살펴보면 뭔진 모르겠는데 아무튼 function이 출력된다.아~~까
#2번
에서 할당한 값이함수(function)
이라니! 한번 함수를 실행해보자#9번
에서 실행해보고 있다.이제서야
#10
으로 간다.마지막
#11
에서 msg를 출력한다근데, msg는 어디서 났지? log_message 함수에는
msg
라는 파라미터가 전달된 적 없는데?log_message()
와 같은 함수를 클로저(closure) 함수라고 한다.클로져(closure) 함수는
#1번
의 log함수가 종료되더라도, 지역변수를 기억하고 있는다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬] 데코레이터(Decorator) 이해하기 (3) | 2017.05.21 |
---|---|
[파이썬] 클로져(Closure) 이해하기 (1) | 2017.05.20 |
[파이썬] 리스트 컴프리헨션(list comprehension)의 이해 (1) | 2017.05.05 |
[파이썬] 행렬(matrix)과 리스트 컴프리헨션(list comprehension) 이해하기 (0) | 2017.05.05 |
[파이썬] 문자열 압축하기 (2) | 2017.02.26 |