본문 바로가기
초보자를 위한 Python/5. Python 함수

5.3 파이썬 람다(Lambda) 함수 및 예제

by 엔터티 2022. 9. 30.
반응형

파이썬에서 람다(Lambda)함수란 무엇일까요?

파이썬 프로그래밍에 있어서 Lambda 팜수는 익명함수 또는 이름이 없는 한 줄 이하의 작고 제한된 기능의 함수를 말합니다. 일반 함수와 마찬가지로 람다 함수는 하나의 표현식으로 여러 인수를 가질 수 있습니다.

파이썬에서 람다 식(또는 람다 형식)은 익명함수를 구성하는데 사용됩니다. 그렇게 하려면 (정상 함수를 정의하기 위해 def를 사용하는 것처럼) 람다 키워드를 사용 합니다. 파이썬에서 정의하는 모든 익명 함수에는 3가지의 필수 부분이 있습니다.

① 람다키워드 ②매개변수(또는 바운드 변수) 및 ③ 함수 본체

람다 함수는 매개변수의 수에 제한이 없지만 함수 본문에는 하나의 표현식만 포함 될 수 있습니다. 또한 람다는 한줄의 코드로 작성되며 즉시 호출할 수도 있습니다. 아래의 예제에서 이 모든것이 실제로 작동하는것을 공부합니다.

목차

    구문 및 예

    람다함수를 작성하는 공식 구문은 다음과 같습니다.

    lambda p1, p2: expression

    여기서 p1과 p2는 람다 함수에 전달되는 매개변수입니다. 필요한 만큼 매개변수를 추가할 수 있습니다.

    그러나 일반 함수에서와 같이 매개변수 주위에 대괄호를 사용하지 않는다는 점에 유의하십시오. 마지막 부분(표현식)은 함수에 제공한 매개변수에 대해 작동하는 유효한 파이썬 표현식입니다.

    예시 1

    이제 람다에 대해 알았으므로 예제를 통해 시도해 보겠습니다. 따라서 IDLE을 열고 다음을 입력해 보세요

    adder = lambda x, y: x + y
    print (adder (1, 2))

    결과

    3

    코드설명

    여기에서 우리는 람다 함수에 의해 반환된 결과를 담을 변수를 정의합니다.

    1. 익명 함수를 정의하는 데 사용되는 람다 키워드.
    2. x와 y는 람다 함수에 전달하는 매개변수입니다.
    3. 이것은 우리가 전달한 2개의 매개변수를 추가하는 함수의 본문입니다. 단일 표현식이라는 점에 유의하십시오. 람다 함수의 본문에 여러 문을 작성할 수 없습니다.
    4. 함수를 호출하고 반환된 값을 출력합니다.

    예시 2

    람다의 기본과 문법을 이해하기 위한 기본적인 예였습니다. 이제 람다를 출력하고 결과를 확인해보세요. 다시 IDLE을 열고 다음을 입력해 보세요.

    #What a lambda returns
    string='some kind of a useless lambda'
    print(lambda string : print(string))

    이제 파일을 저장하고 프로그램을 실행합니다. 이것은 결과로 얻어야 할 출력입니다.

    결과

    <function <lambda> at 0x00000185C3BF81E0>

    무슨... 이상한 결과가 나왔습니다. 더 이해하기 위해서 코드를 살펴보겠습니다.

    코드설명

    1. 여기에서 람다에 매개변수로 전달할 문자열을 정의합니다.
    2. print 문을 호출하고 결과를 출력하는 람다를 선언합니다.

    하지만 왜 프로그램은 우리가 전달한 문자열을 출력하지 않습니까? 람다 자체가 함수 개체를 반환하기 때문입니다. 이 예에서 람다는 print() 함수에 의해 호출 되지 않고 단순히 함수 개체와 그것이 저장된 메모리 위치 를 반환 합니다. 콘솔에 출력되는 내용입니다.

    예시3

    이번에는 다음과 같이 작성해 보세요

    #What a lambda returns #2
    x="some kind of a useless lambda"
    (lambda x : print(x))(x)

    프로그램을 실행해 보세요.

    결과

    some kind of a useless lambda

    이제 람다가 호출되고 전달한 문자열이 콘솔에 출력됩니다. 그러나 그 이상한 구문은 무엇이며 람다 정의가 대괄호로 묶인 이유는 무엇입니까? 이제 이해합시다.

    코드설명

    1. 다음은 이전 예제에서 정의한 것과 동일한 문자열입니다.
    2. 이 부분에서는 람다를 정의하고 문자열을 인수로 전달하여 즉시 호출합니다. 이것은 IIFE라고 하며 이 튜토리얼의 다음 섹션에서 이에 대해 자세히 알아볼 것입니다.

    예시4

    람다와 일반 함수가 어떻게 실행되는지 이해하기 위해 마지막 예시를 살펴보겠습니다. 따라서 IDLE을 열고 새 파일에 다음을 입력하십시오.

    #A REGULAR FUNCTION
    def entity( funct, *args ):
    funct( *args )
    def printer_one( arg ):
    return print (arg)
    def printer_two( arg ):
    print(arg)
    
    #CALL A REGULAR FUNCTION 
    entity( printer_one, 'printer 1 REGULAR CALL' )
    entity( printer_two, 'printer 2 REGULAR CALL \n' )
    
    #CALL A REGULAR FUNCTION THRU A LAMBDA
    guru(lambda: printer_one('printer 1 LAMBDA CALL'))
    guru(lambda: printer_two('printer 2 LAMBDA CALL'))

    이제 파일을 저장하고 프로그램을 실행합니다. 실수가 없다면 출력은 다음과 같아야 합니다.

    결과

    printer 1 REGULAR CALL
    printer 2 REGULAR CALL
    printer 1 LAMBDA CALL
    printer 2 LAMBDA CALL

    코드설명

    1. 다른 함수를 첫 번째 매개변수로 취하고 그 뒤에 오는 다른 인수를 취하는 entity라는 함수입니다.
    2. printer_one은 전달된 매개변수를 인쇄하고 반환하는 간단한 함수입니다.
    3. printer_two는 printer_one과 유사하지만 return 문이 없습니다.
    4. 이 부분에서는 entity 함수를 호출하고 프린터 함수와 문자열을 매개변수로 전달합니다.
    5. 이것은 네 번째 단계(즉, entity 함수 호출)를 달성하지만 람다를 사용하는 구문입니다.

    다음 섹션에서는 Python에서 map(), reduce()  filter() 와 함께 람다 함수를 사용하는 방법을 배웁니다.

     


    파이썬 내장함수와 함께 람다 사용

    Lambda 함수는 Python의 기본 제공 메서드를 사용하여 작업을 수행하는 우아하고 강력한 방법을 제공합니다. 람다가 즉시 호출되어 이러한 함수에 대한 인수로 전달될 수 있기 때문에 가능합니다.

    Python Lambda의 IIFE

    IIFE 는 즉시 호출된 함수 실행을 나타냅니다. 이는 람다 함수가 정의되는 즉시 호출할 수 있음을 의미합니다. 예를 들어 이것을 이해합시다. IDLE을 실행하고 다음을 입력하십시오.

     (lambda x: x + x)(2)

    출력 및 코드 설명

    즉시 호출되는 이 람다 기능을 사용하면 map() 및 reduce()와 같은 함수 내에서 람다를 사용할 수 있습니다. 이 기능을 다시 사용하고 싶지 않을 수 있으므로 유용합니다.

     

    filter()의 람다

    필터 기능은 요소 시퀀스에서 특정 요소를 선택하는 데 사용됩니다. 시퀀스는 목록, 세트, ​​튜플 등과 같은 모든 반복자가 될 수 있습니다.


    선택될 요소는 미리 정의된 제약 조건을 기반으로 합니다. 2개의 매개변수가 필요합니다.

    • 필터링 제약 조건을 정의하는 함수
    • 시퀀스(목록, 튜플 등과 같은 모든 반복자)

    예시

    sequences = [10,2,8,7,5,4,3,11,0, 1]
    filtered_result = filter (lambda x: x > 4, sequences) 
    print(list(filtered_result))

    결과

    [10, 8, 7, 5, 11]

    코드설명

    1. 첫 번째 문장에서, 우리는 몇몇 숫자를 포함하는 sequence라고 불리는 목록을 정의합니다.
    2. 여기에서 filter() 함수에 의해 반환된 필터링된 값을 저장할 filter_result라는 변수를 선언합니다.
    3. 목록의 각 요소에서 실행되고 4보다 크면 true를 반환하는 람다 함수.
    4. 필터 함수에서 반환된 결과를 인쇄합니다.

    map()의 람다

    map 함수는 시퀀스의 모든 요소에 특정 작업을 적용하는 데 사용됩니다. filter()와 마찬가지로 2개의 매개변수도 사용합니다.

    • 요소에 대해 수행할 연산을 정의하는 함수
    • 하나 이상의 시퀀스

    예를 들어, 다음은 주어진 목록에서 숫자의 제곱을 인쇄하는 프로그램입니다.

    예시

    sequences = [10,2,8,7,5,4,3,11,0, 1]
    filtered_result = map (lambda x: x*x, sequences) 
    print(list(filtered_result))

    결과

    [100, 4, 64, 49, 25, 16, 9, 121, 0, 1]

    코드설명

    1. 여기에서 몇 개의 숫자를 포함하는 시퀀스라는 목록을 정의합니다.
    2. 매핑된 값을 저장할 filter_result라는 변수를 선언합니다.
    3. 목록의 각 요소에서 실행되고 해당 숫자의 제곱을 반환하는 람다 함수입니다.
    4. map 함수에서 반환된 결과를 인쇄합니다.

    reduce()의 람다

    map()과 같은 reduce 함수는 시퀀스의 모든 요소에 작업을 적용하는 데 사용됩니다. 그러나 작동하는 면에서 지도와 다릅니다. 다음은 출력을 계산하기 위해 reduce() 함수가 뒤따르는 단계입니다.

     

    1단계) 시퀀스의 처음 2개 요소에 대해 정의된 작업을 수행합니다.
    2단계) 이 결과 저장
    3단계) ​​저장된 결과와 시퀀스의 다음 요소로 연산을 수행합니다.
    4단계) 더 이상 요소가 남지 ​​않을 때까지 반복합니다.

    또한 두 개의 매개변수를 사용합니다.

    1. 수행할 작업을 정의하는 함수
    2. 시퀀스(목록, 튜플 등과 같은 모든 반복자)

    예를 들어, 다음은 목록에 있는 모든 요소의 곱을 반환하는 프로그램입니다.

    예시

    from functools import reduce
    sequences = [1,2,3,4,5]
    product = reduce (lambda x, y: x*y, sequences)
    print(product)

    결과

    120

    코드설명

    1. functools 모듈에서 리듀스 가져오기
    2. 여기에서 몇 개의 숫자를 포함하는 시퀀스라는 목록을 정의합니다.
    3. 감소된 값을 저장할 product라는 변수를 선언합니다.
    4. 목록의 각 요소에서 실행되는 람다 함수입니다. 이전 결과에 따라 해당 번호의 제품을 반환합니다.
    5. reduce 함수에서 반환된 결과를 인쇄합니다.

    어떤 경우에 람다를 사용해야 할까?

    다음 섹션에서 볼 수 있듯이 람다는 인터프리터 수준에서 일반 함수와 동일하게 취급됩니다. 어떤 면에서 람다는 단일 표현식을 반환하는 함수를 작성하기 위한 간결한 구문을 제공한다고 말할 수 있습니다.

    그러나 언제 람다를 사용하는 것이 좋은지, 언제 피해야 하는지 알아야 합니다. 이 섹션에서는 람다를 작성할 때 파이썬 개발자가 사용하는 몇 가지 디자인 원칙을 배웁니다.

    람다의 가장 일반적인 사용 사례 중 하나는 Python이 함수형 프로그래밍으로 알려진 프로그래밍 패러다임(또는 스타일)을 지원하기 때문에 함수형 프로그래밍에 있습니다.

    이를 통해 다른 함수(예: 맵, 필터 등)에 대한 매개변수로 함수를 제공할 수 있습니다. 이러한 경우 람다를 사용하면 일회성 함수를 만들고 매개변수로 전달하는 우아한 방법을 제공합니다.

     

    람다를 사용하면 안되는 경우

    프로덕션 환경에서 복잡한 람다 함수를 작성해서는 안 됩니다. 코드를 유지 관리하는 코더가 암호를 해독하는 것은 매우 어려울 것입니다. 복잡한 한 줄짜리 표현식을 만들고 있다면 적절한 함수를 정의하는 것이 훨씬 더 나은 방법이 될 것입니다. 

    모범 사례로, 단순한 코드가 복잡한 코드보다 항상 낫다는 것을 기억해야 합니다.

    람다 vs 일반 함수

    이전에 언급했듯이 람다는 바인딩된 식별자가 없는 함수일 뿐입니다. 간단히 말해서 이름이 없는 함수입니다 (따라서 익명). 다음은 파이썬에서 람다와 일반 함수의 차이점을 보여주는 표입니다.

    일반함수

    람다 구문

    lambda x : x + x

    일반함수 구문

    def (x) :
    return x + x

    Lambda 함수는 본문에 하나의 표현식만 가질 수 있습니다.

    일반 함수는 본문에 여러 표현식과 명령문을 가질 수 있습니다.

    Lambda에는 연결된 이름이 없습니다. 그래서 익명 함수라고도 합니다.

    일반 함수에는 이름과 서명이 있어야 합니다.

    본문이 자동으로 반환되기 때문에 람다에는 return 문이 포함되어 있지 않습니다.

    값을 반환해야 하는 함수에는 return 문을 포함해야 합니다.

    차이점에 대한 설명

    람다와 일반 함수의 주요 차이점은 람다 함수가 단일 표현식만 평가하고 함수 개체를 생성한다는 것입니다. 결과적으로 람다 함수의 결과 이름을 지정하고 이전 예에서와 같이 프로그램에서 사용할 수 있습니다.

     

    위의 예에 대한 일반 함수는 다음과 같습니다.

    def adder (x, y):
    return x + y 
    print (adder (1, 2))

    여기에서 호출 할 때 결과 를 반환 하는 함수 의 이름 을 정의해야 합니다. 람다 함수에는 기본적으로 항상 반환되는 단일 표현식만 있기 때문에 반환 문이 포함되지 않습니다. 즉시 호출할 수 있으므로 람다를 할당할 필요도 없습니다(다음 섹션 참조). 다음 예제에서 볼 수 있듯이 람다는 Python의 내장 함수와 함께 사용할 때 특히 강력해집니다.

     

    그러나 람다가 단일 표현식(위와 같이)을 반환하는 함수와 어떻게 다른지 여전히 궁금할 수 있습니다. 통역사 수준에서는 큰 차이가 없습니다. 놀랍게 들릴 수도 있지만 Python에서 정의하는 모든 람다 함수는 인터프리터에서 일반 함수로 처리됩니다.

     

    다이어그램에서 볼 수 있듯이 두 정의는 바이트 코드로 변환될 때 파이썬 인터프리터에 의해 동일한 방식으로 처리됩니다. 이제 Python에서 예약한 함수이기 때문에 함수 이름을 람다 라고 지정할 수 없지만 다른 함수 이름은 동일한 바이트 코드를 생성합니다.

     

    요약

    • 익명 함수라고도 하는 람다는 이름(즉, 식별자)이 필요 없는 작고 제한된 함수입니다.
    • Python의 모든 람다 함수에는 3가지 필수 부분이 있습니다.
    • 람다 키워드.
    • 매개변수(또는 바운드 변수) 및
    • 함수 본체.
    • 람다를 작성하는 구문은 다음과 같습니다. 람다 매개변수: 표현식
    • 람다는 매개변수의 개수에 제한이 없지만 중괄호로 묶지 않습니다.
    • 람다는 기본적으로 반환되는 함수 본문에 1개의 표현식만 가질 수 있습니다.
    • 바이트코드 수준에서는 인터프리터에서 람다와 일반 함수를 처리하는 방법에 큰 차이가 없습니다.
    • Lambda는 다음 구문을 통해 IIFE를 지원합니다. (lambda 매개변수: 표현식)(인수)
    • Lambda는 일반적으로 다음 Python 내장 기능과 함께 사용됩니다.
    • Filter: filter(람다 매개변수: 표현식, 반복 가능한 시퀀스)
    • Map: map(람다 매개변수: 표현식, 반복 가능한 시퀀스)
    • Reduce: reduce(람다 매개변수 1, 매개변수 2: 표현식, 반복 가능한 시퀀스)
    • 프로덕션 환경에서 복잡한 람다 함수를 작성하는 것은 코드 관리자에게 어렵기 때문에 작성하지 마십시오.

    반응형

    댓글