파이썬 함수 마스터하기: 정의, 호출, 들여쓰기, 인자 & 반환값
파이썬 함수 마스터하기: 정의, 호출, 들여쓰기, 인자 & 반환값
함수는 모든 파이썬 애플리케이션의 기본 구성 요소입니다. 재사용 가능한 로직을 캡슐화하고, 코드를 DRY(Don't Repeat Yourself) 원칙에 맞게 유지하며, 프로그램을 더 쉽게 읽고, 테스트하고, 유지보수할 수 있게 해줍니다. 이 가이드에서는 파이썬 3에서 함수를 작성, 호출, 문제 해결하는 데 필요한 모든 단계를 다루며, 파이썬 2에서 마주칠 차이점도 함께 살펴봅니다.
파이썬에서 함수란 무엇인가?
파이썬 함수는 호출할 때 실행되는 독립적인 코드 블록입니다. 단일하고 잘 정의된 작업을 수행하며 필요할 때마다 재사용할 수 있는 미니 프로그램이라고 생각하면 됩니다. 파이썬에는 수많은 내장 함수(print(), input() 등)가 제공되지만, 직접 함수를 만들어 코드의 확장성과 진화를 도모할 수 있습니다.
함수 정의와 호출
함수는 def 키워드로 선언하며, 함수 이름과 괄호로 감싼 매개변수 리스트가 뒤따릅니다. 함수 본문은 콜론으로 시작하고 반드시 들여쓰기되어야 합니다.
def greet():
print("Hello, Python!")
# 함수 호출
greet()
출력: Hello, Python!
들여쓰기가 중요한 이유
파이썬은 중괄호나 명시적인 begin/end 문을 사용하지 않습니다. 대신 들여쓰기로 범위를 정의합니다. 함수, 루프, 조건문 등 모든 코드 블록은 일관된 들여쓰기 수준을 공유해야 합니다.
- 함수 정의 후 최소 한 수준의 들여쓰기(일반적으로 공백 4칸)가 필요합니다.
- 해당 함수 내의 모든 문장은 동일한 들여쓰기를 사용해야 합니다.
- 탭과 공백을 섞거나 들여쓰기 깊이를 다르게 하면
IndentationError가 발생합니다.
올바른 들여쓰기 예시:
def demo():
print("Line 1")
print("Line 2")
자주 하는 실수:
def demo():
print("Oops")
이 경우 IndentationError: expected an indented block 에러가 발생합니다.
return 문 사용하기
return 키워드는 값을 호출자에게 돌려줍니다. 함수가 return을 만나지 않고 끝까지 도달하면 암시적으로 None을 반환합니다.
def square(x):
return x * x
print(square(4)) # 16
return이 없을 때:
def square(x):
x * x
print(square(4)) # None
또한 함수 객체 자체를 출력하면(예: print(square)) 메모리 주소가 표시되는데, 이는 실제 애플리케이션 코드에서는 거의 쓸모가 없습니다.
함수에 인자 전달하기
인자는 함수가 동작하는 데 필요한 데이터를 제공합니다. 매개변수는 함수 시그니처에 정의된 자리 표시자입니다.
def multiply(x, y=1):
return x * y
print(multiply(4)) # 4 (y는 기본값 1)
print(multiply(4, 2)) # 8
print(multiply(y=3, x=2)) # 6 (키워드 인자로 순서 변경 가능)
가변 길이 인자 (*args와 **kwargs)
임의의 개수 인자를 받아야 할 때가 있습니다. 위치 인자에는 *args, 키워드 인자에는 **kwargs를 사용합니다.
def summarize(*values, **options):
total = sum(values)
print(f"Total: {total}")
if options.get("show_details"):
print("Values:", values)
summarize(1, 2, 3, 4, 5, show_details=True)
파이썬 2와 파이썬 3: 주요 차이점
- 출력 문법: 파이썬 2에서는
print "text", 파이썬 3에서는 print("text")
- 함수 오버로딩(같은 이름의 다중 시그니처)은 파이썬 2에서 지원하지 않지만, 파이썬 3에서는
functools.singledispatch나 인자 타입 검사를 통해 구현 가능합니다.
- 정수 나눗셈:
5/2는 파이썬 2에서 2, 파이썬 3에서 2.5를 반환합니다(두 버전 모두 //로 버림 나눗셈 가능).
함수 설계 모범 사례
- 함수는 한 가지 명확한 작업만 수행하도록 집중적으로 설계하세요.
- 함수 내부 첫 줄에 독스트링으로 문서화하세요.
def add(a, b):
"""Return the sum of a and b."""
return a + b
- 타입 힌트(파이썬 3.5+)를 사용해 예상 인자 타입과 반환 타입을 명시하세요.
def add(a: int, b: int) -> int:
return a + b
- 선택적 매개변수에는 키워드 인자를 사용하여 가독성을 높이세요.
종합 예제
# 포괄적인 파이썬 3 스크립트 예제
def greet():
"""Print a friendly greeting."""
print("Hello, Python!")
def square(x: int) -> int:
"""Return the square of x."""
return x * x
def multiply(x: int, y: int = 1) -> int:
"""Return the product of x and y, with y defaulting to 1."""
return x * y
# 시연
if __name__ == "__main__":
greet()
print(square(4)) # 16
print(multiply(4)) # 4
print(multiply(4, 2)) # 8
print(multiply(y=2, x=4)) # 8
더 자세한 내용은 공식 파이썬 문서의 함수 정의 섹션을 참조하세요.