Data_Analysis_Track_33/Python
Python_04-2(함수(First Class Citizen))
lsc99
2023. 8. 19. 14:53
일급시민(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)