AIFFEL - Python(6) first-class object & closure

JoBoB·2023년 11월 18일
0

AIFFEL - Python

목록 보기
9/10
post-thumbnail

AIFFEL에서 배운 first-class object와 closure를 정리하자.


일급 객체

사실 일급 객체라는 내용은 공부하면서 크게 중요도를 느끼지 못했다.
그치만, 나중에 '아~ 함수가 일급 객체이기 때문에 그렇구나' 라는 느낌이 있어 정리한다.

일급 객체 조건
1. 변수에 할당되거나, 자료구조에 담길 수 있다.
2. 함수의 parameter로 들어갈 수 있다.
3. 함수의 return 값으로 들어갈 수 있다.

이 조건을 보면 우리가 쓰고 있는 int, float, str 등이 모두 일급 객체임을 알 수 있다.

int를 예시로 들어보면,

하지만 제일 중요한 것은 따로 있는데,

                  파이썬에서는 함수 또한 일급객체이다.


이제 이 부분을 확인해보자

모든 조건을 만족시켜, 일급객체라는 것을 증명했다.


사용법

1. 고차함수

  • 고차함수 : 함수를 인자로 받거나, 결과로 반환하는 함수
                  전에 배운 map과 sorted, filter 등이 있다.

2. 콜백 (callback)

  • callback : 매개변수로 넘겨주는 코드
# 대표적인 callback 형태
map(add_2,test_list)

이때, map은 함수를 인자를 받고 있기에 고차함수이며, 호출당하는 add_2는 콜백함수라고 한다.


Q) 왜 callback 이라 말하는가??

A) 원래는 사용자가 쓴 코드에서 함수를 호출하는 것이 정방향

이렇게 반대로 호출해서 call + back 이라고 한다.


변수의 범위

사실 이번 내용들은 모두 closure를 이해하기 위한 buildup 이다.
그렇기에 두번째 내용으로는 변수의 범위를 이해해야 한다.

변수 종류

  • 전역변수 : 코드 전체에서 접근할 수 있는 범위 ( 전역 범위 : 전역 변수 접근 범위 )
  • 지역변수 : 함수 안에서 접근 가능한 변수 ( 지역 범위 : 지역 변수 접근 범위 )

모든 변수는 외부에서 읽어오는 것은 허용하지만, 쓰는 것은 제한적이다.

보면, x에 대한 수정하는 것은 '특별한 언급'이 없다면, 모두 local 변수로 보기 때문에 참조할 값이 없다고 나오는 것이다.

→ 특별한 언급은 뒤에서 global, nonlocal을 통해 배운다.

전역변수

검은색으로 표시된 부분이 전역범위이다.
함수 내부와 외부에서 모두 잘 불러온다.


지역변수

검은색 표시가 지역범위이다.
함수 내부에서는 불러올 수 있지만, 외부에서의 변수 호출은 불가하다.


global

우리는 이제 위에서 말한 '특별한 언급'을 배울 것이다.

  • global : 전역 변수를 수정하거나 생성하기 전 사용할 명령어
# global a = 10 이런 식으로 붙여서 쓸 순 없다.
global a

global 역할

  • 전역변수가 생성되어 있지 않다면, a를 전역변수로 생성한다.
  • 전역변수가 생성되어 있다면, 전역변수 a를 가져온다는 의미

nonlocal

  • nonlocal : 지역변수를 수정하기 전에 사용할 명령어
# 동일하게 nonlocal a = 10 은 불가하다.
nonlocal a

알아두어야 할 점은, 지역변수가 없다고 지역변수를 생성하지 않고 오류 출력

global과 동일하게 외부 영역에 있는 지역변수를 불러와 수정할 수 있다.


+) 변수 호출

x라는 변수를 호출하게 되면, x를 찾을 때가지 여러 scope (영역)에서 찾게 된다.

1. local scope : 함수 내부 영역
2. nonlocal(enclosing) : 해당 함수를 감싸고 있는 영역
3. global : 메인 프로그램 영역
4. built-in : 키워드나 에러 exception이 담긴 공간


위 과정과 동일하게 nonlocal 변수는 global 이하의 영역면서 local 이상인, 즉 nonlocal 영역에 있다면, 우선순위는 nonlocal 키워드와 가까운 순으로 높다.


nonlocal과 global을 함께 쓴 코드를 보고 복습해보자


Closure

차후 정리

profile
딥러닝을 메인으로 나아가고자 하는 뉴비입니다

0개의 댓글