๋๋ค๋ ์ธ๋ผ์ธ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ฉฐ Anonymous functions(์ต๋ช ํจ์) ๋๋ Lambda expression(๋๋ค ํํ์)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ๋ก๊ทธ๋จ ๋ด์์ ํจ์๋ฅผ ์ฌ์ฌ์ฉ ํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ lambda ํจ์๋ฅผ ์ธ ์ ์๋ค. ์ผ๋ฐํจ์์ ํํ๋ ๋น์ทํ๊ณ ๋น์ทํ๊ฒ ๋์ํ๋ค.
์ผ๋ฐ ํจ์๋ def
ํค์๋๋ฅผ ํตํด์ ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ๋ฐ๋ฅธ ์์ฑ ๋ฐฉ๋ฒ์ด๊ณ , ํจ์ ๋ํ ํด๋์ค๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ด๋ค.
์ฝ๋์ ์ด๋ฆ์ ๋ด์์ ํจ์ํด๋์ค๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ํจ์์ด๋ฆ๊ณผ ๋์ผํ ๋ณ์์ ๋ด๋ ๊ณผ์ ์ def
ํค์๋๊ฐ ๋์ ํ๋ค.
ํจ์ ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋ด์ ์์ ์์ ํจ์๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ ๋ณ์๋ฅผ ํตํด ์์ ์ด ํธ์ถ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ๋๋ค. ๋ง์ฝ ๋จ ํ ๋ฒ๋ง ์ฌ์ฉ๋ ํจ์๋ผ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋๋ค.
๋๋คํจ์๋ lambda
ํค์๋๋ก ์์ฑํ ์ ์๋ค.
๋๋คํจ์๋ ๊ฒฐ๊ณผ๋ฅผ return
ํค์๋ ์์ด ์๋์ผ๋ก ๋ฐํํ๋ค. ์ต๋ช
ํจ์๋ผ๋ ์ด๋ฆ์ฒ๋ผ ํจ์์ ์ด๋ฆ์ ์ง์ ํ์ง ์๊ณ ๋ง๋ ๋ค.
lambda x : x + 1
์์ ๋๋ค ํจ์๋ x
์ธ argument์ ์ซ์๋ฅผ ๋ฐ์์ 1์ ๋ํด์ฃผ๋ ํจ์์ด๋ค. ๋๋ค๋ ์๋์ ๊ฐ์ด ์ ์์ ๋์์ ์ฌ์ฉํ ์ ์๋ค.
(lambda x : x + 1)(3)
>>>
4
ํจ์์ ์ด๋ฆ์ด ์๊ณ ์ ์ฅ๋ ๋ณ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฌ์ฉํ ์๋ ์์ง๋ง, ์ ์์ ๋์์ ๋ณ์์ ๋ด์ ์๋ ์๋ค.
lambda_func = lambda x, y, z : x + y + z
lambda_func(1, 2, 3)
>>>
6
import types
f = lambda x,y,z : x+y+z
print(f)
print(type(f))
print( type(f) == types.LambdaType)
>>>
<function f at 0x7fbd339684c0>
<class 'function'>
True
์ด ๋ชจ๋์ ์ฌ๋ฌ ํ์
์ ์ด๋ฆ์ ์ ๊ณตํ๋ค. ์ด ์ด๋ฆ๋ค์ ๋ณดํต isinstance()
,๋ issubclass()
์ฒดํฌ์ ์ฌ์ฉ๋๋ค.
def check_password(password):
if len(password) < 8:
return 'SHORT_PASSWORD'
if not any(c.isupper() for c in password):
return 'NO_CAPITAL_LETTER_PASSWORD'
return True
์ดํจ์์ ์๋ if๋ฌธ ๋๊ฐ๋ฅผ ๋๋คํํ์์ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์์ฑํด ๋ณด์ธ์.
์๋์ lambdas ๋ฆฌ์คํธ์์ ๋๊ฐ์ ๋๋คํํ์์ ์์ฑํด์ผํ๋ฉฐ ์ฃผ์์ผ๋ก ํ์๋ ํ๋ฆฐํธ๊ฐ ์ถ๋ ฅ๊ฒฐ๊ณผ๋ก ๋์์ผ ํฉ๋๋ค.
lambdas = [
]
def check_password_using_lambda(password):
for f in lambdas:
if f(password) is not None:
return f(password)
return True
print( check_password_using_lambda('123') ) # SHORT_PASSWORD
print( check_password_using_lambda('12356789f') ) # NO_CAPITAL_LETTER_PASSWORD
print( check_password_using_lambda('123456789fF') ) # True
lambda์ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค
lambda <arguments> : <Return Value if condition is True> if <condition> else <Return Value if condition is False>
์ด ๋ฌธ๋ฒ์ ๋ณด๊ณ ์ ์ฉ์์ผ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
lambdas = [
lambda password: 'SHORT_PASSWORD' if len(password) < 8 else None,
lambda password: 'NO_CAPITAL_LETTER_PASSWORD' if not any(
c.isupper() for c in password) else None
]
def check_password_using_lambda(password):
for f in lambdas:
if f(password) is not None:
return f(password)
return True
print(check_password_using_lambda('123')) # SHORT_PASSWORD
# NO_CAPITAL_LETTER_PASSWORD
print(check_password_using_lambda('12356789f'))
print(check_password_using_lambda('123456789fF')) # True
>>>
SHORT_PASSWORD
NO_CAPITAL_LETTER_PASSWORD
True