파이썬/기본

[파이썬] 콜백함수 & 람다함수

caramel-bottle 2023. 9. 14.

콜백함수

다른 함수의 매개변수로 전달되며, 특정 조건이나 이벤트 발생 시 실행되는 함수이다.

  • 비동기 작업
  • 이벤트 처리
  • 사용자 정의 동작

함수형 프로그래밍 언어에서 더 자주 사용되지만 객체 지향 언어에서도 사용된다.

callback

def callback_func(func):
    for i in range(5):
        func()

def print_hello():
    print("안녕하세요, 파이썬")

print_hello()

callback_func(print_hello)

콜백함수의 형태는 간단하다. 특정 조건이나 이벤트 발생 시 실행시키고자 하는 콜백함수를 다른 함수의 인자로 넣어준다.

 

def callback_func(func, num):
    for i in range(num):
        func(i)

def print_hello(num):
    print("안녕하세요, 파이썬", num)

def print_hi(num):
    print("하이! 파이썬!", num)

callback_func(print_hello, 3)
print()
callback_func(print_hello, 5)


이벤트 발생 시 콜백함수 활용

import time

def long_running_task(callback):
    print("Task started...")
    time.sleep(2)  # 가정: 긴 시간이 걸리는 작업을 수행
    print("Task completed.")
    callback()

def on_task_complete():
    print("Callback function called.")

long_running_task(on_task_complete)

긴 시간이 걸리는 작업을 수행하는 함수에서 작업이 끝남과 동시에 실행하고싶은 함수를 콜백함수로 설정한다.


람다 함수

람다함수는 익명의 간단한 함수를 생성하기 위한 구문이다. 한 줄로 표현되는 짧고 간결한 함수를 생성할 때 사용한다.

 

lambda arguments: expression

arguments 에는 어떤 요소가 입력된다.

expression 에는 반환하고자 하는 값이 들어간다.

람다 함수

def square(x):
    return x ** 2

print(square(4))


square = lambda x : x**2

print(square(4))
print(square(5))
print((lambda x : x**2)(4))

간단한 연산을 수행하는 함수의 경우 람다함수로 대체할 수 있다.

람다함수는 일반 함수보다 메모리 사용량이 적기 때문에 메모리 사용량에 민감한 작업의 경우 더더욱 유용하다.

 

람다함수를 변수에 저장하여 하나의 함수를 호출하듯 사용할 수 있고, 람다형식 그대로 사용할 수 있다.


람다함수와 딕셔너리, sorted()

people = [{'name':'김사과', 'age':20}, {'name':'반하나', 'age':25}, {'name':'오렌지', 'age':30}]
sorted_people = sorted(people, key=lambda x : x['age'])

print(sorted_people)

람다함수는 컬렉션 타입을 정렬할 때 sorted() 함수와 함께 쓰인다.

해당 코드는 sorted() key에 딕셔너리 key인 'age'의 value값을 기준으로 정렬을 한다.

본인은 이 부분을 이해하기 어려웠는데 x에 people[n]을 대입한다고 생각하니 이해가 쉬웠다.

print((lambda x : x['age'])(people[0]))
print((lambda x : x['age'])(people[1]))
print((lambda x : x['age'])(people[2]))

* sorted()

sorted(iterable, [key], [reverse], [cmp])

sorted 함수의 경우 컬렉션 타입의 변수를 입력하면 오름차순 정렬을 해준다.

매개변수의 경우 선택적으로 key, reverse, cmp 를 넣을 수 있는데 key는 정렬을 함에 있어 기준을 정하는 매개변수이다.

key값의 기본값은 None이고 기본값일 경우 정렬방법은 이러하다.

 

문자열 리스트인 경우 사전순,

정수 리스트인 경우 숫자 오름차순,

사용자 정의 객체인 경우 __lt__ 메서드의 내용에 따라 비교한다.

 

__lt__ (less than) 메서드의 경우 정의하지 않으면 존재하지 않는다. 기본값이 없다는 뜻이다.

따라서 __lt__ 메서드를 정의하지 않은 객체를 sorted()를 사용하여 정렬하고자 한다면 TypeError가 발생하게 된다.


람다가 유용하게 사용되는 대표적인 함수

  • filter
filter(function, iterable)

function 항목에는 반환값이 True나 False인 함수만 들어간다. iterable 항목엔 리스트, 튜플 등 요소를 걸러낼 반복 가능한 객체가 들어간다.

함수의 반환값에 따라 값을 반환하고 안 하고가 결정되는 함수이다.

 

  • map
map(function, iterable)

기본적인 동작은 filter 함수와 비슷하다. 하지만 filter 함수와 다르게 function 항목에 들어가는 함수가 반환하는 값에 조건이 없다.반복 가능한 객체의 요소 각각이 함수에 입력되고, 출력값을 이터레이터로 반환한다. 반환된 값을 리스트로 사용하기 위해선 list()를 사용한다.

filter()

def even(n):
    if n % 2 == 0:
        return True
    else:
        return False

li = [1, 2, 3, 4, 5, 6, 7]
result = list(filter(even, li))
print(result)

li 리스트에서 값을 순차적으로 함수에 대입하고, True인지 False인지 판단하며 값을 반환한다.

 

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

print(even_numbers)


map()

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)

람다함수와 함께 사용하면 리스트 각각의 요소에 거듭제곱을 한 결과를 반환하고, 새로운 변수에 리스트로 저장할 수 있다.

list1 = [1, 2, 3]
list2 = [4, 5, 6]
summed = list(map(lambda x, y: x + y, list1, list2))
print(summed)

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [5, 6, 7]
summed = list(map(lambda x, y, z: [x + y + z, x - y - z], list1, list2, list3))
print(summed)

람다함수는 두 개 이상의 입력값과 하나의 반환값을 가진다. 반환값은 컬렉션 형식으로 여러 값을 반환할 수 있다.

 

words = ['apple', 'banana', 'cherry']
uppercase_words = list(map(str.upper, words))
print(uppercase_words[:2])

map 함수를 사용하여 다양한 동작을 수행할 수 있다. 참 유용한 것 같다.

'파이썬 > 기본' 카테고리의 다른 글

[파이썬] 객체지향과 클래스  (0) 2023.09.14
[파이썬] 재귀 호출  (0) 2023.09.14
[파이썬] 변수의 범위  (0) 2023.09.12
[파이썬] 함수와 메모리  (0) 2023.09.11
[파이썬] None  (0) 2023.09.11

댓글