Python/파이썬 심화

일급 함수의 특징 (2)

monstro 2025. 8. 15. 02:09
728x90
반응형

- 개요

파이썬에서 값으로 취급할 수 있는 일급 함수가 갖는 특징은 다음과 같이 정리할 수 있다

  • 1) 런타임 시점에서 초기화
  • 2) 변수에 할당 가능
  • 3) 일급 함수를 다른 함수의 인수로 전달 가능
  • 4) 일급 함수를 다른 함수의 반환값으로 사용 가능

위의 특징에서 3)과 4)의 특징에 대해서 알아본다

 

1) 함수를 다른 함수의 인수로 전달

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)

# 함수 객체
func = factorial

# 리스트 컴프리헨션에 대한 인자로 사용
print([func(i) for i in range(1, 6) if i % 2])
print(list(map(func, filter(lambda x : x % 2, range(1, 6)))))

 

위와 같이 함수를 생성하고 해당 함수를 저장하는 함수 객체를 생성하였다

생성한 함수 객체를 2개의 리스트 컴프리헨션에 인자로 전달하였다

 

 

실행 결과는 위와 같다

1부터 5까지의 수중에서 홀수인 수에 대해서만 팩토리얼을 수행한다

 

2) 함수를 다른 함수의 인수로 전달 - reduce 함수

from functools import reduce
from operator import add

# reduce 함수 - 함수를 인수로 넘겨줌
print(reduce(add, range(1, 11)))

# reduce 함수 - 람다를 인수로 넘겨줌
print(reduce(lambda x, y : x + y, range(1, 11)))

 

functools 모듈에서 제공하는 reduce 함수인자로 넘겨준 시퀀스에 저장된 요소들

인자로 넘겨준 함수를 사용하여 누적하여 결합함으로써 하나의 값으로 줄이는 목적으로 사용한다

스크립트에서는 함수를 넘겨주는 방식과 람다를 넘겨주는 방식의 2가지 방식으로 구성하였다

 

 

실행 결과는 위와 같다

두 개의 방식 모두 1부터 10까지의 값을 더하므로 55가 출력되었다

 

3) 함수를 다른 함수의 인수로 전달 - callable 함수

print(callable(str), callable(add), callable(func), callable('Hello'))

 

callable 함수는 호출 연산자 인자로 받은 대상메서드 형태 호출이 가능한지 판단한다

 

 

실행한 결과는 위와 같다

문자열 Hello 함수로 호출할 수 없으므로 False가 반환되었다

 

4) 함수를 다른 함수의 인수로 전달 - partial 함수

from operator import mul
from functools import partial

# 항상 5를 곱하는 함수 객체 생성
five = partial(mul, 5)
print(five(5))
print(five(10))

# 생성한 함수 객체를 사용하여 함수 객체 생성
six = partial(five, 6)
print(six())

 

functools 모듈에서 제공하는 partial 함수이미 정의된 함수 인수를 고정하기 위해 사용한다

스크립트에서는 곱셈 연산을 수행하는 mul 함수인자를 고정하기 위해 사용하였다

  • 첫 번째 함수 객체 five : mul 함수를 수행하되, 항상 5를 곱한 결과를 반환
  • 두 번째 함수 객체 six : five 함수 객체를 수행하되, 항상 6을 곱한 결과를 반환

 

 

실행한 결과는 위와 같다

six 함수 객체의 경우 기본적으로 five 함수 객체에 6을 곱한 결과를 반환하므로 30의 기본값을 반환한다

 

5) 함수를 다른 함수의 반환값으로 사용 - closure

def outer(x):
    i = 0
    def inner(y):
        nonlocal i
        i += 1
        print(f"No.{i} value of d : {x + y}")
    return inner

in_test = outer(5)
in_test(5)
in_test(10)
in_test(15)

 

closureOuter 함수안Inner 함수를 정의하고 해당 Inner 함수를 반환하는 함수를 의미한다

복잡한 구조의 closure를 사용하는 이유는 다음과 같다

  • 데이터를 캡슐화하여 정보의 은닉성을 높일 수 있음
  • closure 함수의 상태값을 유지할 수 있음
  • 상태값을 유지하므로 높은 재사용성을 지님

 

 

스크립트를 실행한 결과는 위와 같다

in_test 함수 객체는 closure에 5를 넘겨 생성하였으므로 5의 값을 가진채로 생성한다

이후 in_test에 인수를 넘겨주면 생성될 때의 값을 기억하게 되어 위와 같은 결과가 출력된다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

클로저 (2)  (0) 2025.08.21
클로저 (1)  (0) 2025.08.18
일급 함수의 특징 (1)  (0) 2025.08.12
파이썬 시퀀스 (7)  (0) 2025.08.12
파이썬 시퀀스 (6)  (0) 2025.08.12