Python 함수와 모듈

PythonBeginner
지금 연습하기

소개

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

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 과거 데이터에 따르면 이 실습은 완료율 86%초급 수준 실습입니다. 학습자들로부터 98%의 긍정적인 평가를 받았습니다.

함수 정의 및 사용

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

터미널에 다음 명령어를 입력하여 Python 인터프리터를 실행합니다.

python

Python 대화형 셸에 진입했음을 나타내는 프롬프트 (>>>) 가 표시됩니다.

Python Interpreter

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

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

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

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

Hello, Alice!

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

이제 계산을 수행하는 함수를 만들어 보겠습니다.

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

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

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

The area is: 15

이 함수는 길이와 너비가 주어졌을 때 직사각형의 넓이를 계산합니다.

함수는 매개변수에 기본값을 가질 수도 있습니다.

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

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

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

9
27

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

함수는 튜플을 사용하여 여러 값을 반환할 수 있습니다.

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

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가 수정되었습니다.

함수는 또한 자신을 둘러싼 상위 스코프의 변수에도 접근할 수 있습니다.

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 interface

~/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

이 모듈은 네 가지 기본적인 산술 연산 함수와 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 모듈 및 패키지 생태계를 탐색해 보시기 바랍니다.