1급 함수 first-classes function
→ 프로그래밍 개치(함수, 객체, 변수, 등등)들이 다음의 조건을 충족하면 기본적으로 first - class citizen이라고 합니다.
1. 변수에 저장될 수 있어요!
2. 함수의 인자로 전달될 수 있어야 해요!
3. 함수의 결과로 리턴될 수 있어야 해요!
일반적으로 객체(instance)는 3가지를 다 충족합니다. ex) 숫자
- 우리가 지금까지 설명한 class로 부터 파생된 instance는 1급 객체라고 불려요!
- function 도 firstclass 조건을 만족. →python의 함수는 1급 함수예요!
1급 함수 first-classes function (파이썬 Java 특징)
##1. 변수에 저장될 수 있어요!##
def my_add(x,y):
return x + y
print(my_add(10,20))
f = my_add
print(f(100,200))
30
300
##2. 함수의 인자로 전달될 수 있어야 해요!##
def my_add(x,y):
return x + y
def my_mul(x,y):
return x * y
def my_operation(func, x, y):
result = func(x,y)
return result
print(my_operation(my_add,10,20))
30
##3. 함수의 결과로 리턴될 수 있어야 해요!##
def addMaker(x): # x는 지역변수(Local variable)
def my_add__maker(y):
return x + y
return my_add__maker
add_5 = addMaker(5)
add_10 = addMaker(10)
print(add_5(1)) # 6 이상한거예요!!
print(add_10(5)) # 15 이상한거예요!!
# closure 현상(1급함수의 특징)→함수가 끝났음에도 메모리값이 지속적으로 남아있어요.
#(closure 가 제공되기 때문이에요) - 함수가 다른함수를 리턴할때,
#외부에서 선언된 지역변수가 내부에서 리턴하는 함수안에서 사용 될 때
######
a = 100
print(a) # 100
# a라는 변수가 가지고 있는 주솟값을 찍고 싶어요!
print(id(a)) 어디를 레퍼런스(메모리 주소를 가리키는 것) 하고 있나?
#140728155976592(100이라는 정숫값이 저장된 메모리 주솟값)
* 자바나 파이썬은 메모리 주소를 건드릴 수 없어요(비즈니스 로직을 하기 때문에 메모리 주소를 액세스할 필요가 없어요) . 하드웨어를 세밀하게 하는 프로그램은 c에 요.
a = [1, 2, 3]
print(id(a)) #1665053075648
b = [1, 2, 3]
print(id(b)) #1665052963584
print( a ==b) #True (주체를 두 개지만 두 개 내용이 같니?)
print( a is b) # False (같은 메모리 주소를 가지고 있니?)
a = 50
b = 50
print( a is b) #True (숫자는 워낙 많이 사용돼서 256까지는 객체(instance)를 1개만 만들어서 공유해요)
a = 257
b = 257
print (a is b) #False
//
1급 함수
def my_sum(a,b):
print("안녕하세요")
result = a + b
return result
def my_test(hoho):
hoho(10,20)
my_test(my_sum)
안녕하세요
# <function my_sum at 0x00000183ACF129D0> my_sum이 함수고 메모리 주소 여기에 있어라는 값을 표현
my_sum(10,20) #안녕하세요
//
def my_sum(a,b):
print("안녕하세요")
result = a + b
return result
def my_test(hoho):
hoho(10,20)
my_test(my_sum)
30
안녕하세요
하나의 함수를 호출할때 다른함수를 인자로 넘겨줄수 있어요.
python 의 함수는 return값을 여러개 사용 할 수 있어요 는 사실 잘못 된 말
함수의 결과 값은 하나에요 여러개를 리턴하는 것 처럼 보입니다
def my_program(a,b):
result1 = a + b
result2 = a * b
return result1, result2
a,b = my_program(10,20)
def my_sum(a,b,c=True):
if c:
print(a+b)
else:
print(a*b)
my_sum(10,20)
30
마치 두개의 값이 리턴이 되고 그 값을 각각 들고 가는 것 처럼 보이는데,
실제로 튜플( 괄호생략) 이에요.
결국은 튜플 하나를 리턴하기 때문에 리턴값은 하나에요 .
'Python' 카테고리의 다른 글
0701 mutable(가변의), immutable(불변의) (0) | 2021.07.01 |
---|---|
0701 Local variable vs global variable (0) | 2021.07.01 |
0701 python의 함수적 특징 (0) | 2021.07.01 |
0701 함수(function) (0) | 2021.07.01 |
0701 while (0) | 2021.07.01 |
댓글