1. 일급 함수 (First-Class Function)
일급 함수 (First-Class Function)는 프로그래밍 언어가 함수 (또는 메서드)를 ‘일급 시민(값)'으로 취급하는 것을 의미합니다. 이는 함수를 다른 객체와 동일하게 취급하겠다는 것입니다.
1.1 함수를 변수에 할당할 수 있습니다.
Python에서 함수는 객체로써 존재하기 때문에, 함수를 변수에 할당할 수 있습니다. 이렇게 하면 해당 변수를 새로운 함수 이름처럼 사용할 수 있습니다.
def greet(name):
return f'Hello, {name}'
say_hello = greet
print(say_hello("World")) # 출력: Hello, World
위 코드에서 say_hello
변수는 greet
함수를 참조하며, 그 결과로 say_hello
는 함수로 사용됩니다.
우리가 정의한 함수 뿐만 아니라 built-in function도 위와 동일하게 변수에 할당할 수 있습니다.
licat = print
licat('hello world') # 출력: hello world
클래스의 메서드 또한 변수로서 관리될 수 있습니다.
class Cat:
def sound(self):
print('냐옹')
licat = Cat()
licat_sound = licat.sound
licat_sound() # 출력: 냐옹, licat.sound()
l = [10, 20, 30]
la = l.append
la(40) # l.append
l # 출력: [10, 20, 30, 40]
1.2 함수를 데이터 구조에 저장할 수 있습니다.
함수를 리스트, 세트, 딕셔너리 등의 데이터 구조에 저장할 수 있습니다. 이를 통해 함수를 데이터처럼 유연하게 관리하고 조작할 수 있습니다.
def add(x, y):
return x + y
def subtract(x, y):
return x - y
funcs = [add, subtract]
print(funcs[0](2, 3)) # 출력: 5
위 코드에서 funcs
리스트에는 add
함수와 subtract
함수가 저장되어 있습니다. 아래처럼 좀 더 다채롭게 활용이 가능합니다.
class Operator:
def add(self, x, y):
return x + y
def sub(self, x, y):
return x - y
def mul(self, x, y):
return x * y
def div(self, x, y):
return x / y
def _and(self, x, y):
pass
def _or(self, x, y):
pass
op = Operator()
logical_op = {
'add': op.add,
'sub': op.sub,
'mul': op.mul,
'div': op.div,
}
arithmetic_op = {
'_and': op._and,
'_or': op._or,
}
print(logical_op['add'](2, 3)) # 출력: 5
print(op.add(2, 3)) # 출력: 5
for _, f in logical_op.items():
print(f(2, 3)) # 4칙연산 모두 계산
1.3 함수를 인자로 다른 함수에 전달할 수 있습니다.
함수를 다른 함수의 매개변수로 전달할 수 있습니다. 이를 통해 코드의 유연성을 높일 수 있으며, 콜백 패턴 등 다양한 프로그래밍 패턴을 구현할 수 있습니다.
def say_hello(name):
return f'Hello, {name}'
def greet(func, name):
return func(name)
print(greet(say_hello, 'World')) # 출력: Hello, World
위 코드에서 greet
함수는 함수를 매개변수로 받아, 그 함수를 호출하고 있습니다.
아래 예제는 원에 넓이를 구하는 예제입니다. 반지름의 제곱을 별도의 함수로 만들었으며, 함수를 아규먼트로 전달하여 사용하고 있습니다.
def square(x):
return x ** 2
def width_circle(r, s):
return s(r) * 3.14
width_circle(10, square)
1.4 함수를 결과로서 반환할 수 있습니다.
함수 내부에서 새로운 함수를 정의하고 반환할 수 있습니다. 이를 통해 클로저(closures) 등의 고급 기능을 구현할 수 있습니다. 클로저는 함수 내 함수가 외부 변수를 참조하여 보존하는 것을 의미합니다. 여기서 adder
함수는 create_adder
함수의 지역 변수 x
를 참조하여 보존하므로 클로저입니다.
def create_adder(x):
def adder(y):
return x + y
return adder
add_5 = create_adder(5)
print(add_5(10)) # 출력: 15
위 코드에서 create_adder
함수는 adder
라는 내부 함수를 정의하고 반환하며, 반환된 adder
함수는 create_adder
함수의 매개변수를 기억하고 있습니다. 이러한 기능을 통해 더 유연하고 동적인 코드를 작성할 수 있습니다.
2. 고차 함수란? (Higher-order functions)
고차 함수는 하나 이상의 함수를 인자로 받아들이거나 함수를 결과로 반환하는 함수입니다. 파이썬에서 함수는 객체로 취급되므로, 함수를 변수에 할당하거나 데이터 구조에 저장할 수 있고, 다른 함수의 인자로 전달하거나 반환할 수 있습니다. 고차 함수는 코드의 재사용성을 높이고, 코드를 더 깔끔하고 유연하게 만드는 데 도움이 됩니다.
2.1 함수를 아규먼트로 전달하기
다른 함수를 매개변수로 받아, 그 함수의 동작을 활용하는 방식입니다. 이렇게 하면 코드의 재사용성이 향상되고, 함수의 동작을 동적으로 변경할 수 있습니다.
def apply_function(func, x):
return func(x)
def square(x):
return x * x
def cube(x):
return x * x * x
# 사용 예:
result = apply_function(square, 5)
print(result) # 출력: 25
result = apply_function(cube, 5)
print(result) # 출력: 125
2.2 함수를 반환값으로 사용하기
함수 내부에서 또 다른 함수를 정의하고, 이를 반환하여 동적으로 다양한 동작을 하는 함수를 생성할 수 있습니다.
def get_math_function(operation):
'''지정된 연산을 수행하는 함수를 반환합니다.'''
def add(x, y):
return x + y
def sub(x, y):
return x - y
def mul(x, y):
return x * y
if operation == 'add':
return add
elif operation == 'sub':
return sub
elif operation == 'mul':
return mul
# 사용 예:
# get_math_function 함수에 'add' 문자열을 전달하여 add 함수를 얻습니다.
add_func = get_math_function('add')
result = add_func(5, 3) # add 함수에 5와 3을 전달하여 결과를 얻습니다.
print(result) # 출력: 8
해당 예제에서 get_math_function
함수는 add
, sub
, mul
함수 중 하나를 반환합니다. 반환된 함수는 그 이후 독립적으로 사용할 수 있습니다. 이렇게 고차 함수를 사용하면 코드를 더 유연하게 작성할 수 있습니다.