파이썬 타입 어노테이션

파이썬은 동적 타이핑(dynamic typing) 언어로 잘 알려져 있습니다. 이는 변수의 타입을 명시할 필요 없이 모든 값이 실행 시간에 체크되는 것을 의미합니다. 그러나 대규모 프로젝트가 복잡해지고 여러 개발자가 협력하게 되면서, 코드의 이해 및 유지보수가 어려워질 수 있습니다. 이를 해결하기 위해 파이썬 3.5부터는 타입 어노테이션(Type Annotation)이 도입되었습니다. 타입 어노테이션을 사용하면 코드의 가독성을 높이고 버그를 예방하며 자동 완성 기능을 향상시키는 데 도움이 됩니다.

1. 타입 어노테이션의 기초

타입 어노테이션은 변수나 함수의 타입을 명시적으로 기술할 수 있게 해주는 문법입니다. 다음은 변수와 함수의 타입을 어노테이션하는 기본적인 방법입니다:

변수 어노테이션:
x: int = 10
y: float = 10.5
name: str = "Alice"

함수 어노테이션:
def greeting(name: str) -> str:
    return "Hello " + name

1.1 변수의 타입 어노테이션

변수의 타입을 지정하여 코드 작성자는 특정한 타입이 기대된다는 의도를 명확히 할 수 있습니다. 이는 툴링과 IDE에서 정적 분석을 통해 오류를 사전에 감지할 수 있게 해줍니다.

1.2 함수의 파라미터와 반환 값 어노테이션

함수 어노테이션을 통해 함수의 입력과 출력 타입을 명시할 수 있으며, 함수가 어떠한 타입의 데이터를 받을지 예상할 수 있도록 도와줍니다. 이는 코드 리뷰 시 큰 도움이 됩니다.

2. 내장 데이터 타입

파이썬은 다양한 내장 데이터 타입을 지원하며, 이 타입들을 어노테이션에 사용할 수 있습니다.

  • Int, float, str, bool, None 등 기본 타입
  • List, Dict, Set, Tuple 등 컨테이너 타입은 typing 모듈을 통해 더 세분화할 수 있습니다.
from typing import List, Dict, Tuple

names: List[str] = ["Alice", "Bob", "Charlie"]
scores: Dict[str, int] = {"Alice": 95, "Bob": 85}
position: Tuple[int, int] = (10, 20)

3. 유니언과 옵셔널

여러 타입을 허용해야 하는 경우 Union을 사용하고, None을 허용하는 경우 Optional을 사용하는 것이 일반적입니다.

from typing import Union, Optional

value: Union[int, float] = 5.5

def get_user(id: int) -> Optional[Dict[str, str]]:
    if id == 1:
        return {"name": "Alice", "role": "admin"}
    return None

4. 사용자 정의 타입

복잡한 타입을 정의해야 하는 경우, Type 또는 NewType 을 사용하여 더욱 명확한 코드를 작성할 수 있습니다.

from typing import NewType

UserID = NewType('UserID', int)
admin_user_id: UserID = UserID(524313)

4.1 타입 앨리어스

타입 앨리어스를 사용하여 복잡한 타입 구조를 간결한 이름으로 표현할 수 있습니다.

Vector = List[float]

def normalize(vec: Vector) -> Vector:
    magnitude = sum(x**2 for x in vec) ** 0.5
    return [x / magnitude for x in vec]

5. 제네릭(Generic) 타입

제네릭 타입을 사용하면 하나의 함수나 클래스를 여러 타입으로 사용할 수 있습니다. typing.Generic 클래스를 사용하여 제네릭 타입을 정의할 수 있습니다.

from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, content: T) -> None:
        self.content = content

int_box = Box(123)
str_box = Box("hello")

6. 고급 예제

다음은 타입 어노테이션을 활용하여 작성된 조금 더 복잡한 예제입니다.

from typing import List, Dict, Union, Callable

def process_data(data: List[Union[int, float, str]]) -> Dict[str, Union[int, float]]:
    result: Dict[str, Union[int, float]] = {'total': 0, 'numeric_count': 0}

    def is_number(val: Union[int, float, str]) -> bool:
        return isinstance(val, (int, float))

    for item in data:
        if is_number(item):
            result['total'] += item  # 타입 경고는 막아준다.
            result['numeric_count'] += 1

    return result

mixed_data: List[Union[int, float, str]] = [10, '20', 30.5, 'forty', '60', 70.2]
output = process_data(mixed_data)
print(output)
# {'total': 110.7, 'numeric_count': 3}

7. 정적 타입 체크 툴

타입 어노테이션은 정적 타입 체크 툴과 함께 사용될 때 가장 유용합니다. 파이썬에서는 mypyPyrightPylance 같은 툴들이 많이 사용됩니다.

예를 들어, mypy는 다음과 같이 사용됩니다:

mypy script.py

이러한 툴은 코드의 타입 일관성을 검사하고 예상치 못한 타입 오류를 예방하는 데 매우 효과적입니다.

8. 결론

타입 어노테이션은 파이썬의 강력한 기능으로, 코드의 가독성을 높이고 유지보수를 쉽게 하며 오류를 사전에 예방하는 데 큰 도움을 줍니다. 또한, 정적 분석 도구와 결합하여 대규모 프로젝트에 더욱 안정성을 부여합니다. 이 강좌를 통해 여러분이 타입 어노테이션을 잘 활용할 수 있게 되어, 보다 견고한 파이썬 코드를 작성하길 기대합니다.

파이썬 이터레이터와 제너레이터

프로그래밍에서 순회 가능한 객체와 그 활용은 대규모 데이터 처리 시 필수적입니다. 파이썬은 이러한 작업을 수행하기 위해 이터레이터와 제너레이터라는 두 가지 강력한 도구를 제공합니다. 이번 글에서는 이터레이터와 제너레이터의 개념, 이들의 차이점, 그리고 사용법을 깊이 있게 다루어 보겠습니다.

이터레이터(Iterator)

이터레이터는 반복 가능한 객체를 나타내는 프로토콜로, 객체의 요소를 순회할 수 있는 인터페이스를 제공합니다. 파이썬에서 이터레이터는 __iter__() 메소드와 __next__() 메소드를 구현하여 만들어집니다. 이들은 반복문에서 순회를 수행할 때 자동으로 호출되며, 일반적으로 많은 양의 데이터를 처리할 때 유용합니다.

이터레이터의 작동 방식

이터레이터의 작동을 이해하기 위해서는 두 메소드에 대해 더 깊이 알아야 합니다.

  • __iter__()이터러블 객체를 반환합니다. 즉, 원래 객체 자신을 반환합니다. 이 메소드는 반복이 시작될 때 호출됩니다. 이터러블 객체는 시작 지점에서 이터레이터를 얻기 위해 사용됩니다.
  • __next__()이터레이션을 통해 데이터의 다음 값을 반환합니다. 만약 더 이상의 데이터가 없다면 StopIteration 예외를 발생시켜야 합니다. 이 메소드는 반복할 요소가 그룹화된 이터러블의 다음 항목을 가져오기 위해 호출됩니다.

간단한 이터레이터 예제

다음은 간단한 카운터 이터레이터의 예제 코드입니다:


class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

counter = Counter(1, 5)
for number in counter:
    print(number)
    

위의 예제에서 Counter 클래스는 __iter__()와 __next__() 메소드를 구현하여 이터레이터 프로토콜을 따르고 있습니다. 이 클래스의 객체는 반복문(for loop)에서 사용할 수 있습니다.

제너레이터(Generator)

제너레이터는 이터레이터를 보다 간단히 생성할 수 있도록 도와주는 특별한 함수로, yield 키워드를 사용하여 값을 하나씩 반환합니다. 제너레이터는 호출되면 제너레이터 객체를 반환하며, 이는 제너레이터 함수가 값의 순회에 사용될 때 실행되고, 중지되었다가 다시 호출되면 중단된 지점에서 재개됩니다.

제너레이터의 작동 방식

제너레이터는 내부적으로 __iter__()와 __next__() 메소드를 자동으로 구현하여 사용자에게 이러한 구현을 숨깁니다. 따라서 제너레이터 함수를 호출하면 제너레이터 객체가 반환되며, 이 객체는 이터레이터처럼 사용할 수 있습니다.

제너레이터 예제

다음은 간단한 제너레이터 함수의 예제 코드입니다:


def simple_generator():
    yield 1
    yield 2
    yield 3

for value in simple_generator():
    print(value)
    

위의 예제에서, simple_generator() 함수는 호출될 때마다 yield 키워드를 사용하여 값을 하나씩 반환합니다. 이 제너레이터는 다른 이터레이터처럼 for 반복문에서 사용할 수 있습니다.

이터레이터와 제너레이터의 차이점

이터레이터와 제너레이터는 많은 유사점이 있지만, 몇 가지 중요한 차이점이 있습니다:

  • 구현의 간단함: 제너레이터는 yield 키워드를 사용하여 더 직관적이고 간단하게 구현할 수 있습니다. 이터레이터를 직접 작성할 때의 복잡함을 없앨 수 있습니다.
  • 상태 유지: 제너레이터는 상태를 자동으로 유지합니다. 제너레이터가 실행을 중단하고 있을 때 모든 현 상태를 기억하므로, yield를 계속해서 호출하면 그 상태를 지속적으로 유지합니다.
  • 메모리 사용: 제너레이터는 즉시 결과를 생성하지 않고, 필요할 때마다 하나씩 값을 생성하므로 메모리 효율적입니다. 이터레이터와 비교했을 때 대규모 데이터 처리에 더 유용합니다.

고급 사용 예제

제너레이터는 복잡한 로직과 결합되어 아주 효율적인 코드를 작성할 수 있습니다. 아래는 피보나치 수열을 제너레이터로 생성하는 예제입니다:


def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib_gen = fibonacci_generator()
for _ in range(10):
    print(next(fib_gen))
    

이 예제에서 fibonacci_generator는 무한 피보나치 수열을 생성하며, for 반복문이나 next() 함수를 통해 필요한 만큼의 값을 출력할 수 있습니다.

실전에서의 활용

이터레이터와 제너레이터는 특히 대규모 데이터 스트림을 처리하거나, 결과의 전체 리스트를 메모리에 저장할 필요 없이 한 번에 하나씩의 값을 생성하여 메모리 사용을 최적화할 필요가 있는 상황에서 자주 사용됩니다.

파일 읽기: 파일의 각 줄을 제너레이터로 읽어들여 더 큰 파일을 메모리 효율적으로 처리할 수 있습니다.


def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line.strip()

for line in read_large_file("large_file.txt"):
    print(line)
    

결론

이터레이터와 제너레이터는 파이썬의 매우 강력한 기능이며, 이들을 사용하면 복잡하고 많은 양의 데이터 처리를 메모리 효율적이면서도 가독성 좋게 수행할 수 있습니다. 이 두 개념을 잘 이해하고 적절히 활용하면, 보다 효율적이고 확장 가능한 코드 작성을 할 수 있을 것입니다.

이 강좌가 파이썬 이터레이터와 제너레이터의 이해를 깊게 도와주었기를 바랍니다. 앞으로의 파이썬 프로그래밍 여정에서 이 내용을 활용해 보세요.

파이썬 클로저와 데코레이터

파이썬 프로그래밍에서 클로저와 데코레이터는 고급 주제로 많은 초보자와 중급 개발자에게 혼란을 줄 수 있습니다. 이 강좌에서는 클로저와 데코레이터의 개념을 이해하고, 파이썬 코드에서 어떻게 활용할 수 있는지를 깊이 있게 설명하겠습니다.

클로저란 무엇인가?

클로저는 중첩 함수(내부 함수)를 사용할 때 생성되는 개념입니다. 내부 함수는 외부 함수의 지역 변수를 참조할 수 있으며, 외부 함수의 실행이 끝난 후에도 이러한 변수들을 기억하는 특징을 제공합니다. 이를 통해 내부 함수가 외부 함수의 맥락(context)을 ‘포획’할 수 있게 됩니다.

클로저의 기본 구조

클로저의 구조를 이해하기 위해 간단한 예제를 살펴보겠습니다:

def outer_function(message):
    def inner_function():
        print(message)
    return inner_function

closure = outer_function("안녕하세요, 클로저!")
closure()

위 코드에서 outer_function은 inner_function을 반환합니다. closure는 내부 함수인 inner_function을 참조하며, outer_function의 지역 변수 message에 접근할 수 있게 됩니다. 이때 message 변수는 외부 함수가 종료된 후에도 inner_function에서 접근 가능합니다.

클로저의 응용: 상태 유지

클로저는 함수가 인스턴스를 만들 수 있도록 하여 함수 사용의 유연성을 제공하며, 상태를 유지하고 싶을 때 유용합니다.

def counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter_instance = counter()
print(counter_instance())  # Output: 1
print(counter_instance())  # Output: 2

이 예제에서 increment 함수는 count 변수의 상태를 유지합니다. 이처럼 nonlocal 키워드는 내부 함수가 외부 함수의 변수에 대한 재할당을 할 수 있게 합니다.

데코레이터란 무엇인가?

데코레이터는 기존 함수에 추가적인 기능을 부여하는 강력한 도구입니다. 데코레이터는 함수를 인자로 받는 또 다른 함수로, 함수를 동적으로 변경하거나 확장할 수 있게 합니다.

데코레이터의 기본 구조

데코레이터는 함수를 인수로 받아서 새로운 함수를 반환하는 방식으로 작동합니다:

def simple_decorator(func):
    def wrapper():
        print("무언가를 수행하기 전에")
        func()
        print("무언가를 수행한 후에")
    return wrapper

def basic_function():
    print("나는 기본 함수입니다.")

decorated_function = simple_decorator(basic_function)
decorated_function()

이 코드는 basic_function을 감싸서 전처리와 후처리를 추가합니다.

파이썬 제공 데코레이터 @ 문법

파이썬에서는 함수에 직접 데코레이터를 적용하는 간단한 문법을 제공합니다. @ 기호를 사용하여 함수를 데코레이터로 감쌀 수 있습니다:

@simple_decorator
def another_function():
    print("나는 또 다른 함수입니다.")

another_function()

데코레이터의 실전 예제: 함수 실행 시간 측정

다음은 함수의 실행 시간을 측정하는 데코레이터의 실제 사례입니다:

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 함수 실행 시간: {end_time - start_time:.4f} 초")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(1)

slow_function()

위 예제에서는 timing_decorator가 slow_function의 실행 시간을 측정하여 출력합니다. 이렇게 함으로써 코드에 직접적으로 영향을 주지 않고도 함수의 동작을 확장할 수 있습니다.

클로저와 데코레이터의 결합

클로저와 데코레이터는 종종 함께 사용되어 강력하고 유연한 프로그램 구조를 만듭니다. 클로저는 데코레이터가 상태를 유지하거나 어떤 데이터에 지속적으로 접근할 수 있게 해줍니다.

결론

이번 강좌에서는 파이썬의 클로저와 데코레이터에 대해 알아보았습니다. 클로저는 함수가 외부 범위의 변수를 캡처하여 참조할 수 있는 능력을 제공하며, 데코레이터는 코드에서 함수를 감싸 확장하는 방법을 제공합니다. 이 두 주제를 잘 이해하면 더욱 효율적이고 강력한 파이썬 코드를 작성할 수 있게 됩니다.

06장 파이썬 프로그래밍, 어떻게 시작해야 할까?

파이썬은 현대 프로그래밍 세계에서 가장 인기 있는 프로그래밍 언어 중 하나로, 그 사용 범위와 응용 분야는 날이 갈수록 확장되고 있습니다. 초보자와 전문가 모두 쉽게 접근할 수 있는 이 언어는 간결함과 생산성을 중요시하는 개발자 사이에서 특히 매력적입니다. 이번 글에서는 파이썬 프로그래밍을 시작하기 위해 필요한 기본적인 정보와 단계별 가이드라인을 제공하겠습니다.

1. 파이썬이란 무엇인가?

파이썬은 Guido van Rossum이 1991년에 처음 발표한 고급 프로그래밍 언어로, 코드의 가독성과 간결함을 최우선으로 고려하여 설계되었습니다. 파이썬의 주요 철학 중 하나는 “가독성이 좋을수록 코드가 더 낫다”라는 것입니다. 이 때문에 파이썬은 다음과 같은 특징을 가지고 있습니다:

  • 쉽고 명확한 문법: 파이썬의 문법은 영어와 유사하여 초보자도 쉽게 배울 수 있습니다.
  • 광범위한 표준 라이브러리: 다양한 분야에 활용할 수 있는 라이브러리를 기본적으로 제공합니다.
  • 플랫폼 독립성: Windows, macOS, Linux 등 다양한 운영 체제에서 실행할 수 있습니다.
  • 느슨한 데이터 타입: 변수에 데이터 타입을 명시적으로 지정할 필요 없이 성격에 따라 다룰 수 있습니다.

2. 파이썬 설치하기

파이썬을 시작하기 위해 첫 번째 단계는 파이썬 인터프리터를 설치하는 것입니다. 설치 과정은 여러분의 운영 체제에 따라 약간씩 다를 수 있습니다. 아래의 단계를 따라 파이썬을 설치해 보세요.

Windows에 파이썬 설치하기

  1. 파이썬 공식 웹사이트로 이동하여 최신 버전을 다운로드합니다.
  2. 다운로드한 설치 파일을 실행하고, 설치 과정에서 “Add Python to PATH” 옵션을 꼭 선택합니다. 이 설정을 통해 명령 프롬프트에서 파이썬 명령어를 사용할 수 있습니다.
  3. 설치가 완료되면 “cmd” 창을 열고 python --version을 입력하여 설치가 정상적으로 완료되었는지 확인합니다.

macOS에 파이썬 설치하기

  1. macOS에는 기본적으로 파이썬이 설치되어 있습니다. 하지만 가장 최신 버전을 사용하기 위해 공식 웹사이트에서 최신 설치 프로그램을 다운로드하는 것이 좋습니다.
  2. 다운로드한 설치 파일을 실행하여 지시에 따라 설치합니다.
  3. 터미널을 열고 python3 --version을 입력하여 설치를 확인합니다.

Linux에 파이썬 설치하기

  1. 대부분의 Linux 배포판에는 기본적으로 파이썬이 설치되어 있습니다. 최신 버전을 설치하거나 업데이트하려면 터미널을 열고 sudo apt-get update와 sudo apt-get install python3 명령을 사용하세요.
  2. 설치가 완료되면 python3 --version을 통해 버전을 확인합니다.

3. 개발 환경 설정

파이썬 설치 후에는 코드를 작성하고 실행할 환경을 설정해야 합니다. 여러 가지 방법이 있지만, 대표적인 도구는 다음과 같습니다:

Python IDLE

Python IDLE은 파이썬과 함께 제공되는 기본 통합 개발 환경(IDE)으로, 가벼운 코드 편집 및 실행 환경을 제공합니다. 간단한 스크립트를 작성하고 실행하는 데 유용합니다.

Visual Studio Code

Visual Studio Code는 Microsoft에서 개발한 IDE로, 광범위한 플러그인 지원과 강력한 디버깅 도구를 제공합니다. 다양한 프로그래밍 언어를 지원하며, 파이썬 개발에도 많이 사용됩니다. Python 확장 플러그인을 설치하여 파이썬 프로그래밍을 시작하세요.

Jupyter Notebook

Jupyter Notebook은 데이터 과학과 머신러닝 프로젝트에 널리 사용되는 도구로, 코드와 설명, 시각화를 하나의 문서에서 결합할 수 있습니다. 설치하려면 pip install jupyter를 입력한 후 jupyter notebook 명령으로 실행합니다.

파이썬으로 하위 디렉터리 검색하기

파일과 디렉터리를 다루는 일은 프로그래밍에서 매우 흔합니다. 특히, 하위 디렉터리를 검색하는 것은 시스템 파일의 정리, 로그 파일의 분석 등 다양한 목적으로 사용됩니다. 이 강좌에서는 파이썬을 사용하여 하위 디렉터리를 효과적으로 검색하는 방법에 대해 자세히 알아보겠습니다.

파이썬은 파일과 디렉터리를 조작할 수 있는 여러 가지 라이브러리를 제공합니다. 이 글에서는 os 모듈과 glob 모듈, 그리고 pathlib 모듈을 사용하여 파이썬에서 하위 디렉터리를 검색하는 방법을 설명할 것입니다. 각 방법의 장단점을 비교하고, 최상의 사용 예제를 제시합니다.“` ### 1. Using the `os` Module “`html

os 모듈 사용하기

os 모듈은 운영체제와 상호작용할 수 있는 다양한 기능을 제공합니다. 이 모듈을 사용하면 파일과 디렉터리를 생성, 삭제, 변경할 수 있고, 파일의 경로와 속성, 권한 등을 조작할 수 있습니다. 특히, os.walk() 함수는 디렉터리 트리를 순회하면서 하위 디렉터리와 파일을 검색하는 데 유용합니다.

os.walk() 함수

os.walk() 함수는 루트 디렉터리부터 시작하여 모든 하위 디렉터리를 순회하면서 경로, 디렉터리명, 파일명을 가져옵니다. 함수의 반환 값은 튜플이며, 각 요소는 (디렉터리 경로, 디렉터리 내의 모든 하위 폴더 목록, 디렉터리 내의 모든 파일 목록)을 포함합니다.


import os

def search_subdirectories(root_dir):
    for dirpath, dirnames, filenames in os.walk(root_dir):
        print(f'현재 디렉터리 경로: {dirpath}')
        print(f'하위 디렉터리들: {dirnames}')
        print(f'파일들: {filenames}')
        print('---------------------')
        
search_subdirectories('/mnt/data')  # 검색할 루트 디렉터리의 경로를 지정하세요.

위 코드에서는 os.walk()를 사용하여 주어진 디렉터리의 모든 하위 디렉터리 및 파일을 출력합니다. 각 경로에 대해 현재 디렉터리, 하위 디렉터리 및 파일들을 콘솔에 출력합니다.

필터링 구현하기

대규모 디렉터리에서 특정 파일 확장자나 이름 패턴만 필요할 경우, 필터링을 통해 원하는 정보만 검색할 수 있습니다. 다음 코드는 사용자가 ‘.txt’ 파일만 검색할 수 있도록 필터링을 시연합니다.


def search_text_files(root_dir):
    for dirpath, dirnames, filenames in os.walk(root_dir):
        text_files = [f for f in filenames if f.endswith('.txt')]
        if text_files:
            print(f'{dirpath}에서 찾은 텍스트 파일: {text_files}')
        
search_text_files('/mnt/data')  # 검색할 디렉터리를 지정하세요.

위의 예에서는 ‘.txt’ 확장자를 가진 파일만 검색하여 출력합니다. 필요에 따라 다른 패턴이나 조건으로 필터링하여 유연하게 사용할 수 있습니다.“` ### 2. Using the `glob` Module “`html

glob 모듈 사용하기

glob 모듈은 유닉스 스타일의 경로 이름 패턴을 사용하여 파일을 검색할 수 있도록 합니다. 간단한 패턴 매칭을 통해 특정 확장자나 이름 패턴에 해당하는 파일을 쉽게 검색할 수 있습니다.

glob.glob() 함수

glob.glob() 함수는 지정한 패턴과 일치하는 모든 경로명을 반환합니다. 파이썬 3.5 이상에서는 ** 패턴을 사용하여 재귀적으로 하위 디렉터리를 검색할 수 있습니다.


import glob

def search_with_glob(pattern):
    files = glob.glob(pattern, recursive=True)
    for file in files:
        print(file)
        
search_with_glob('/mnt/data/**/*.txt')  # 하위 디렉터리까지 포함하여 모든 .txt 파일 검색

위 코드에서는 ** 패턴을 사용하여 모든 텍스트 파일을 대상 디렉터리 및 하위 디렉터리에서 검색합니다. glob 모듈은 사용이 간편하면서도 매우 강력한 파일 검색 기능을 제공합니다.“` ### Conclusion “`html

결론

이번 강좌에서는 파이썬을 사용하여 하위 디렉터리를 검색하는 방법을 배웠습니다. os.walk() 함수는 깊이 우선 탐색을 통한 디렉터리 트리 순회를 가능하게 하며, glob 모듈은 패턴 매칭을 통한 간단하고 강력한 파일 검색을 제공합니다. 각 방법은 사용 목적에 따라 선택하여 적용할 수 있습니다.

파이썬의 또 다른 파일 관련 모듈에는 pathlib가 있으며, 이 모듈은 객체 지향적인 접근 방식을 제공하여 파일 경로 조작을 더욱 직관적으로 수행할 수 있습니다. pathlib에 대해서는 별도의 강좌에서 다루도록 하겠습니다.

이 강좌를 통해 여러분이 파일 탐색 작업을 수행하는 데 필요한 기초와 팁을 얻으셨길 바랍니다. 추가 질문이 있거나 특정 사용 사례에 대해 논의하고 싶으신 경우 아래 댓글 섹션에 남겨주세요.