[Python – 기초 강좌] 5. 함수(Function) 이해하기

‘함수’는 어떤 작업을 수행하는 코드의 묶음입니다.

함수를 사용하면 코드를 재사용할 수 있으며, 코드의 가독성과 유지 관리가 용이해집니다.

이번 포스팅에서는 파이썬의 함수에 대한 기본적인 이해부터 시작해, 직접 함수를 정의하고 사용하는 방법까지 알아보겠습니다.

Python에서 함수(Function)란 무엇인가?

개요

파이썬에서 함수는 ‘def’ 키워드를 사용하여 정의됩니다.

함수는 입력(argument)을 받아들여, 그 입력을 기반으로 계산을 수행한 후 결과를 반환(return)합니다.

함수를 사용하면 특정 작업을 수행하는 코드를 한데 묶어서 어디서든 쉽게 호출할 수 있습니다.

왜 함수를 사용하는가?

함수를 사용하면 여러 가지 이점이 있습니다:

  • 코드의 재사용성:
    • 한 번 정의한 함수는 여러 번 호출할 수 있어, 같은 코드를 반복해서 작성할 필요가 없습니다.
  • 코드의 구조화:
    • 함수를 사용하면 코드를 논리적인 단위로 나눌 수 있어, 프로그램의 구조가 명확해집니다.
  • 유지 보수의 용이성:
    • 함수를 사용하여 코드를 구조화하면, 코드의 일부분만 수정해도 전체 프로그램에 쉽게 반영할 수 있습니다.

Python에서 함수(Function) 사용하기

기본 구조 (정의)

함수는 def 키워드로 시작하며, 그 뒤에 함수의 이름과 괄호(())가 옵니다.

괄호 안에는 함수가 받을 입력 값(Argument 또는 Parameter)을 정의할 수 있습니다. 함수의 본문은 콜론(:) 다음에 오며, 들여쓰기를 해야 합니다.

예제

def hello():
    print("Hi!")

함수 호출하기

함수를 호출하려면 함수 이름 뒤에 괄호(())를 붙이면 됩니다.

인자를 받는 함수의 경우, 괄호 안에 해당 인자를 전달해야 합니다.

hello()

결과

Hi!

파라미터(Parameter) & 인자(Argument)

함수를 정의할 때 괄호 안에 정의하는 값을 ‘Parameter’라고 하며, 함수를 호출할 때 전달하는 값을 ‘Argument’라고 합니다.

다음과 같이 Parameter와 Argument를 사용하여 함수에 값을 넘겨 줄 수 있습니다.

예제

def greet(name):
    print(f"Hi, {name}!")

greet("Devitworld")

결과

Hi, Devitworld!

Parameter 기본 값 설정

다음과 같이 Parameter에 기본 값을 설정할 수 있습니다.

예제

def greet(name="Guest"):
    print(f"Hi, {name}!")

greet()

결과

Hi, Guest!

가변 인자 (Variable Arguemnts)

함수가 임의의 수의 Argument를 받아야 할 때는 *args (arguments의 약자)를 사용할 수 있습니다.

이는 함수 내부에서 튜플(Tuple)로 처리됩니다.

예제

def print_args(*args):
    for arg in args:
        print(arg)

print_args('One', 'Two', 'Three')

결과

One
Two
Three

키워드 인자 (Keyword Argument)

함수에 키워드 인자를 사용하면, 인자의 순서에 상관없이 파라미터의 이름으로 직접 인자(Argument) 값을 전달할 수 있습니다.

예제

def introduce(name, age):
    print(f"Name: {name}, Age: {age}")

introduce(age=37, name="Devitworld")

결과

def introduce(name, age):
    print(f"Name: {name}, Age: {age}")

introduce(age=37, name="Devitworld")

함수 심화 과정

1. 람다 함수 (Lambda Function)

람다 함수는 이름 없이 정의된 익명 함수입니다.

간단한 기능을 수행하는 함수를 lambda 키워드를 사용하여 한 줄로 작성할 수 있어 코드를 간결하게 만들어 줍니다.

예제

add = lambda x, y: x + y
print(add(5, 3))

결과

8

2. 고차 함수 (Higher-Order Functions)

함수를 다른 함수의 인자로 전달하거나, 함수에서 다른 함수를 반환할 수 있습니다.

이러한 함수를 고차 함수라고 합니다. 고차 함수는 프로그램의 유연성을 크게 향상시킵니다.

예제

# Higher-order function
def greet(func):
    greeting = func("Devitworld")
    print(greeting)

greet(lambda x: f"Hi, {x}!") 

결과

Hi, Devitworld!

3. 데코레이터 (Decorators)

데코레이터는 다른 함수를 받아 몇 가지 기능을 추가한 뒤, 그 함수를 반환하는 고차 함수입니다.

데코레이터는 함수의 동작을 수정하거나 확장하고 싶을 때 유용합니다.

함수를 정의하기 전에 @ 키워드를 사용하여 호출합니다.

예제

def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

결과

Before function call
Hello!
After function call

4. 제너레이터 (Generators)

제너레이터는 반복자(iterator)를 생성하는 함수입니다.

yield 키워드를 사용하여 한 번에 하나씩 값을 생성합니다.

대량의 데이터를 다룰 때 메모리를 효율적으로 사용할 수 있게 해줍니다.

예제

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for i in gen:
    print(i)

결과

1
2
3

5. 재귀 함수 (Recursive Functions)

함수가 자기 자신을 호출하는 방식으로 작동하는 함수를 재귀 함수라고 합니다.

복잡한 문제를 간단하게 분해하여 해결할 수 있게 해줍니다. 하지만, 너무 깊은 재귀는 스택 오버플로를 일으킬 수 있으니 주의해야 합니다.

예제

# Recursion
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(4))

결과

24

참고 문헌

Leave a Comment