Studynote/Python

[Python] λžŒλ‹€ (lambda)

minzhen 2022. 7. 5. 00:41

κ°œλ…

λžŒλ‹€(lambda)λž€?

읡λͺ… ν•¨μˆ˜

 Pythonμ—μ„œλŠ” λžŒλ‹€ ν•¨μˆ˜λ₯Ό 톡해 이름 μ—†λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

λžŒλ‹€ ν•¨μˆ˜μ˜ μž₯점

  • μ½”λ“œμ˜ 간결함
  • λ©”λͺ¨λ¦¬μ˜ μ ˆμ•½

 

λžŒλ‹€ ν•¨μˆ˜λŠ” μ •μ˜μ™€ λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆλŠ” 반면, ν•¨μˆ˜μ— 이름이 μ—†κ³  μ €μž₯된 λ³€μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ μ‚¬μš©ν•  μˆ˜λŠ” μ—†λ‹€.

 

πŸ“
cf) def ν™œμš©ν•œ ν•¨μˆ˜ 생성 : λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ— λ”°λ₯Έ ν•¨μˆ˜ 생성방법. 클래슀λ₯Ό 톡해 μƒμ„±λœ 객체 μΈμŠ€ν„΄μŠ€μ΄λ―€λ‘œ μΌνšŒμ„± κ³„μ‚°μ—λŠ” λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ 될 수 μžˆλ‹€.

 

 

ν™œμš© 방법

 

λžŒλ‹€ ν•¨μˆ˜λŠ” lambda λ§€κ°œλ³€μˆ˜ : ν‘œν˜„μ‹ 의 ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μ˜ˆμ‹œ 1을 톡해 μœ„μ—μ„œ λ§ν•œ def λ₯Ό ν™œμš©ν•œ ν•¨μˆ˜ 생성 방법과 lambdaλ₯Ό ν™œμš©ν•œ ν•¨μˆ˜ 생성 방법을 λΉ„κ΅ν•΄λ³΄μž.

 

ν™œμš© μ˜ˆμ‹œ 1. 인수둜 받은 값에 10을 더해 λ°˜ν™˜ν•˜κΈ°

1)  def ν•¨μˆ˜

def plus_ten(x):
	return x + 10

print(plus_ten(1))		# => 11

2)  lambda μ΅λͺ…ν•¨μˆ˜

print((lambda x: x + 10)(1))		# => 11

μ΄λ ‡κ²Œ λžŒλ‹€ν•¨μˆ˜λŠ” λžŒλ‹€ ν‘œν˜„μ‹ 자체λ₯Ό ν˜ΈμΆœν•  μˆ˜λ„ 있고,

plus_ten = lambda x: x + 10
print(plus_ten(1))		# => 11

μ΄λ ‡κ²Œ λžŒλ‹€ν‘œν˜„μ‹μ„ λ³€μˆ˜μ— 할당해쀄 수 도 μžˆλ‹€. μ΄λŠ” 1)처럼 ν•¨μˆ˜λ‘œ ν™œμš©ν•  수 μžˆλŠ”λ°, 그림으둜 λΉ„κ΅ν•˜λ©΄ 보닀 μ‰½κ²Œ 이해할 수 μžˆλ‹€.


πŸ’‘  def ν•¨μˆ˜ vs lambda μ΅λͺ…ν•¨μˆ˜



πŸ’‘
주의! λžŒλ‹€ ν‘œν˜„μ‹ μ•ˆμ—μ„œλŠ” μƒˆ λ³€μˆ˜λ₯Ό λ§Œλ“€ 수 μ—†λ‹€. 단, λžŒλ‹€ ν‘œν˜„μ‹ λ°–μ˜ λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μžˆλ‹€.
# λžŒλ‹€ ν‘œν˜„μ‹ 내에 λ³€μˆ˜ μ§€μ • -> Error 
print(lambda x: y=10; x+y)(1)) 		# => SyntaxError: invalid syntax

# λžŒλ‹€ ν‘œν˜„μ‹ μ™ΈλΆ€μ˜ λ³€μˆ˜ μ‚¬μš©
z = 10
print((lambda x: x + z)(1)) 		# => 11

 

ν™œμš© μ˜ˆμ‹œ 2. 두 μš”μ†Œμ˜ 합을 κ΅¬ν•˜κΈ°

print((lambda x,y: x + y)(10, 20))			# => 30

 

μ˜ˆμ‹œ 3. μ•žλ’€ λΆˆν•„μš”ν•œ 곡백을 μ œμ™Έν•œ 문자의 길이둜 μ •λ ¬ν•˜κΈ°

target = ['  cat ', ' tiger ', '    dog', 'snake   ']
print(sorted(target, key=lambda x : len(x.strip())))

 

 

 

μ—¬λŸ¬ ν•¨μˆ˜μ™€μ˜ ν™œμš©

 

λžŒλ‹€ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” ν•¨μˆ˜μ˜ 인수 λΆ€λΆ„μ—μ„œ κ°„λ‹¨ν•˜κ²Œ ν•¨μˆ˜λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œμ΄λ‹€. 이런 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ μ˜ˆκ°€ map이닀. μš°μ„   map ν•¨μˆ˜μ— λŒ€ν•΄ μ •ν™•νžˆ μ΄ν•΄ν•˜κΈ° μœ„ν•˜μ—¬, def ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ map의 ν™œμš© μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž.

1. map()

map(ν•¨μˆ˜, 리슀트)     →    리슀트의 μ›μ†Œλ“€μ„ ν•˜λ‚˜μ”© κΊΌλ‚΄ ν•¨μˆ˜λ₯Ό μ μš©μ‹œν‚¨ ν›„, μƒˆλ‘œμš΄ λ¦¬μŠ€νŠΈμ— λ‹΄μ•„μ€€λ‹€.

1-1. ν™œμš© :  lambda + map()

def plus_ten(x):
	return x + 10

print(list(map(plus_ten, [1, 2, 3])))		# => [11, 12, 13]

보톡 mapν•¨μˆ˜λ₯Ό ν™œμš©ν•  λ•Œμ—λŠ” map(str, [1, 2, 3])κ³Ό 같이 μžλ£Œν˜•μ„ λ³€κ²½ν•  λ•Œμ—λ§Œ 자주 ν™œμš©ν–ˆλŠ”λ°, μ΄λ ‡κ²Œ ν•¨μˆ˜λ₯Ό 직접 λ§Œλ“€μ–΄μ„œ 넣어도 λ¬΄λ°©ν•˜λ‹€.

1-2. ν™œμš© :  lambda + map()

list(map(lambda x: x + 10, [1, 2, 3]))		# => [11, 12, 13]
list(map(lambda x: x ** 2, range(5)))     # => [0, 1, 4, 9, 16]

μ „μ²΄μ μœΌλ‘œ 보면 1-1에 λΉ„ν•˜μ—¬ μ½”λ“œκ°€ μ„Έ μ€„μ—μ„œ ν•œ μ€„λ‘œ 쀄어든 것을 확인할 수 μžˆλ‹€. 이처럼 λžŒλ‹€ ν‘œν˜„μ‹μ€ ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인수둜 넣을 λ•Œ 맀우 νŽΈλ¦¬ν•˜λ‹€.

 


πŸ’‘ μ—¬κΈ°μ„œ 잠깐!  ν•¨μˆ˜μ˜ μΈμˆ˜μ™€ μΈμžλž€?

  • 인자 (parameter) : ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ™ΈλΆ€λ‘œλΆ€ν„° λ°›μ•„λ“€μ΄λŠ” μž„μ˜μ˜ κ°’. μœ„μ˜ κ·Έλ¦Όμ—μ„œ μΈμžκ°’μ€ x, y (μΈμžκ°’ = λ§€κ°œλ³€μˆ˜)
  • 인수 (argument) : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ˜λŠ” κ°’. μœ„μ˜ κ·Έλ¦Όμ—μ„œ μΈμˆ˜λŠ” 2, 5

 

 

 

πŸ“
λžŒλ‹€ ν‘œν˜„μ‹μœΌλ‘œ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” ν•¨μˆ˜λ„ λ§Œλ“€ 수 μžˆλ‹€. 단, 콜둠 λ’€μ—λŠ” λ°˜λ“œμ‹œ λ°˜ν™˜ν•  값이 μžˆμ–΄μ•Ό 함!
# 맀개 λ³€μˆ˜κ°€ μ—†λŠ” λžŒλ‹€ ν‘œν˜„μ‹

(lambda : 1)()			# => 1

x = 10
(lambda : x)()			# => 10

 

 

2. reduce() 

 

❗
Python3μ—μ„œλŠ” from functools import reduce ν•„μˆ˜!

    reduceλΌλŠ” 단어와 μ—°μ‚° 방식이 λ§€μΉ˜κ°€ 잘 λ˜μ§€ μ•Šμ§€λ§Œ, μ‹œν€€μŠ€μ˜ μ›μ†Œκ°€ λˆ„μ λ˜λ©° 쀄어듀기 λ•Œλ¬Έμ΄λΌκ³  μ΄ν•΄ν•˜λ©΄ 쉽닀.

reduce(ν•¨μˆ˜, μ‹œν€€μŠ€)       :  μ‹œν€€μŠ€(λ¬Έμžμ—΄, 리슀트, νŠœν”Œ)의 μ›μ†Œλ“€μ„ λˆ„μ μ μœΌλ‘œ ν•¨μˆ˜μ— μ μš©μ‹œν‚¨λ‹€.
from functools import reduce

reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])			# => 10

 

3. filter() 

filter(ν•¨μˆ˜, 리슀트)              :  리슀트의 μ›μ†Œλ“€μ„ ν•¨μˆ˜μ— μ μš©μ‹œμΌœμ„œ κ²°κ³Όκ°€ 참인 κ°’λ“€λ‘œ μƒˆλ‘œμš΄ 리슀트λ₯Ό 리턴
# 5 μ΄ν•˜μ˜ μ›μ†Œλ§Œ ν•„ν„°λ§ν•˜κΈ°

list(filter(lambda x: x < 5, range(10))) 		# => [0, 1, 2, 3, 4]
# ν™€μˆ˜λ§Œ ν•„ν„°λ§ν•˜κΈ°

list(filter(lambda x: x % 2, range(10)))  	# => [1, 3, 5, 7, 9]

 

 


μ°Έκ³  μ‚¬μ΄νŠΈ

  • μ œλŒ€λ‘œ 파이썬 (https://wikidocs.net/22804)
  • μ™•μ΄ˆλ³΄λ₯Ό μœ„ν•œ Python: μ‰½κ²Œ ν’€μ–΄ μ“΄ 기초 문법과 μ‹€μŠ΅ (https://wikidocs.net/64)
  • μ½”λ”© 도μž₯ (https://dojang.io/mod/page/view.php?id=2359)