티스토리 뷰

중첩함수 Nested function

  • 중첩함수는 함수 안에 또 다른 함수가 있는 것을 한다고 칸다.
  • 중첩함수는 자기 자신이 속한 함수 안에서만 사용이 가능함. (local 변수 작동 원리랑 비슷)

주피터 노트북에서 내부에 있는 중첩함수인 inner_function을 print 해보았으나 파이썬은 대답이 없다. 이게 머선일이고?!

outer_function을 불러 보니 outer_function, inner_function 모두 잘 출력이 되는 것을 볼 수 있다. 그렇다 위에서 말했듯이 중첩함수는 outer_function 안에 있는 함수이다 보니 밖에서 불러도 나오질 않는다.

중첩함수 녀석을 쓰기 위해서는 어떻게 해야 할까?

  • 중첩함수를 함수 밖에서도 호출 할 수 있는 방법이 있는데, 그것을 이해하기 위해서는 세 가지의 개념들이 필요하다.
    1. First-class 풜스트 끌래쓰lol
    2. Closure 클로줠lol
    3. Decorator 데코레이퉐lol

1. First-class

* 파이썬의 함수들은 객체로써 사용할 수 있다. EX) int 또는 list 처럼

* 그 말인즉슨 함수를 다른 함수의 인자로 받아 사용 할 수도 있다는 것이다.

* First-class 에 대해 많은 자료들을 읽어봤는데 하나 같이 어렵다. 

* 쉽게 말해서 함수 써놓고 리턴 값 박아 넣고 변수 하나 정해서 그 속에다가 집어 넣은 다음 인자를 넣어주면 함수 리턴 값이 실행 된다.

1. plus 라는 함수를 뚝딱 만들고 리턴값은 number 더하기 number로 주었다.

2. function이라는 변수를 만들고 plus 함수를 박아 넣어 주었다. 이것이 퍼스트 클라스 

3. 그런다음 변수인 function를 함수처럼 number에 '1'을 넣고 찍었더니 작동을 한다. 우와 신기방기

왜 가능한 것인가? 그것은 파이썬에서는 모든 것을 객체로 쓰기 때문이다. (어마 무시하게 편리한 기능이라고 들었다.)

2. Closure

* 이전에 함수를 다른 변수(function)에 박아 넣어서 결과 값(2)을 뽑아 보았다. 

* Closure는 First-class와 동일하지만 위에 number에 해당하는 값도 미리 정해서 저장하여 불러 낼 수 있다.

* message 라는 함수를 만들어 isay 인자에 '밥 뭇나' 를 집어 넣고 what 변수에 박아 넣어 두었다.

* 그런 다음 what 에 변수 '밥 뭇다 아이가'를 넣으면 isay 와 usay가 모두 출력되는 것을 볼 수 있다.

* 사실 what = message('밥 뭇나')를 할 때 함수 message는 호출이 끝나 버리는 바람에 what('밥 뭇다 아이가') 에서 내부 함수인 make_some_noise가 호출 되어서 위의 예시와 같이 출력 되는 것을 알 수 있다.

message 함수가 호출이 끝났다는 사실을 증명하기 위해서는 밑에 예제를 보도록 하자.

message 함수를 삭제하고 what에 다른 인자 '아직 안 뭇다 뭐 먹고 싶노' 를 넣었더니 아직도 message가 호출되는 소름 돋는 상황이 벌어진다.

그 이유는 First-class(what = message('밥 뭇나')를 만들 때 이미 message 함수의 실행 값이 what이라는 변수에 저장되고 호출이 끝났기 때문이다. 컴퓨터 너어어어 ! 참으로 똑똑하지 않을 수가 없다. 

3. decorator

  • 데코레이터는 만들어 놓은 함수를 '@' 뒤에 적어서 손쉽게 땡겨 올 수 있다.

밥 시간을 물어보면 현재 시간을 나타내는 중첩함수를 만들어 데코레이터로 땡겨와서 시간을 알려주는 귀여운 함수를 만들어 보았다.

function 변수 자체에 let_us_eat 이라는 함수가 들어 가기 때문에 저렇게 함수가 실행이 될 수 있다.
첫 블로그 포스팅, 미흡한 부분이 많아 과연 올려도 될까 하며 두근 두근하지만 열심히 적어 보았다. 
그리고 마크 다운 적는 방법도 배우고 있으니 다음번엔 더욱 깔끔하고 재미있게 적어 보겠다. 에헷 너무 기쁘다 >ㅂ< ~~~

 

'Python' 카테고리의 다른 글

[Python] Numbers  (0) 2022.01.27
[Python] Errors  (0) 2022.01.27
[Python] Variables  (0) 2022.01.26
[Python] Strings  (0) 2022.01.26
[Python] Print  (0) 2022.01.26
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함