λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
🀷🏼‍♀️ Etc.../- C, C++, Python, Android

Python λ‹€μ–‘ν•œ ν•¨μˆ˜ 기법 : Inner Function, Closure, Lambda λ‚΄μž₯ν•¨μˆ˜, ν΄λ‘œμ €, λžŒλ‹€ κ²½ν—˜ν•˜κΈ°.

by Wonit 2019. 12. 7.

Inner Function λ‚΄μž₯ ν•¨μˆ˜, λ‚΄λΆ€ ν•¨μˆ˜

 

λ‚΄λΆ€ ν•¨μˆ˜λΌκ³  λΆˆλ¦¬λŠ” inner function은 ν•¨μˆ˜ μ•ˆμ— ν•¨μˆ˜μ΄λ‹€.

 

def ν•¨μˆ˜λͺ…1():
    def ν•¨μˆ˜λͺ…2():
        statement

μœ„μ™€ 같은 ν˜•μ‹μœΌλ‘œ μ‚¬μš©λ˜λ©° λ³€μˆ˜μ˜ 생쑴 κΈ°ν•œμ— μœ μ˜ν•΄μ•Ό ν•œλ‹€.

 

λ‹€μ‹œ 말해, λ“€μ—¬μ“°κΈ°λ‘œ λ¬Άμ—¬μžˆλŠ” μ†ŒμŠ€λΌλ¦¬ μ„œλ‘œ μžμ›κ³΅μœ κ°€ κ°€λŠ₯ν•œ μ§€μ—­λ³€μˆ˜μ˜ νŠΉμ„±μ„ 말 ν•˜λŠ” 것이닀.

 

def outer(a, b):
    sum = a + b

    def inner(sum, d):
        return sum + d

    return inner(sum, a)

print(outer(1,2))
>>> 
4

 

λ‚΄λΆ€ ν•¨μˆ˜μ˜ μ“°μž„

λ‚΄μž₯ ν•¨μˆ˜λŠ” λ£¨ν”„λ‚˜ μ½”λ“œ 쀑볡을 ν”Όν•˜κΈ° μœ„ν•΄μ„œ λ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜ 내에 μ–΄λ–€ λ³΅μž‘ν•œ μž‘μ—…μ„ ν•œ 번 이상 μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•˜κ²Œ 쓰인닀.

 

Closure ν΄λ‘œμ €

ν΄λ‘œμ €λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ— μ˜ν•΄ λ™μ μœΌλ‘œ μƒμ„±λ˜λŠ” ν•¨μˆ˜μ΄λ‹€. λ˜ν•œ λ°”κΉ₯ ν•¨μˆ˜λ‘œλΆ€ν„° μƒμ„±λœ λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜κ³ , μ €μž₯ν•  수 μžˆλ‹€.

 

μ•„κΉŒμ™€ 같은 예제λ₯Ό μ°Έκ³ ν•˜λ©΄

def outer(a, b):
    sum = a + b

    def inner(sum, d):
        return sum + d

    return inner(sum, a)

print(outer(1,2))
>>> 
4

 

μ—μ„œ μš°λ¦¬λŠ” def inner(sum, d):에 sum을 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ—ˆμ§€λ§Œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ λ°”κΉ₯ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— λ§€κ°œλ³€μˆ˜λ‘œ 지정을 ν•˜μ§€ μ•Šμ•„λ„ κ°€λŠ₯ν•˜λ‹€.

 

def outer(a, b):
    sum = a + b

    def inner(d):
        return sum + d

    return inner(a)

print(outer(1,2))
>>>
4

λ°”λ‘œ 이런 μ‹μœΌλ‘œ 말이닀!

읡λͺ… ν•¨μˆ˜ : lambda()

읡λͺ… ν•¨μˆ˜λŠ” annonymous function으둜 λ‹¨μΌλ¬ΈμœΌλ‘œ ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.

 

λžŒλ‹€μ˜ μ‚¬μš© 방법

lambda <인자> : <인자 ν™œμš© μˆ˜ν–‰ μ½”λ“œ>
lambda <인자> : <인자 ν™œμš© μˆ˜ν–‰ μ½”λ“œ>(<인자>)

 
학생 리슀트λ₯Ό λ°›κ³  ν•™μƒλ“€μ˜ 이름 μ²«κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ ν‘œν˜„ν•˜λŠ” μ†ŒμŠ€μ½”λ“œ
def info_list(lists, func):
    for list in lists:
        print(func(list))


def cptlz(word):
    return word.capitalize()


student = ['jang', 'hong', 'heo', 'su']

info_list(student, cptlz)

cptlzν•¨μˆ˜λ₯Ό lambda둜 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ ν•  수 μžˆλ‹€.

def info_list(lists, func):
    for list in lists:
        print(func(list))


student = ['jang', 'hong', 'heo', 'su']

info_list(student, lambda lmd_list: lmd_list.capitalize())

λžŒλ‹€λŠ”

  • κ°•λ ₯ν•˜κ³ 
  • κ°„κ²°ν•˜λ©°
  • μ •ν™•ν•˜λ‹€
λžŒλ‹€μ—λ„ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€λ₯Έ ν•¨μˆ˜μ˜ νŠΉμ§•(μœ„μΉ˜ 인자, λ§€κ°œλ³€μˆ˜ κΈ°λ³Έκ°’)등을 μ μš©ν•  수 μžˆλ‹€.

map() ν•¨μˆ˜μ™€ λžŒλ‹€λ‘œ 더 κ°„κ²°ν•˜κ²Œ

map()은 μ§€μ •λœ 리슀트의 μš”μ†Œλ₯Ό μ§€μ •λœ ν•¨μˆ˜λ‘œ μ²˜λ¦¬ν•΄μ£ΌλŠ” ν•¨μˆ˜λΌκ³  ν•œλ‹€.

 

μ‚¬μš©λ²•μ€ map(ν•¨μˆ˜λͺ…, 리슀트) ν˜•μ‹μœΌλ‘œ ν•˜λ©΄ 리슀트의 인덱슀 값을 λͺ¨λ‘ ν•΄λ‹Ή ν•¨μˆ˜λͺ…μœΌλ‘œ μ²˜λ¦¬ν•¨μ„ λœ»ν•œλ‹€.

 

myList = [1, 2, 3, 4, 5]
def add_10(num):
    result = num + 10
    return result

for i in range(len(myList)):
    myList[i] = add_10(myList[i])

 

μœ„μ™€ 같은 μ½”λ“œλ₯Ό mapκ³Ό λžŒλ‹€λ₯Ό μ΄μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 κ°„κ²°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

myList = [1, 2, 3, 4, 5]
add10 = lambda num : num + 10
myList = list(map(add10, myList))

 

이 μ½”λ“œλŠ” μ—­μ‹œ λ‹€μŒκ³Ό 같이 λ³€ν™˜ν•  수 μžˆλ‹€.

 

myList = list(map(lambda num : num + 10, myList))

λŒ“κΈ€