Python 함수와 모듈

PythonBeginner
지금 연습하기

소개

이번 실습에서는 Python 프로그래밍의 두 가지 핵심 개념인 함수와 모듈에 대해 알아봅니다. 함수를 사용하면 코드를 재사용 가능한 블록으로 구성하여 프로그램을 더 모듈화하고 이해하기 쉽게 만들 수 있습니다. 모듈을 사용하면 관련 함수와 변수를 별도의 파일로 구성하여 코드의 재사용성과 유지보수성을 높일 수 있습니다. 이러한 개념을 마스터하면 더욱 효율적이고 체계적인 Python 코드를 작성할 수 있게 됩니다.

함수 정의 및 사용

이 단계에서는 Python에서 함수를 정의하고 사용하는 방법을 배웁니다.

터미널에서 다음 명령어를 입력하여 Python 인터프리터를 엽니다:

python

Python 프롬프트(>>>)가 나타나면 Python 대화형 셸에 진입한 것입니다.

Python 인터프리터

먼저 사람에게 인사하는 간단한 함수를 정의해 보겠습니다. Python 인터프리터에 다음 함수 정의를 입력하세요:

def greet(name):
    return f"Hello, {name}!"

들여쓰기된 return 줄을 입력한 후, 빈 줄에서 Enter를 한 번 눌러 함수 정의를 완료합니다. 그런 다음 동일한 인터프리터에서 함수를 실행합니다:

result = greet("Alice")
print(result)

다음과 같은 출력이 나타나야 합니다:

Hello, Alice!

함수는 def 키워드 뒤에 함수 이름과 괄호 안의 매개변수를 사용하여 정의합니다. 함수 본문은 들여쓰기해야 합니다. 이 함수는 name 매개변수를 받아 인사말 문자열을 반환합니다. 그런 다음 "Alice"라는 인수를 전달하여 함수를 호출하고 결과를 출력합니다. return 문은 함수에서 값을 반환하는 데 사용됩니다. return 문이 없으면 함수는 None을 반환합니다. 함수는 재사용 가능한 코드를 캡슐화하고 특정 작업을 수행하는 데 사용됩니다. 이는 Python 프로그램의 주요 구성 요소입니다.

이제 계산을 수행하는 함수를 만들어 보겠습니다. 먼저 함수를 정의하세요:

def calculate_area(length, width):
    return length * width

빈 줄에서 Enter를 눌러 정의를 완료한 후, 함수를 호출합니다:

area = calculate_area(5, 3)
print(f"The area is: {area}")

다음과 같은 출력이 나타나야 합니다:

The area is: 15

이 함수는 직사각형의 가로와 세로 길이를 받아 면적을 계산합니다.

함수는 기본 매개변수 값을 가질 수도 있습니다. 먼저 함수를 정의하세요:

def power(base, exponent=2):
    return base ** exponent

빈 줄에서 Enter를 누른 후, 두 가지 호출 방식을 테스트합니다:

print(power(3))
print(power(3, 3))

다음과 같은 출력이 나타나야 합니다:

9
27

여기서 지수(exponent)가 제공되지 않으면 함수는 기본값으로 2를 사용합니다.

함수는 튜플을 사용하여 여러 값을 반환할 수 있습니다. 먼저 함수를 정의하세요:

def min_max(numbers):
    return min(numbers), max(numbers)

빈 줄에서 Enter를 누른 후, 함수를 호출합니다:

minimum, maximum = min_max([1, 5, 3, 9, 2])
print(f"Minimum: {minimum}, Maximum: {maximum}")

다음과 같은 출력이 나타나야 합니다:

Minimum: 1, Maximum: 9

이 함수는 숫자 리스트에서 최솟값과 최댓값을 모두 반환합니다.

Python에서는 들여쓰기가 매우 중요하다는 점을 기억하세요. 함수 본문은 일관되게 들여쓰기되어야 합니다.

함수 스코프 이해하기

이 단계에서는 함수 스코프와 변수가 함수 내부 및 외부에서 어떻게 동작하는지 배웁니다.

Python 인터프리터에서 지역 변수와 전역 변수를 살펴보겠습니다:

x = 10  ## 전역 변수

def print_x():
    print(f"Global x: {x}")

print_x()

def change_x():
    x = 20  ## 지역 변수
    print(f"Local x: {x}")

change_x()
print(f"Global x after change_x(): {x}")

다음과 같은 출력이 나타나야 합니다:

Global x: 10
Local x: 20
Global x after change_x(): 10

change_x() 함수가 새로운 지역 변수 x를 생성하며, 이는 전역 변수 x에 영향을 주지 않는다는 점에 주목하세요.

함수 내부에서 전역 변수를 수정하려면 global 키워드를 사용합니다:

def modify_global_x():
    global x
    x = 30
    print(f"Modified global x: {x}")

modify_global_x()
print(f"Global x after modify_global_x(): {x}")

다음과 같은 출력이 나타나야 합니다:

Modified global x: 30
Global x after modify_global_x(): 30

이제 전역 변수 x가 수정되었습니다.

함수는 또한 자신을 감싸고 있는 범위(enclosing scope)의 변수에 접근할 수 있습니다:

def outer_function(x):
    def inner_function():
        print(f"x from outer function: {x}")
    inner_function()

outer_function(40)

다음과 같은 출력이 나타나야 합니다:

x from outer function: 40

내부 함수는 외부 함수의 x 매개변수에 접근할 수 있습니다.

함수 스코프를 이해하는 것은 깔끔하고 버그 없는 코드를 작성하는 데 필수적입니다. 이는 의도치 않은 부작용을 방지하고 함수의 예측 가능성을 높여줍니다.

모듈 생성 및 사용

이 단계에서는 Python 모듈을 생성하고 사용하는 방법을 배웁니다.

exit()를 입력하거나 Ctrl+D를 눌러 Python 인터프리터를 종료합니다.

LabEx VM 환경에서 WebIDE를 엽니다.

WebIDE LabEx VM 인터페이스

~/project 디렉토리에 math_operations.py라는 새 파일을 생성합니다:

touch ~/project/math_operations.py

WebIDE 편집기에서 새로 생성된 파일을 열고 다음 내용을 추가합니다:

## math_operations.py

def add(a, b):
      return a + b

def subtract(a, b):
      return a - b

def multiply(a, b):
      return a * b

def divide(a, b):
      if b != 0:
         return a / b
      else:
         return "Error: Division by zero"

PI = 3.14159

이 모듈에는 4가지 기본 수학 연산과 상수 PI가 포함되어 있습니다.

파일을 저장합니다(WebIDE에는 자동 저장 기능이 활성화되어 있습니다).

이제 같은 디렉토리에 use_math_module.py라는 파일을 생성합니다:

touch ~/project/use_math_module.py

WebIDE 편집기에서 use_math_module.py를 열고 다음 내용을 추가합니다:

## use_math_module.py

import math_operations

result_add = math_operations.add(5, 3)
result_subtract = math_operations.subtract(10, 4)
result_multiply = math_operations.multiply(2, 6)
result_divide = math_operations.divide(15, 3)

print(f"Addition: {result_add}")
print(f"Subtraction: {result_subtract}")
print(f"Multiplication: {result_multiply}")
print(f"Division: {result_divide}")
print(f"Value of PI: {math_operations.PI}")

이 스크립트는 math_operations 모듈을 가져와서 그 안의 함수와 상수를 사용합니다.

파일을 저장하고 터미널에서 다음 명령어를 사용하여 실행합니다:

python ~/project/use_math_module.py

다음과 유사한 출력이 나타나야 합니다:

Addition: 8
Subtraction: 6
Multiplication: 12
Division: 5.0
Value of PI: 3.14159

모듈을 생성하면 관련 함수와 변수를 별도의 파일로 구성할 수 있어 코드를 더 유지보수하기 쉽고 재사용 가능하게 만들 수 있습니다.

모듈을 가져오면 Python은 이를 바이트코드로 컴파일하고 __pycache__ 디렉토리에 저장합니다. 이 디렉토리는 모듈 파일과 같은 위치에 생성되며 컴파일된 바이트코드 파일(.pyc 또는 .pyo)을 포함합니다.

Python이 자동으로 모듈의 컴파일 및 캐싱을 처리하므로 이 디렉토리는 무시해도 됩니다.

모듈에서 특정 함수 가져오기

이 단계에서는 모듈에서 특정 함수를 가져오고 별칭(alias)을 사용하여 코드를 더 간결하게 만드는 방법을 배웁니다.

~/project 디렉토리에 advanced_math.py라는 새 파일을 생성합니다:

touch ~/project/advanced_math.py

WebIDE 편집기에서 advanced_math.py를 열고 다음 내용을 추가합니다:

## advanced_math.py

import math

def square_root(x):
      return math.sqrt(x)

def power(base, exponent):
      return math.pow(base, exponent)

def sin(angle):
      return math.sin(math.radians(angle))

def cos(angle):
      return math.cos(math.radians(angle))

이 모듈은 Python의 내장 math 모듈을 사용하여 더 고급 수학 연산을 제공합니다.

이제 같은 디렉토리에 use_advanced_math.py 파일을 생성합니다:

touch ~/project/use_advanced_math.py

WebIDE 편집기에서 use_advanced_math.py를 열고 다음 내용을 추가합니다:

## use_advanced_math.py

from advanced_math import square_root, power
from advanced_math import sin as sine, cos as cosine

x = 16
y = 2
angle = 30

print(f"Square root of {x}: {square_root(x)}")
print(f"{x} to the power of {y}: {power(x, y)}")
print(f"Sine of {angle} degrees: {sine(angle)}")
print(f"Cosine of {angle} degrees: {cosine(angle)}")

이 스크립트는 advanced_math 모듈에서 특정 함수를 가져오고 sincos에 대해 별칭을 사용합니다.

파일을 저장하고 터미널에서 다음 명령어를 사용하여 실행합니다:

python ~/project/use_advanced_math.py

다음과 유사한 출력이 나타나야 합니다:

Square root of 16: 4.0
16 to the power of 2: 256.0
Sine of 30 degrees: 0.49999999999999994
Cosine of 30 degrees: 0.8660254037844387

특정 함수를 가져오고 별칭을 사용하면 코드를 더 읽기 쉽게 만들고 서로 다른 모듈 간의 이름 충돌을 피할 수 있습니다.

패키지 생성하기

마지막 단계에서는 관련 모듈을 디렉토리 계층 구조로 구성하는 방법인 패키지를 만드는 방법을 배웁니다.

~/project 디렉토리에 geometry라는 새 디렉토리를 생성합니다:

mkdir ~/project/geometry

geometry 디렉토리 안에 __init__.pyshapes.py라는 두 파일을 생성합니다:

touch ~/project/geometry/__init__.py
touch ~/project/geometry/shapes.py

__init__.py 파일은 Python이 해당 디렉토리를 패키지로 인식하게 하기 위해 필요합니다. 이 파일은 비어 있어도 되며, 패키지 초기화 코드를 포함할 수도 있습니다.

WebIDE 편집기에서 shapes.py를 열고 다음 내용을 추가합니다:

## geometry/shapes.py

import math

def circle_area(radius):
      return math.pi * radius ** 2

def rectangle_area(length, width):
      return length * width

def triangle_area(base, height):
      return 0.5 * base * height

이제 ~/project 디렉토리에 use_geometry_package.py라는 파일을 생성합니다:

touch ~/project/use_geometry_package.py

WebIDE 편집기에서 use_geometry_package.py를 열고 다음 내용을 추가합니다:

## use_geometry_package.py

from geometry.shapes import circle_area, rectangle_area, triangle_area

radius = 5
length = 4
width = 6
base = 3
height = 8

print(f"Area of circle with radius {radius}: {circle_area(radius):.2f}")
print(f"Area of rectangle with length {length} and width {width}: {rectangle_area(length, width)}")
print(f"Area of triangle with base {base} and height {height}: {triangle_area(base, height)}")

파일을 저장하고 터미널에서 다음 명령어를 사용하여 실행합니다:

python ~/project/use_geometry_package.py

다음과 유사한 출력이 나타나야 합니다:

Area of circle with radius 5: 78.54
Area of rectangle with length 4 and width 6: 24
Area of triangle with base 3 and height 8: 12.0

패키지를 생성함으로써 관련 모듈을 디렉토리 계층 구조로 구성하여 프로젝트 내에서 관련 기능을 더 쉽게 관리하고 가져올 수 있게 되었습니다.

요약

이번 실습에서는 Python 프로그래밍의 두 가지 핵심 개념인 함수와 모듈을 살펴보았습니다. 함수를 정의하고 사용하는 방법, 함수 스코프를 이해하는 방법, 모듈을 생성하고 사용하는 방법, 모듈에서 특정 함수를 가져오는 방법, 그리고 관련 모듈을 패키지로 구성하는 방법을 배웠습니다.

간단한 함수를 만드는 것부터 시작하여 함수 스코프와 전역 변수와 같은 더 복잡한 개념으로 점진적으로 나아갔습니다. 그런 다음 관련 함수와 변수를 별도의 파일로 구성하여 코드의 유지보수성과 재사용성을 높이는 모듈 생성 방법을 배웠습니다.

특정 함수를 가져오거나 별칭을 사용하는 등 모듈에서 함수를 가져오는 다양한 방법을 탐구했습니다. 이러한 지식을 통해 더 간결하고 읽기 쉬운 코드를 작성하고 모듈 간의 이름 충돌을 방지할 수 있습니다.

마지막으로, 관련 모듈을 디렉토리 계층 구조로 구성하는 방법인 패키지 생성 방법을 배웠습니다. 이는 여러 관련 모듈을 관리해야 하는 대규모 프로젝트에서 특히 유용합니다.

함수와 모듈에 대한 이러한 개념은 잘 구성되고 효율적이며 재사용 가능한 Python 코드를 작성하는 데 매우 중요합니다. Python 학습을 계속하면서 이러한 기술은 더 복잡한 프로그램을 구축하고 대규모 프로젝트에서 협업하는 데 필수적임을 알게 될 것입니다. 이러한 개념을 정기적으로 연습하고 프로그래밍 능력을 향상시키기 위해 사용할 수 있는 방대한 Python 모듈 및 패키지 생태계를 탐색해 보세요.