본문 바로가기

Data_Analysis_Track_33/Python

Python_04-2(함수(First Class Citizen))

일급시민(First Class Citizen)이란?

- 변수에 대입할 수 있다.

- argument로 사용할 수 있다.

- 함수나 메소드의 반환값으로 사용할 수 있다.

일급 : 모든 권리를 다 가진다는 의미
시민 : 프로그래밍 언어를 구성하는 객체를 의미
즉 파이썬에서 함수는 일반 값(객체) 로 취급된다.

 

# 정수의 경우
a = 10 # 1. 변수에 대입할 수 있다.

def func(num):
    print(num)
    return 10 # 3. return 값으로 사용할 수 있다.
    
func(10) # 2. Argument로 사용할 수 있다.

# 정수는 일급시민객체 다.
# 함수의 경우, 함수 정의
def test_fn():
    print('a')
    
b = test_fn # 1. 함수를 변수에 대입
def func2(fn): # 또 다른 함수 정의 test_fn함수를 func2함수의 parameter로 받음
    print('abc',fn) # 3. 함수를 return 값으로 사용
    
v = func2(test_fn) # 2. test_fn함수를 argument로 사용
v
# 함수도 일급시민객체 다.

함수를 변수에 대입

def hello():
    print("Hello World")
    # return 값 -> None
    
v = hello() # hello함수를 호출해서 실행시킴. 그 반환값을 v에 대입
print(v)
my_hello = hello # hello함수를 my_hello란 변수에 할당
print(my_hello)
my_hello()
your_hello = hello
your_hello() # 여러개의 변수에 함수 할당 가능
test_hello = my_hello
test_hello() # 제 3의 변수에 함수가 할당된 변수를 다시 할당해도 작동한다

함수를 argument로 전달

구문 : 처리할 값을 가진 함수(어떻게 처리하는지를 나타내는 함수)

어떻게 처리하는지를 나타내는 함수가 처리할 값을 가진 함수에게 argument로 전달되어 처리된다.

# 처리할 값을 가진 함수
# 함수를 argument로 전달
def calc(func):
    # 처리할 값을 calc함수가 가지고 있다. -> 어떤 처리를 할지는 모름
    # 처리하는 함수를 호출하는 곳에서 받겠다.
    num1 = 10
    num2 = 20
    result = func(num1, num2) # parameter로 받은 함수를 호출
    print(result)
    # 계산
# 어떻게 처리하는지를 나타내는 함수
def plus(num1, num2):
    # 어떻게 처리할지는 plus함수가 가지고 있다. -> 무슨값을 처리할지는 모른다.
    # 파라미터로 호출하는 곳에서 처리할 값(피연산자)를 받겠다.
    result = num1 + num2
    return result

def minus(v1, v2):
    return v1 - v2
# calc 호출
calc(minus) # func(num1, num2) -> plus(num1, num2)
# plus 호출
v = plus(10, 20)
print(v)

함수나 메소드의 반환값으로 사용할 수 있다.

l = [1, 2, 3, 4, 5, 6, 7, 8, 10, 9, 7, 4] # 리스트 생성
# 값을 하나 받아서 조건을 체크한 결과를 bool 값으로 반환.
def check_fn(element):
    return element % 2 == 0 # 원소중 2의 배수를 return
# filter() 내장함수
# filter(함수, lterable(자료구조)) -> lterable의 원소들 중에서 특정 조건을 만족하는(True) 값들을 제공
# 함수 : 조건을 check하는 함수

list(filter(check_fn, l)) # 리스트 l의 원소중 check_fn함수에서 특정 조건을 만족하는 값들만 조회
def my_filter(func, lst):
    result = [] # 결과값이 들어갈 빈 리스트 result 생성
    for i in lst:
        if func(i): # True가 return되는 값(element % 2 == 0)만 append하겠다.
            result.append(i)
    return result
    
my_filter(check_fn, l)