반응형

람다함수

람다 함수는 단일 표현식이 있는 함수를 원할 때 특히 유용합니다. 람다 함수는 여러 매개변수를 허용하고 일부 값을 반환할 수 있는 한 줄짜리 익명 함수(이름이 없는 함수)입니다. 람다 함수를 정의하려면 키워드 람다를 작성하고 그 뒤에 매개변수의 수, 콜론 및 표현식을 작성해야 합니다.

 

lambda 매개변수1, 매개변수2, … : 매개변수를 사용한 표현식

 

람다 함수는 변수 안에 저장할 수 있습니다. 람다 함수를 호출하려면 변수 이름 뒤에 괄호를 써야 합니다. 람다 함수 매개변수에 대한 인수는 괄호 안에 전달할 수 있습니다. 다음 스크립트는 하나의 매개변수 x가 있는 람다 함수를 정의합니다. 이 함수는 x의 제곱을 반환합니다. 람다 함수는 변수 square에 저장됩니다.

 

square = lambda : x * x

 

람다 함수를 호출하려면 변수 이름, 즉 제곱을 작성하고 그 다음에 제곱을 취하려는 값을 작성해야 합니다. 다음 스크립트는 정수 2의 제곱을 인쇄합니다.

print(square(2))

 

Output:

4

 

다음 스크립트는 일반 함수로 매개변수 3개를 입력 받아서 모두 더한 결과값을 리턴하는 함수입니다.

def add_num(abc):

  result = a + b + c

  return result

 

다음 스크립트는 이전 스크립트의 add_num 함수를 람다 함수로 간단하게 표현해 보았습니다.

result = lambda a, b, c : a + b + c

 

람다 함수는 표현식을 튜플로 정의하면 튜플의 결과가 하나의 반환값으로 출력됩니다. 다음 스크립트는 두 매개변수 값을 입력받아 튜플로 리턴하는 람다 함수입니다.

result = lambda x, y : (x*2, y*3)

print(result(3, 1))

 

Output:

(6, 3)

 

재귀함수

재귀 함수는 자신을 호출하는 함수입니다. 재귀 함수는 동일한 작업을 순서대로 반복적으로 수행해야 하는 경우에 유용합니다.

다음 스크립트는 num번 자신을 호출하는 재귀 함수를 만듭니다. 여기서 num은 함수에 전달된 매개변수입니다. 함수 내에서 먼저 num의 값이 0인지 확인합니다. 값이 0이면 함수가 반환됩니다. 그렇지 않으면 함수는 num보다 하나 작은 값으로 자신을 호출합니다. 다음으로, 함수가 호출된 횟수를 알려주는 명령문이 출력됩니다. 예제에서는 함수 호출에서 값 7이 함수에 전달되고 자기 자신의 함수를 재귀적으로 7번 호출합니다.

 

def recur_func(num):

  if num == 0:

    return

  else:

    recur_func(num - 1)

    print("The function is called recursively for", str(num), "times")

 

recur_func(7)

 

Output:

The function is called recursively for 1 times

The function is called recursively for 2 times

The function is called recursively for 3 times

The function is called recursively for 4 times

The function is called recursively for 5 times

The function is called recursively for 6 times

The function is called recursively for 7 times

 

재귀 함수는 많은 용도가 있습니다. 예를 들어, 숫자의 계승(팩토리얼)을 계산하는데 유용합니다. 숫자 N의 계승은 단순히 1에서 N까지의 모든 숫자의 곱입니다. 다음 스크립트는 매개변수로 전달된 숫자의 계승을 반환하는 take_fact()라는 함수를 정의합니다.

def take_fact(num):

  if num == 1:

    return 1

  else:

    fact = num * take_fact(num - 1)

    return fact

 

take_fact(8)

 

Output:

40320

 

함수 리턴

함수는 일반 변수처럼 지역 함수 변수를 반환할 수 있습니다. 예를 들어 다음 스크립트에서 외부 global_func() return 키워드를 사용하여 local_func()를 반환합니다.

def global_func():

  print("This is a global function")

 

  def local_func():

    print("This is a local function")

 

  return local_func

 

global_func()my_func변수에 저장하면 먼저, global_func()이 수행되면서 “This is a global function”이 출력됩니다. 그 다음 local_func()을 반환해서 my_func에 저장합니다.

 

my_func = global_func()

 

my_func변수에 저장된 값은 local_func()이므로 my_func을 호출하면 “This is a local function”이 출력됩니다.

 

my_func()

 

데코레이터 함수(Decorator Functions)

데코레이터 기능을 정의하려면 수정하려는 함수가 이 데코레이터 함수에 전달됩니다. 데코레이터 함수 내에서 래퍼 함수 또는 확장 함수라는 로컬 함수를 정의합니다. 데코레이터 함수를 사용하여 오리지널 함수를 확장하면 오리지널 함수를 호출할 때마다 래퍼 또는 확장된 함수 내부 구문이 실행됩니다.

다음 스크립트에서 데코레이터 함수의 이름은 decorator_function()입니다. 수정될 오리지널 함수는 매개변수 original_function()으로 데코레이터 함수에 전달됩니다. original_function() decorator_function()으로 데코레이션하면 실행될 래퍼 또는 확장 함수는 extended_function()으로 정의됩니다. 다음 스크립트에서 extended_function() original_function()의 코드 전후에 명령문을 출력하여 original_function()의 기능을 확장합니다. extended_function() decorator_function() 내부에서 호출됩니다.

 

def decorator_function(original_function):

  def extended_function():

    print("This line executes before the original function")

    original_function()

    print("This line executes after the original function")

 

  return extended_function

 

다음 스크립트는 decorator_function()의 매개변수로 입력할 함수정의입니다.

def my_original_function():

  print("This is the original function that is extended by the extended function")

 

extended_function 변수에 decorator_function(my_original_function)을 저장한 후 extended_function()을 호출하면 다음과 같은 결과를 얻을 수 있습니다.

 

extended_function = decorator_function(my_original_function)

extended_function()

 

Output:

This line executes before the original function

This is the original function that is extended by the extended function

This line executes after the original function

 

이전 스크립트와 같이 원래 함수를 데코레이터 함수의 매개변수로 전달하는 대신 수정하려는 원래 함수를 정의하기 전에 @ 연산자 뒤에 데코레이터 함수 이름을 사용하면 표현할 수 있습니다. 다음 스크립트는 이전 스크립트에서 정의한 decorator_function()을 사용하여 my_original_function2()를 확장하였습니다.

 

@decorator_function

def my_original_function2():

  print("This function is extended using @ symbol with decorator")

 

my_original_function2()

 

Output:

This line executes before the original function

This function is extended using @ symbol with decorator

.This line executes after the original function

반응형

+ Recent posts