Created at : 2024-09-02 13:07
Auther: Soo.Y

5. ν•¨μˆ˜ (Functions)

ν•¨μˆ˜λŠ” μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고, ν”„λ‘œκ·Έλž¨μ„ 더 ꡬ쑰적이고 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” μ€‘μš”ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œ ν•¨μˆ˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ λͺ…령문을 κ·Έλ£Ήν™”ν•˜μ—¬ 이름을 뢙인 ν›„ ν•„μš”ν•  λ•Œ ν˜ΈμΆœν•  수 μžˆλ„λ‘ λ§Œλ“  μ½”λ“œ λΈ”λ‘μž…λ‹ˆλ‹€. 이 μ„Ήμ…˜μ—μ„œλŠ” 파이썬 ν•¨μˆ˜μ˜ μ •μ˜, 호좜, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ κ°’, κΈ°λ³Έ λ§€κ°œλ³€μˆ˜, κ°€λ³€ λ§€κ°œλ³€μˆ˜, λžŒλ‹€ ν•¨μˆ˜, 그리고 ν•¨μˆ˜μ˜ μŠ€μ½”ν”„μ— λŒ€ν•΄ μ„€λͺ…ν•©λ‹ˆλ‹€.

5.1 ν•¨μˆ˜ μ •μ˜μ™€ 호좜

νŒŒμ΄μ¬μ—μ„œ ν•¨μˆ˜λŠ” def ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€. ν•¨μˆ˜λŠ” ν•„μš”ν•  λ•Œ ν˜ΈμΆœν•  수 있으며, 호좜 μ‹œμ— ν•¨μˆ˜ λ‚΄λΆ€μ˜ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

  • ν•¨μˆ˜ μ •μ˜:
def ν•¨μˆ˜μ΄λ¦„(λ§€κ°œλ³€μˆ˜1, λ§€κ°œλ³€μˆ˜2):
    μ‹€ν–‰ν•  μ½”λ“œ
    return λ°˜ν™˜κ°’
  • 예제:
def greet(name):
    return f"μ•ˆλ…•ν•˜μ„Έμš”, {name}λ‹˜!"
 
# ν•¨μˆ˜ 호좜
message = greet("홍길동")
print(message)  # 좜λ ₯: μ•ˆλ…•ν•˜μ„Έμš”, ν™κΈΈλ™λ‹˜!

μœ„μ˜ μ˜ˆμ œμ—μ„œ greet ν•¨μˆ˜λŠ” 이름을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ 인사 λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

5.2 λ§€κ°œλ³€μˆ˜μ™€ 인자

ν•¨μˆ˜λŠ” μž…λ ₯을 받을 수 μžˆλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” μ΄λŸ¬ν•œ λ§€κ°œλ³€μˆ˜μ— 값을 μ „λ‹¬ν•˜λŠ”λ°, 이λ₯Ό 인자라고 ν•©λ‹ˆλ‹€.

  • μœ„μΉ˜ 인자: μœ„μΉ˜ μΈμžλŠ” ν•¨μˆ˜ μ •μ˜μ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œμ— 따라 값을 μ „λ‹¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
def add(a, b):
    return a + b
 
result = add(3, 5)
print(result)  # 좜λ ₯: 8
  • ν‚€μ›Œλ“œ 인자: ν‚€μ›Œλ“œ μΈμžλŠ” 인자의 이름을 λͺ…μ‹œν•˜μ—¬ 값을 μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ, 인자의 μˆœμ„œλ₯Ό 바꾸어도 μ˜¬λ°”λ₯΄κ²Œ 값을 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
result = add(b=5, a=3)
print(result)  # 좜λ ₯: 8
  • κΈ°λ³Έκ°’ λ§€κ°œλ³€μˆ˜: λ§€κ°œλ³€μˆ˜μ— 기본값을 μ„€μ •ν•˜λ©΄, ν•¨μˆ˜ 호좜 μ‹œ ν•΄λ‹Ή 인자λ₯Ό μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒλž΅λœ 경우 기본값이 μ‚¬μš©λ©λ‹ˆλ‹€.
def greet(name, message="μ•ˆλ…•ν•˜μ„Έμš”"):
    return f"{message}, {name}λ‹˜!"
 
print(greet("홍길동"))  # 좜λ ₯: μ•ˆλ…•ν•˜μ„Έμš”, ν™κΈΈλ™λ‹˜!
print(greet("홍길동", "쒋은 μ•„μΉ¨μž…λ‹ˆλ‹€"))  # 좜λ ₯: 쒋은 μ•„μΉ¨μž…λ‹ˆλ‹€, ν™κΈΈλ™λ‹˜!

5.3 λ°˜ν™˜ κ°’ (Return Value)

ν•¨μˆ˜λŠ” return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜ν™˜ 값은 ν•¨μˆ˜ 호좜의 결과둜 제곡되며, ν˜ΈμΆœν•œ κ³³μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ°˜ν™˜ 값이 μžˆλŠ” ν•¨μˆ˜:
def multiply(a, b):
    return a * b
 
result = multiply(3, 4)
print(result)  # 좜λ ₯: 12
  • λ°˜ν™˜ 값이 μ—†λŠ” ν•¨μˆ˜: ν•¨μˆ˜μ—μ„œ return 문을 μƒλž΅ν•˜λ©΄ 기본적으둜 None을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
def print_message():
    print("이 λ©”μ‹œμ§€λŠ” 좜λ ₯λ©λ‹ˆλ‹€.")
 
result = print_message()
print(result)  # 좜λ ₯: None

5.4 κ°€λ³€ λ§€κ°œλ³€μˆ˜ (Variable-length Arguments)

ν•¨μˆ˜λŠ” κ°€λ³€ λ§€κ°œλ³€μˆ˜λ₯Ό 받아듀일 수 있으며, 이λ₯Ό 톡해 호좜 μ‹œ μ „λ‹¬λ˜λŠ” 인자의 κ°œμˆ˜μ— 관계없이 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • *args: μœ„μΉ˜ 인자의 κ°€λ³€ λ§€κ°œλ³€μˆ˜: *argsλŠ” ν•¨μˆ˜κ°€ μž„μ˜μ˜ 개수의 μœ„μΉ˜ 인자λ₯Ό 받을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
def sum_all(*args):
    return sum(args)
 
print(sum_all(1, 2, 3))  # 좜λ ₯: 6
print(sum_all(4, 5, 6, 7, 8))  # 좜λ ₯: 30
  • **kwargs: ν‚€μ›Œλ“œ 인자의 κ°€λ³€ λ§€κ°œλ³€μˆ˜: **kwargsλŠ” ν•¨μˆ˜κ°€ μž„μ˜μ˜ 개수의 ν‚€μ›Œλ“œ 인자λ₯Ό 받을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
 
print_info(name="홍길동", age=30, city="μ„œμšΈ")

이 μ˜ˆμ œλŠ” print_info ν•¨μˆ˜κ°€ μ „λ‹¬λœ ν‚€μ›Œλ“œ μΈμžλ“€μ„ 좜λ ₯ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

5.5 λžŒλ‹€ ν•¨μˆ˜ (Lambda Functions)

λžŒλ‹€ ν•¨μˆ˜λŠ” 단일 λ¬Έμž₯으둜 이루어진 읡λͺ… ν•¨μˆ˜λ‘œ, lambda ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€. λžŒλ‹€ ν•¨μˆ˜λŠ” κ°„λ‹¨ν•œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • κΈ°λ³Έ ꡬ쑰:
lambda λ§€κ°œλ³€μˆ˜λ“€: ν‘œν˜„μ‹
  • 예제:
add = lambda a, b: a + b
print(add(3, 4))  # 좜λ ₯: 7
  • λžŒλ‹€ ν•¨μˆ˜μ˜ ν™œμš©: λžŒλ‹€ ν•¨μˆ˜λŠ” μ’…μ’… map, filter, sorted λ“±μ˜ ν•¨μˆ˜μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, numbers))
print(squares)  # 좜λ ₯: [1, 4, 9, 16, 25]

5.6 ν•¨μˆ˜ μŠ€μ½”ν”„μ™€ λ„€μž„μŠ€νŽ˜μ΄μŠ€ (Scope and Namespace)

ν•¨μˆ˜ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ“€μ˜ 유효 λ²”μœ„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. νŒŒμ΄μ¬μ€ ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό 톡해 λ³€μˆ˜μ˜ 유효 λ²”μœ„λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

  • μ§€μ—­ λ³€μˆ˜ (Local Variables): ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λœ λ³€μˆ˜λŠ” μ§€μ—­ λ³€μˆ˜μ΄λ©°, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
def greet():
    name = "홍길동"  # μ§€μ—­ λ³€μˆ˜
    print(f"μ•ˆλ…•ν•˜μ„Έμš”, {name}λ‹˜!")
 
greet()
# print(name)  # 였λ₯˜ λ°œμƒ: name은 ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό λΆˆκ°€
  • μ „μ—­ λ³€μˆ˜ (Global Variables): ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜μ΄λ©°, λͺ¨λ“  ν•¨μˆ˜μ—μ„œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
name = "홍길동"  # μ „μ—­ λ³€μˆ˜
 
def greet():
    print(f"μ•ˆλ…•ν•˜μ„Έμš”, {name}λ‹˜!")
 
greet()  # 좜λ ₯: μ•ˆλ…•ν•˜μ„Έμš”, ν™κΈΈλ™λ‹˜!
  • global ν‚€μ›Œλ“œ: ν•¨μˆ˜ λ‚΄μ—μ„œ μ „μ—­ λ³€μˆ˜λ₯Ό μˆ˜μ •ν•˜λ €λ©΄ global ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
counter = 0
 
def increment():
    global counter
    counter += 1
 
increment()
print(counter)  # 좜λ ₯: 1
  • nonlocal ν‚€μ›Œλ“œ: nonlocal ν‚€μ›Œλ“œλŠ” 쀑첩 ν•¨μˆ˜ λ‚΄μ—μ„œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜(μ§€μ—­ λ³€μˆ˜)λ₯Ό μˆ˜μ •ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
def outer_function():
    x = "μ™ΈλΆ€ λ³€μˆ˜"
 
    def inner_function():
        nonlocal x
        x = "λ‚΄λΆ€μ—μ„œ μˆ˜μ •λœ μ™ΈλΆ€ λ³€μˆ˜"
 
    inner_function()
    print(x)
 
outer_function()  # 좜λ ₯: λ‚΄λΆ€μ—μ„œ μˆ˜μ •λœ μ™ΈλΆ€ λ³€μˆ˜

5.7 ν•¨μˆ˜μ˜ λ¬Έμ„œν™” (Docstring)

ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ, ν•¨μˆ˜μ˜ μ—­ν• κ³Ό μ‚¬μš©λ²•μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ 본문에 첫 번째 μ€„λ‘œ λ¬Έμ„œν™” λ¬Έμžμ—΄(Docstring)을 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜μ˜ μ‚¬μš©λ²•μ„ μ΄ν•΄ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.

  • λ¬Έμ„œν™” 예제:
def add(a, b):
    """
    두 수λ₯Ό λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
 
    λ§€κ°œλ³€μˆ˜:
    a (int): 첫 번째 숫자
    b (int): 두 번째 숫자
 
    λ°˜ν™˜κ°’:
    int: a와 b의 ν•©
    """
    return a + b
 
print(add(2, 3))  # 좜λ ₯: 5

ν•¨μˆ˜μ˜ λ¬Έμ„œν™”λŠ” help() ν•¨μˆ˜λ₯Ό 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

help(add)

이제 νŒŒμ΄μ¬μ—μ„œ ν•¨μˆ˜μ˜ κ°œλ…κ³Ό μ‚¬μš©λ²•μ— λŒ€ν•΄ μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λŠ” μ½”λ“œμ˜ 쀑볡을 쀄이고, μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•˜λ©°, ν”„λ‘œκ·Έλž¨μ„ 더 μ²΄κ³„μ μœΌλ‘œ λ§Œλ“œλŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

κ΄€λ ¨ λ¬Έμ„œ

1. 파이썬(Python) μ΄λž€