파이썬(Python)

파이썬 - 함수 추가 내용(3)_일급 함수와 축약 함수(lambda)

BlueNoa 2023. 1. 11. 22:12
728x90
반응형

•일급 함수

임의의 함수를 다른 변수들처럼 동일하게 사용(다루는)할 수 있는 것을 의미한다.

일급함수로 정의되기 위해서는 조건이 있는데 함수 안에 함수(변수처럼)를 선언할 수 있어야 한다.

인자(argument)를 함수로 전달할 수 있어야 한다. 그리고 반환되는 값이 함수여야 한다.

 

※ 인자(argument)와 매개변수(parameter)의 차이점

인자와 매개변수는 서로 비슷하면서 엄밀히 따지면 다르다. 그 차이점을 만드는 것이 쓰임새다.

함수 정의에 직접적으로 사용되는 변수를 매개변수, 실제 함수에서 넘겨주는 어떤 값을 인자라고 할 수 있다.

간단한 예시를 통해 보면 다음과 같다.

def anything(num1, num2): # 매개변수(Parameter)
    print(num1+num2) # 결과창에서 확인하기 위한 출력
    return num1 + num2 # 실제 반환되는 것
anything(10, 12) # (Argument)
22

 

다시 일급함수에 관한 이야기를 하면 아래와 같다.

# 일반적인 함수에 다른 함수의 주소를 전달하는 방식
def first(a, b):
    return a**b # a의 b제곱

second = first # 주소 전달
print(first(5, 7))
print(second(5, 7))

# 함수 안에 함수를 선언 가능
print()
def third(func): # 편의상 func이라고 표현
    def fourth(): 
        print('Internal function') # 함수 안에 함수를 선언한 내부 함수
        
    fourth()
    return func # 매개변수

anything = third(first) # 반환값으로 함수를 사용
print(anything(5, 7)) # 인자값을 함수로 전달할 수 있다. 5, 7은 first에게 전달된다.
78125
78125

Internal function
78125

함수에 다른 함수를 선언(주소 전달)할 수 있다.

 

반응형

 

•축약 함수

축약 함수는 여러 줄을 사용하게되는 함수의 명령어를 한 줄로 요약해서 사용할 수 있는 방법이다.

파이썬에서는 lambda라는 함수로 구현할 수 있다.

주로 def를 사용할 정도로 복잡하지 않은 간단한 내용일 때 사용하거나 def(함수 선언)을 할 수 없는 상황에서 사용한다.

def Nsquare(x, y):
    return x ** y
print(Nsquare(2, 3))

# 위 계산식을 축약 함수로 표현
print((lambda x, y : x ** y)(2,3))

# 축약 함수를 변수로 사용할 수도 있다.
var_1 = lambda x, y : x * y
print(var_1(3, 4))
8
8
12

 

또 람다는 초기값(가변 인수)을 지정해서 사용할 수 있다.

# 람다도 매개변수에 초기치(값) 사용가능, 가변 인수 지정
anything = lambda a, b = 10 : a + b
print(anything(10))
print(anything(20,6))

# 람다도 가변 인수 지정
anything_1 = lambda a, *b, **c : print(a, b, c) # 해당 표현에 관한 내용은 게시글 '추가 내용(1)' 참고
anything_1(1, 2, 3, m = '강아지', n = '고양이')

2022.10.25 - [파이썬] - 파이썬 - 함수 추가 내용(1)

20
26
1 (2, 3) {'m': '강아지', 'n': '고양이'}

좀 더 길게 작성하면 다음과 같이 표현할 수 있다.

# 리스트에 복수의 람다를 넣고 사용 예제
# 일반적인 함수 작성
def anything_2(a, b):
    num1 = a + b; num2 = a * b
    li = [num1, num2]
    return li
print(anything_2(3,4)[0])
print(anything_2(3,4)[1])

# 복수의 람다로 구현했을 경우
li = [lambda a, b : a + b, lambda a, b : a * b]
print(li[0](3, 4))
print(li[1](3, 4))


print()
# filter(조건 함수, 묶음형 자료(= 순회 가능한 데이터)) - 내장함수와 함께 사용도 가능하다.
print(list(filter(lambda a:a < 5, range(1, 11))))
print(list(filter(lambda a:a % 2, range(1, 11)))) # 참인 것만 출력

# 1 ~ 30 사이의 정수 중에서 5의 배수이거나 7의 배수인 숫자들 출력
print(list(filter(lambda a:a % 6 or a % 10, range(1, 31))))

 

 

728x90
반응형