함수에 대한 내용 중 일급객체에 대해 설명하려고 합니다.
일급 객체는 파이썬 뿐만 아니라 자바 스크립트에서도 사용되는 개념입니다.
1) 함수를 변수에 저장할 수 있으며
2) 함수를 함수 호출 시 인자값으로 사용할 수 있고
3) 함수를 함수의 리턴값으로 사용할 수 있다.
함수를
1) 호출 ( funtion() )로 사용할 수 있으며
2) 변수에 저장하여 (variable = function) 사용할 수도 있습니다. <= 1급 객체
"""
* 일급 객체 (first - class) ==> 자바스크립트, 파이썬
===> 주요한 핵심 개념 => 함수를 하나의 데이터로 보고 처리함.
특징
1) 함수를 변수에 저장할 수 있다.
2) 함수를 함수 호출 시 인자값으로 사용할 수 있다.
3) 함수를 함수의 리턴값으로 사용할 수 있다.
==================> 람다 함수에서 매우 중요한 개념으로 활용.
* 함수가 정의되면 분석단계(실행 전 단계인 파싱(parsing))에서 내부적으로 동작되는 작업
def fun1(): def 함수명/변수명():
print("fun1") print("fun1") ===> fun1 = 함수 데이터 (*****)
1) 함수명으로 된 변수 선언
fun1 = None
(함수 이름의 변수)
2) def 함수명()에 해당되는 객체를 생성 (임의의 메모리 번지에 함수개체(함수데이터)가 저장된다. (200번지))
3) 함수명 변수에 200 번지에 저장된 함수(=데이터)를 저장한다. (함수 = 일반 데이터형)
fun1 = 함수데이터 # 주소 번지만 들고 있음.
(return 값에 따라서 함수 데이터의 데이터 타입이 달라짐)
* fun1 활용 방법 2가지
1) 일반적인 함수 호출
fun1() # 함수의 기능을 실행(함수 호출) 할 수 있는 syntax
2) fun1 자체 변수로 활용이 가능하다. *** #1급 객체
m = fun1 # fun1은 함수 데이터의 주소를 갖고 있고 주소를 넘겨줌.
가. 일반변수에 함수 변수를 저장 : m = fun1
나. 함수호출시 인자값으로 함수전달 가능
"""
함수 객체는 함수의 주소값을 가진 데이터값입니다.
함수 객체는 변수에 저장하여 사용합니다. 변수에 저장되지 않고 사용하려면 기존의 방법대로 function() 함수를 호출하는 방식으로 사용해야합니다.
print("시작") # 시작
n = 10 #일반 변수
def fun1(): #함수 변수 ==> fun1 = 함수데이터
print("fun1 함수 실행")
# fun1 -> <class 'function'>, 함수데이터는 그냥 부르면 주소값만 알려줌 <function fun1 at 0x0000022474697790>
print(n, fun1, type(fun1)) # 10 <function fun1 at 0x0000022474697790> <class 'function'>
fun1() #일반 함수 호출법 => 함수 변수는 기능하기 위해서(사용하기 위해서), 함수처럼 사용해야함.
print("종료") # 종료
일반 변수에 함수 데이터를 저장 가능합니다.
print("시작") # 시작
def fun1(): # fun1 = 함수 데이터명, 함수의 주소값이 있음
print("fun1 함수 실행")
#1. 일반적인 함수 사용 (일반 함수 호출)
# fun1()
#2. 일급 객체로써 함수 사용
# 가. 일반 변수에 함수 데이터 저장 가능
m = fun1 # 변수 m으로도 fun1 함수를 호출할 수 있어짐
m() # fun1 함수 실행 #변수m으로 함수 호출하는 것처럼 사용 가능 -> fun1 함수 실행
print("종료") # 종료
콜백함수로 사용 = 트리거 = 사용자가 호출하지 않고 내부적으로 시스템이 특정 시점에 호출하는 함수
함수 호출시 인자값으로 함수를 전달하여 A 함수를 이용해 B함수를 호출하는 경우(함수).
콜백함수 (시스템이 특정시점에 호출하는 함수) ==> 임의의 함수 호출시 인자값으로 함수 전달 가능
"""
콜백함수 ?
1) 시스템이 특정시점에 호출하는 함수
2) 구현방법
- 사용자가 임의의 함수를 호출할 때(x) 인자값으로 콜백함수명을 전달한다.
"""
#나. 함수 호출시 인자값으로 함수전달 가능 ===> 콜백함수(callback) = 트리거(trigger)
# 콜백함수? 사용자가 호출하지 않고 내부적으로 시스템이 특정 시점에 호출하는 함수
def xxx(): #xxx = 함수데이터
print("xxx")
def zzz(): #zzz = 함수 데이터
print("zzz")
def yyy(n): #yyy = 함수데이터
n()
# 사용자는 yyy함수 호출 -> yyy함수가 xxx 함수 데이터를 Parameter로 받아서 xxx함수를 실행
yyy(xxx) # xxx # yyy(n) --> yyy(xxx) --> xxx() --> print("xxx")
yyy(zzz) # zzz # yyy(n) --> yyy(zzz) --> zzz() --> print("zzz")
def xxx(f):
print(("xxx"))
f()
xxx(fun1) # xxx #fun1 #함수를 인자값으로 사용
# 콜백함수 y와 z
def y(): # y = 함수 객체
print("Y함수 콜백")
def z(): # z = 함수 객체
print("Z함수 콜백")
# 시스템적으로 콜백함수를 호출하는 함수
def x(f): # x = 함수 객체
print("x함수 start")
f()
print("x함수 end")
x(y) # x함수 start # Y함수 콜백 # x함수 end
x(z) # x함수 xtart # Z함수 콜백 # x함수 end
함수 객체에 다른 값을 덮어씌우면 해당 함수는 소멸합니다.
고로, 덮어씌운 이후 해당 함수 객체를 함수로 불러오면 Error가 발생합니다.
def fun1(): # fun1 = 함수 객체
print("fun1")
fun1 = 10 # 함수 객체 fun1에 정수 int를 overwrite함
fun1() # 에러 발생 # fun1의 함수 데이터는 int값을 덮어씌우면서 사라져서 Error
대충 이해한 것 같은 느낌의 개념.
코드에 다 써놯으니.... 보고 이해했으면...... ( 하루 종일 붙잡고 있어서 그런가... 멀미남;;; ㅎㅎㅎ 죄송;; ㅎㅎㅎ;)
# 3. 임의의 함수 호출시 리턴값으로 함수를 사용 가능
#이거 이해 안 감. 이해해보자.
def kkk():
return fun1 # 함수의 반환(리턴)값 fun1
result = kkk() # result에 함수 이거 왜 함수로 줘야함? 함수 객체가 아니라?
result() # 생각에 함수 객체는 return값을 얻는게 아니라 함수 흐름만 가져오는 듯. (주소를 갖고 있는 변수. return값은 없는?)
print("="*50)
#뭔가 이해하는 중임 , 다시 살펴보셈
def fun1(): # fun1 = 함수 객체, 반환값 x
print("fun1") # fun1 함수 주소로 가면 이런 절차가 있음.
def aa(): # aa 함수 일급 객체는 return 값이 아니라 함수 흐름에 fun1() 호출이 있음
fun1()
abc = aa # abc는 aa 함수를 데이터로 갖음
abc() # fun1 # abc() -> fun1() -> print("fun1)
아.. 진짜 좀 어지러워서.. 몇 분이라도 쉬고 와야할 듯....
그럼 이만!
'SK 행복성장캠퍼스 > Python 기초' 카테고리의 다른 글
0904_5일차_함수_람다함수 (0) | 2020.09.07 |
---|---|
0903_4일차_연습문제 (0) | 2020.09.06 |
0903_4일차_함수_파라미터 (0) | 2020.09.06 |
0903_4일차_함수_사용자정의함수 (0) | 2020.09.06 |
0903_4일차_반복문_while문 (0) | 2020.09.06 |
댓글