WeniVooks

검색

견고한 파이썬

일급함수와 고차함수

1. 일급 함수

일급 함수(First-Class Function)는 프로그래밍 언어가 함수 (또는 메서드)를 ‘일급 시민(값)'으로 취급하는 것을 의미합니다. 이는 함수를 다른 객체와 동일하게 취급하겠다는 것입니다.

1.1 함수를 변수에 할당

파이썬에서 함수는 객체로써 존재하기 때문에, 함수를 변수에 할당할 수 있습니다. 이렇게 하면 해당 변수를 새로운 함수 이름처럼 사용할 수 있습니다.

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 함수 중 하나를 반환합니다. 반환된 함수는 그 이후 독립적으로 사용할 수 있습니다. 이렇게 고차 함수를 사용하면 코드를 더 유연하게 작성할 수 있습니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
13.1 메서드 체이닝13.3 여러개의 값 반환