first class citizen > first class object/ first class function
객체지향 프로그래밍(OOP) 중에서 파이썬을 포함한 몇몇프로그래밍 언어에서 볼 수 있음
객체로 이루어진 것 => 파이썬 이라고 생각
함수도 객체냐? Yes -> 변수에 함수를 할당해 줄 수 도 있고 아래 이유에 해당됨
Scope (LEGB 룰)
어떤 변수나 함수를 접근할 수 있는 범위
파이썬에서 변수에 값을 바인딩하거나 변수의 값을 참조하는 경우 LEGB 규칙을 따름
L Local의 약자로 함수 내 범위
n = 1
def func():
print(n) #error
n = n + 1 # error
print(n)
func()
->지역변수를 찾을수 없기에! (왜냐 그 스코프 안에서 밑에 이미 n이라고 지역변수로 할당을 하게되니까... 전역변수가 아닌 지역변수로 찾게됨 ,n = n+1 d없으면 에러 안나옴)
E Enclosed function locals의 약자로 내부함수에서 자신의 외부 함수의 범위를 의미
(nested function-> 중첩함수)
함수는 그안에 또 함수를 쓸 수 있는데 (중첩함수) 일떄, 부모안에 선언된 변수를 중첩함수 안에서도 쓸수 있다는 개념???
G Global의 약자로 함수 바깥 즉, 전체 범위
B Built-in의 약자로 원래 가지고 있는 내장함수 같은거
변수 쉐도잉? -> 지역변수로 전역변수를 가린다
a = 1 -> Global
b = 2 -> Global
def outer():
a = 10 ->outer함수의 local이며, inner함수의 Enclosed
def inner():
c=3 -> inner 함수의 local
print(a, b, c)
inner()
a = 5 -> outer함수의 local이며, inner함수의 Enclosed
inner()
outer()
10 2 3
5 2 3
global Keyword : local 변수이지만 global 키워드를 사용해서 값이 local 이 아닌 global 영역에 있는 변수를 사용할 수 있게 함
x = 10
def test(y):
global x
x = y + 10 -> 전역변수 x를 사용하게끔 해줌
y = 10
test(y)
print(x) -> 20
전역 영역이 아닌 중첩된 함수의 변수를 사용하려고 할 경우에 변수를 nonlocal로 선언할 수 있음 ( 내부함수에서 외부함수의 변수를 사용하려고 할때)
nonlocal Keyword: 현재 함수의 지역 변수가 아니라는 뜻이며 바깥쪽 함수의 지역 변수를 사용
Nested function(중첩함수)
함수는... 함수안에...함수를 쓸수있고....
가독성 &
클로저-> 내부로직을 고치지 않고도 데코레이터를 이용해서 기능을 추가하거나 바꿀수 있음
클로저를 알아야...
Higher-order Function (고위함수)
-함수를 파라미터로 전달 받는 함수
-함수를 리턴하는 함수
둘 중 하나만 해당되도 고위함수라고 할 수 있다
Ex) filter(), map(), sorted()...
파이썬 빌트인 함수 중에서 대표적인 고차함수로 map이 있습니다. map 함수는 인자로서 함수와 순회가능한 객체를 받습니다.
def double(num):
return num * 2
num_list = [1, 2, 3, 4, 5]
doubled_num_list = list(map(double, num_list))
print(doubled_num_list) -> [2, 4, 6, 8, 10]
->double이라는 함수와 숫자 리스트들을 매개변수로 주었다
데코레이터, 클로저 개념을 알아야...!
중요 !!! 일급객체, scope , 클로저(데코레이터) !!!