python의 특징 - first class object, inner function, closure, 데코레이터(decorator)

1. first-class object

 

변수나 데이터 구조에 객체를 할당할 수 있다

 

parameter 값으로 전달할 수도 있고 return 값으로도 사용할 수 있다

 

파이썬의 모든 함수

 

square라는 함수를 f라는 변수로 사용

 

 

 

 

2. inner function

 

함수 내에 또 다른 함수를 넣을 수 있음

 

print_msg 안에 printer()라는 함수가 존재함

 

 

 

 

3. closure

 

inner function을 return 함

 

 

 

another라고 하지 않고 왜 another()라고 할까?

 

another에는 printer라는 함수가 return되어 있음

 

그래서 함수 사용하듯이 사용해야함

 

 

 

 

h1_func라고 하면 메모리 주소가 출력되는데

 

h1_func에 함수 inner_func가 리턴되어 있으니까 함수 사용하듯이 h1_func()라 해야함

 

 

4. decorator

 

복잡한 closure을 간단하게 표현해줌

 

@(외부함수)형태로 나타냄

 

 

 

 

printer(‘hello’,’*’)이면 msg, mark에 hello, *들어감

 

@star로 되어있어서 star함수 호출하면서 func인자에  printer가 들어감 그러면서 inner를 return한거임

 

inner를 return하는데 *args에 (‘hello’,’*’)이 들어가는거임

 

그러면서 1번줄에 arg[1]인 *이 30개 찍히고

 

2번줄에는 func(‘hello’,’*’)수행되는데 func는 printer(‘hello’,’*’)라서  print(‘hello’)가 수행되는거

 

그리고 다음줄에 *30개

 

 

 

 

printer(‘hello’)하면서 msg에 ‘hello’들어감

 

@star하면서 star에 먼저 printer가 들어감

 

#그러면서 star의 inner를 먼저 return한거임

 

*args에 ‘hello’가 들어가는거임

 

1번줄에 *30개 출력

 

2번줄에 printer(‘hello’)를 다시 호출

 

그런데 printer(‘hello’)가 다시 percent에 들어가는거임

 

그러면서 percent의 inner를 return한거임

 

그러면서 2번째줄에 %가 30개 출력되고

 

가운데에 hello가 출력되는거임

 

 

 

 

데코레이터 순서를 바꾸니까 이렇게 나옴

 

 

 

 

 

 

 

 

generate_power(2)하면서 exponent에 2가 들어감

 

데코레이터에 인자 넣으면, 데코레이터가 먼저 실행되나보네

 

그러면서 wrapper를 먼저 return한거임

 

그래서 wrapper의 f에 raise_two(n)이 들어감

 

그러면서 wrapper는 inner를 return한거임

 

raise_two(7)의 결과값은 7^2으로 49인데 print()문에 의해 알 수 있음

 

그러면서 마지막으로 inner의 exponent ** result 즉 2^49가 return

TAGS.

Comments