익명 함수와 람다 (Anonymous Functions and Lambda)

Beginner

This tutorial is from open-source community. Access the source code

소개

Python 의 익명 함수는 lambda 함수라고 불립니다. 이는 이름을 사용하지 않고 함수를 생성하는 방법입니다. 짧고 한 번만 사용되는 함수를 생성하는 데 유용합니다.

리스트 정렬 재검토

리스트는 in-place 방식으로 정렬될 수 있습니다. sort 메서드를 사용합니다.

s = [10,1,7,3]
s.sort() ## s = [1,3,7,10]

역순으로 정렬할 수 있습니다.

s = [10,1,7,3]
s.sort(reverse=True) ## s = [10,7,3,1]

아주 간단해 보입니다. 하지만, 딕셔너리 (dict) 의 리스트는 어떻게 정렬할까요?

[{'name': 'AA', 'price': 32.2, 'shares': 100},
{'name': 'IBM', 'price': 91.1, 'shares': 50},
{'name': 'CAT', 'price': 83.44, 'shares': 150},
{'name': 'MSFT', 'price': 51.23, 'shares': 200},
{'name': 'GE', 'price': 40.37, 'shares': 95},
{'name': 'MSFT', 'price': 65.1, 'shares': 50},
{'name': 'IBM', 'price': 70.44, 'shares': 100}]

어떤 기준에 따라 정렬할까요?

key function을 사용하여 정렬을 안내할 수 있습니다. key function은 딕셔너리를 받아 정렬에 필요한 값을 반환하는 함수입니다.

portfolio = [
    {'name': 'AA', 'price': 32.2, 'shares': 100},
    {'name': 'IBM', 'price': 91.1, 'shares': 50},
    {'name': 'CAT', 'price': 83.44, 'shares': 150},
    {'name': 'MSFT', 'price': 51.23, 'shares': 200},
    {'name': 'GE', 'price': 40.37, 'shares': 95},
    {'name': 'MSFT', 'price': 65.1, 'shares': 50},
    {'name': 'IBM', 'price': 70.44, 'shares': 100}
]

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

결과는 다음과 같습니다.

## Check how the dictionaries are sorted by the `name` key
[
  {'name': 'AA', 'price': 32.2, 'shares': 100},
  {'name': 'CAT', 'price': 83.44, 'shares': 150},
  {'name': 'GE', 'price': 40.37, 'shares': 95},
  {'name': 'IBM', 'price': 91.1, 'shares': 50},
  {'name': 'IBM', 'price': 70.44, 'shares': 100},
  {'name': 'MSFT', 'price': 51.23, 'shares': 200},
  {'name': 'MSFT', 'price': 65.1, 'shares': 50}
]

콜백 함수 (Callback Functions)

위의 예에서, key function 은 콜백 함수의 한 예입니다. sort() 메서드는 사용자가 제공하는 함수를 "콜백"합니다. 콜백 함수는 종종 해당 작업에만 사용되는 짧은 한 줄 함수입니다. 프로그래머는 종종 이 추가 처리를 지정하기 위한 단축키를 요구합니다.

람다: 익명 함수 (Anonymous Functions)

함수를 생성하는 대신 람다를 사용하십시오. 이전 정렬 예제에서:

portfolio.sort(key=lambda s: s['name'])

이것은 이름 없는 함수를 생성하여 단일 표현식을 평가합니다. 위의 코드는 초기 코드보다 훨씬 짧습니다.

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

## vs lambda
portfolio.sort(key=lambda s: s['name'])

람다 사용 (Using lambda)

  • 람다는 매우 제한적입니다.
  • 단일 표현식만 허용됩니다.
  • if, while 등과 같은 문 (statement) 은 허용되지 않습니다.
  • 가장 일반적인 사용 사례는 sort()와 같은 함수와 함께 사용됩니다.

일부 주식 포트폴리오 데이터를 읽고 이를 목록으로 변환합니다:

>>> import report
>>> portfolio = list(report.read_portfolio('portfolio.csv'))
>>> for s in portfolio:
        print(s)

Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>

연습 문제 7.5: 필드 정렬 (Sorting on a field)

다음 문을 시도하여 포트폴리오 데이터를 주식 이름순으로 알파벳순으로 정렬하십시오.

>>> def stock_name(s):
       return s.name

>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
           print(s)

... inspect the result ...
>>>

이 부분에서 stock_name() 함수는 portfolio 목록의 단일 항목에서 주식의 이름을 추출합니다. sort()는 이 함수의 결과를 사용하여 비교를 수행합니다.

연습 문제 7.6: 람다를 사용하여 필드 정렬 (Sorting on a field with lambda)

lambda 표현식을 사용하여 주식 수를 기준으로 포트폴리오를 정렬해 보십시오.

>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
        print(s)

... inspect the result ...
>>>

각 주식의 가격에 따라 포트폴리오를 정렬해 보십시오.

>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
        print(s)

... inspect the result ...
>>>

참고: lambda는 별도의 함수를 먼저 정의할 필요 없이 sort() 호출에서 특수한 처리 함수를 직접 정의할 수 있게 해주므로 유용한 단축키입니다.

요약

축하합니다! 익명 함수와 람다 (Anonymous Functions and Lambda) 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.