본문 바로가기
Python

0701 1급 함수 first-classes function

by 대금부는개발자 2021. 7. 1.
SMALL

 

 

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

 

마치 두개의 값이 리턴이 되고 그 값을 각각 들고 가는 것 처럼 보이는데,

실제로 튜플( 괄호생략) 이에요.

결국은 튜플 하나를 리턴하기 때문에 리턴값은 하나에요 .

 

 

 

 

 

LIST

'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

댓글