[Python]람다 표현식 알아보기

토남토냥(박인성)·2024년 7월 7일

PYHON

목록 보기
1/1
post-thumbnail

"정보처리기사를 공부 중인데 중간에 이상한 단어가 섞여 있다.
알고보니 lamda 표현식이다. 그래서 이번에 공부하면서 정리하려고 한다."

-tthonam(작성자)-


🔧 목차(Table of contents)

⚙️ 람다(lambda) 표현식 설명
⚒️ 1. 람다(lambda) 표현식이란?
⚒️ 2. 람다 표현식 특징
⚒️ 3. 람다 표현식과 map, filter, reduce 함수 활용하기
⚒️ 4. 람다 표현식 실제 사용
⚒️ 5. 람다 표현식에 조건부 표현식 사용하기
🗝️ 참고 링크(Reference)


✈️ 들어가며

⚙️ 람다(lambda) 표현식 설명

람다 표현식 : "식 형태"로 되어 있다고 해서 "람다 표현식(lambda expression)"이라고 부름

🔑 lambda 매개변수들: 표현식

lambda x: x + 10
<function <lambda> at 0x02C27270>

▶️ 위 함수는 람다식을 사용하고 0x02C27270라는 메모리 주소를 사용하고 있음.


🛫 시작하며

⚒️ 1. 람다(lambda) 표현식이란?

  • 함수를 간편하게 작성 가능 ▶️ 다른 함수의 인수로 넣을 때 주로 사용.

  • 실행 시 함수 객체가 나옴 ▶️ 이 상태로는 함수를 호출 X.
    람다 표현식은 이름이 없는 함수를 만들기 때문 ▶️ 람다 표현식을 익명 함수(anonymous function) 로 부르기도 함.

  • lambda 에 매개변수를 지정하고 :(콜론) 뒤에 반환 값으로 사용할 식을 지정.

🔨 람다 표현식의 변수 할당

  • lambda 로 만든 익명 함수를 호출하기 위해 람다 표현식을 변수에 할당해주면 된다.
    ➡️ 매개변수, 연산자, 값 등을 조합한 식으로 반환값을 만드는 방식.
plus_ten = lambda x: x + 10
plus_ten(1)

	result = 11

▶️ def로 만든 함수와 람다 표현식 비교


⚒️ 2. 람다 표현식 특징

⛏️ 람다 표현식 자체를 호출하기

  • 변수를 할당하지 않고 람다 표현식 자체를 바로 호출 가능.
    람다 표현식을 () 로 묶은 뒤에 다시 () 를 붙이고 인수를 넣어서 호출.

▶️ 식 : (lambda 매개변수들: 식)(인수)

(lambda x: x + 10)(1)

	result = 11

⛏️ 람다 표현식 안에서는 변수를 만들 수 X

  • 반환 값 ▶️ 없이 '식 한 줄로 표현되어야 함.
    (변수가 필요한 코드일 경우에는 def로 함수를 작성)
(lambda x: y = 10; x + y)(1)

SyntaxError: invalid syntax

▶️ 표현식 바깥에 있는 변수는 사용 가능.
다음은 매개변수 x와 람다 표현식 바깥에 있는 변수 y를 더해서 반환하는 식이다.

y = 10
(lambda x: x + y)(1)

	result = 11

⛏️ 람다 표현식으로 매개변수가 없는 함수 만들기

  • 매개변수가 없는 함수를 만들 때는 lambda 뒤에 아무것도 지정하지 않고 :(콜론) 을 붙입니다.
    콜론 뒤에는 반드시 반환할 값 이 있어야 함. ▶️ 표현식(expression) 은 반드시 나와야 함.
(lambda : 1)()

	result = 1
x = 10
(lambda : x)()

	result = 10

🔑 람다 표현식을 인수로 사용

  • 람다 표현식은 함수를 다른 함수의 인수로 넣을 때 매우 편리
  • 사용하는 이유 : 함수의 인수 부분에서 간단하게 함수를 만들기 위해
    사용하는 대표적인 예 : map
    (map 함수의 예시는 바로 밑에서 다루겠다)

⚒️ 3. 람다 표현식과 map, filter, reduce 함수 활용하기

🔨 map 함수

  • map(함수, 리스트) : 함수리스트 를 인자로 받음
    리스트로부터 원소를 하나씩 꺼내서 함수에 적용 ➡️ 결과를 새로운 리스트에 넣음

  • map 함수가 매개변수로 받은 함수 : lambda x: x ** 2
    리스트 : range(5) 를 받음 (range(5) = [0, 1, 2, 3, 4] )

/** 파이썬 2 및 파이썬 3 **/

list(map(lambda x: x ** 2, range(5)))

	result = [0, 1, 4, 9, 16]

🔑 map에 객체를 여러 개 넣기

  • map은 리스트 등의 반복 가능한 객체를 여러 개 넣을 수 있음.
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]

list(map(lambda x, y: x * y, a, b))

	result = [2, 8, 18, 32, 50]
  • 리스트 두 개를 처리할 때 : lambda x, y: x * y 처럼 매개변수두 개를 지정.
    map 에 람다 표현식을 넣고 리스트 두 개를 콤마로 구분해서 넣어줌.
    ▶️ 람다 표현식의 매개변수 개수에 맞게 반복 가능한 객체도 콤마로 구분해서 넣어주면 됨.

🔨 reduce 함수

  • reduce : 반복 가능한 객체의 각 요소를 지정된 함수로 처리
    이전 결과(시퀀스)의 원소들을 누적시켜 반환.

🔑 reduce 는 파이썬 3부터 내장 함수가 아님

  • functools 모듈에서 reduce 함수를 가져와야함
    from functools import reduce 입력
/** 파이썬 3에서는 써야함 **/ 

from functools import reduce
  • reduce 함수 형식 ▶️ reduce(함수, 시퀀스(: 문자열, 리스트, 튜플, 반복가능한객체))
reduce(lambda x, y: x + y, [0, 1, 2, 3, 4]) 

	result = 10

/** 영역 나누기 **/

reduce(lambda x, y: y + x, 'abcde')

	result = 'edcba'

def f(x, y):
	return x + y

a = [1, 2, 3, 4, 5]

from functools import reduce
reduce(f, a)

	result = 15

▶️ 함수 f를 람다 표현식으로 만들어서 reduce

a = [1, 2, 3, 4, 5]

from functools import reduce
reduce(lambda x, y: x + y, a)

	result = 15

🔨 filter 함수

  • filter는 반복 가능한 객체 ▶️ 특정 조건에 맞는 요소 가져옴.
    filter에 지정한 함수의 반환 값True 면 해당 값을 가져옴.

  • filter(함수, 리스트(반복가능한객체)) : 리스트에 들어있는 원소를 함수에 적용
    ▶️ 결과가 참인 값들 로 새로운 리스트를 만들어 줌

/** 파이썬 2 및 파이썬 3 **/ 

list(filter(lambda x: x < 5, range(10)))

	result = [0, 1, 2, 3, 4]
/** 파이썬 2 및 파이썬 3 **/

list(filter(lambda x: x % 2, range(10)))

	result = [1, 3, 5, 7, 9]

▶️ 2로 나누었을 때 1이 나와야 이니 홀수만 뽑는 함수이다

  • def 함수를 만들어 filter 를 사용

def f(x):
	return x > 5 and x < 10

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]

list(filter(f, a))

	result = [8, 7, 9]

▶️ filterx > 5 and x < 10 의 결과가 인 요소만 가져오고 거짓 인 요소는 버림.

▼ 그림 32-3 filter 함수

  • 함수 f를 람다 표현식으로 만듦

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]

list(filter(lambda x: x > 5 and x < 10, a))

	result = [8, 7, 9]

⚒️ 4. 람다 표현식 실제 사용

  • 람다 표현식 으로 익명 함수 를 만들고 ▶️ map , filter , reduce사용.

  • 람다 표현식은 간단한 함수를 만들 때 자주 사용.

  • 리스트(딕셔너리, 세트) 표현식 으로 처리할 수 있는 경우에는 map , filter , 람다 표현식 보다는 ▶️ 리스트 표현식 이 좀 더 알아보기 쉽고 속도도 더 빠름.

list(filter(lambda x: x > 5 and x < 10, a))

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]

[i for i in a if i > 5 and i < 10]

	result = [8, 7, 9]

  • 람다 표현식에서 for , while 반복문 으로 처리할 수 있는 경우 : reduce 보다 ▶️ for , while 사용.

  • reduce는 코드가 조금만 복잡해져도 의미하는 바를 한 눈에 알아보기가 힘듬(파이썬 3 부터는 reduce 가 내장 함수에서 제외됨).

reduce(lambda x, y: x + y, a) 는 아래와 같이 for 반복문 으로 표현

a = [1, 2, 3, 4, 5]
x = a[0]

for i in range(len(a) - 1):
	x += a[i + 1]
	x
    
	result = 15

⚒️ 5. 람다 표현식에 조건부 표현식 사용하기

⛏️ 조건부 표현식

  • lambda 매개변수들 :식1 if 조건식 else 식2 형식
    ▶️ 참: 식1 , 거짓 : 식2
    람다 표현식에서 if 사용시 ▶️ 반드시 else 사용.

  • 조건부 표현식 if, else 를 사용할 때 : :(콜론) 을 붙이지 X.
    일반적인 if, else 와 문법이 다르므로 주의.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(map(lambda x: str(x) if x % 3 == 0 else x, a))

	result = [1, 2, '3', 4, 5, '6', 7, 8, '9', 10]

▼ 위의 식을 그림으로 정리하면 아래와 같다.

  • if만 사용하면 다음과 같이 문법 에러가 발생하므로 주의해야함.
list(map(lambda x: str(x) if x % 3 == 0, a))

SyntaxError: invalid syntax
  • 람다 표현식 안에서는 elif 사용 X.
    ▶️ lambda 매개변수들: 식1 if 조건식1 else 식2 if 조건식2 else 식3
    ▶️ if 를 연속 사용.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(map(lambda x: str(x) if x == 1 else float(x) if x == 2 else x + 10, a))

	result = ['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

🔑 람다 표현식에서 조건부 표현식을 사용할 때 복잡하지 않은 조건을 사용

▶️ 이유: 알아보기가 힘듬

  • 복잡한 조건의 경우: 람다 표현식을 사용하기 보다는 def 함수 만들고
    ▶️ if , elif , else 사용 권장.
def f(x):
	if x == 1:
		return str(x)
        
	elif x == 2:
		return float(x)
        
	else:
		return x + 10

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(map(f, a))

	result = ['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

🔑 복잡하고 어렵게 코드를 작성

▶️ 나중에 시간이 지나서 자기가 만든 코드인데도 못 알아보는 경우가 생김.
▶️ 코드는 길이가 조금 길어지더라도 알아보기 쉽게 작성하는 것이 좋음.


🛬 마치며

람다 표현식이라는 듣도 보도 못한 용어를 이번에 정리했는데 정보처리기사를 공부하면서 글을 정리하니 정리할 주제들이 점점 많아지는 것 같다.
매일 부지런히 글을 올려야겠다.
(그래도 글 올릴 주제들이 넘처나니 그거 하나는 좋다...)


🗝️ 참고 링크(Reference)

profile
개발자가 되고 싶어...

0개의 댓글