본문 바로가기
IT & AI/AI 지식

파이썬 활용 (2): 클로저, 제너레이터, 정규 표현식

by 빛나는해커 2024. 11. 15.

1. 실전 함수 만들기 (프로그램 활용)

  • 3과 5의 배수를 모두 더하는 문제는 기본적인 알고리즘 구현 능력을 키우는 데 도움이 된다.
  • 예를 들어, 1부터 999까지의 수 중 3 또는 5의 배수를 모두 더하는 프로그램을 작성할 수 있다.
# 3과 5의 배수를 모두 더하기 예시
total = sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0)
print(total)  # 출력: 233168
  • 게시판에서 한 페이지에 게시물을 몇 개씩 보여줄지를 결정하는 페이징 기능을 구현해 본다.
  • 예를 들어, 총 50개의 게시물을 10개씩 나누어 페이지 수를 계산할 수 있다.
# 게시판 페이징 예시
def get_total_pages(total_items, items_per_page):
    return (total_items + items_per_page - 1) // items_per_page

print(get_total_pages(50, 10))  # 출력: 5
  • 텍스트 파일에 간단한 내용을 저장하고 읽어 들이는 메모장을 만든다.
  • 이를 통해 파일 입출력의 기본을 배울 수 있다.
# 간단한 메모장 예시
with open("memo.txt", "w") as f:
    f.write("이것은 메모장입니다.")

with open("memo.txt", "r") as f:
    content = f.read()
    print(content)  # 출력: 이것은 메모장입니다.
  • 탭 문자를 공백 문자 4개로 변경하는 간단한 변환 프로그램을 작성한다.
  • 이를 통해 문자열의 기본적인 처리를 배울 수 있다.
# 탭을 공백 4개로 바꾸기 예시
text = "Hello\tWorld"
converted_text = text.replace("\t", " " * 4)
print(converted_text)  # 출력: Hello    World
  • 지정된 디렉터리 아래의 모든 파일을 검색하는 프로그램을 작성한다.
  • 이를 통해 파일 시스템을 탐색하는 방법을 배울 수 있다.
# 하위 디렉터리 검색 예시
import os

def search_subdirectories(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            print(os.path.join(root, file))

search_subdirectories(".")

2. 파이썬과 유니코드

  • 아스키코드는 최초의 문자 셋으로 영어 알파벳과 일부 특수 문자를 표현한다.
  • 이는 총 128개의 문자로 구성되어 있다.
  • 유니코드는 아스키코드의 한계를 극복하고 다양한 언어의 문자를 표현하기 위해 등장했다.
  • 유니코드는 전 세계의 거의 모든 문자를 표현할 수 있다.
  • 파이썬에서는 유니코드 문자열을 기본으로 지원하며, str 타입은 유니코드로 다룬다.
# 유니코드 문자열 예시
text = "안녕하세요"
print(text)  # 출력: 안녕하세요

3. 클로저(Closer)와 데코레이터(Decorator)

  • 클로저는 함수 내부에 정의된 함수를 의미하며, 외부 함수의 변수를 참조하는 함수를 클로저라고 한다.
  • 클로저는 함수의 상태를 유지하면서 함수를 사용할 수 있게 해 준다.
# 클로저 예시
def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function

closure = outer_function("안녕하세요")
closure()  # 출력: 안녕하세요
  • 데코레이터는 함수를 감싸는 함수로, 기존 함수의 기능을 변경하거나 확장하는 데 사용된다.
  • 데코레이터를 사용하면 코드의 중복을 줄이고 기능을 쉽게 확장할 수 있다.
# 데코레이터 예시
def decorator_function(original_function):
    def wrapper_function():
        print("함수가 호출되기 전입니다.")
        original_function()
        print("함수가 호출된 후입니다.")
    return wrapper_function

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

say_hello()

4. 이터레이터(Iterator)와 제너레이터(Generator)

  • 이터레이터는 반복 가능한 객체를 의미하며, __iter__()와 __next__() 메서드를 통해 순차적으로 값을 반환한다.
  • 클래스를 통해 직접 이터레이터를 만들 수 있다.
# 이터레이터 만들기 예시
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, 3)
for count in counter:
    print(count)  # 출력: 1, 2, 3
  • 제너레이터는 yield 키워드를 사용하여 값을 하나씩 반환하는 함수이다.
  • 이터레이터보다 간단하게 반복 작업을 구현할 수 있다.
# 제너레이터 예시
def my_generator():
    yield 1
    yield 2
    yield 3

for value in my_generator():
    print(value)  # 출력: 1, 2, 3
  • 제너레이터 표현식을 사용하면 메모리를 절약하면서 간단하게 반복 작업을 수행할 수 있다.
# 제너레이터 표현식 예시
gen_exp = (x ** 2 for x in range(5))
for num in gen_exp:
    print(num)  # 출력: 0, 1, 4, 9, 16

5. 파이썬 타입 어노테이션

  • 파이썬은 동적 타이핑 언어이다.
  • 변수의 타입을 명시적으로 선언하지 않아도 된다.
  • 반면에 정적 언어는 변수의 타입을 미리 선언해야 한다.
  • 파이썬 3.5부터 타입 어노테이션을 지원하여, 함수나 변수의 타입을 명시적으로 지정할 수 있다.
  • 이를 통해 코드의 가독성을 높이고, 오류를 줄이는 데 도움이 된다.
# 타입 어노테이션 예시
def add_numbers(a: int, b: int) -> int:
    return a + b

print(add_numbers(3, 5))  # 출력: 8

6. 정규 표현식

  • 정규 표현식은 문자열에서 특정 패턴을 찾거나, 대체하는 작업을 쉽게 처리하기 위해 필요하다.
  • 이를 통해 복잡한 문자열 처리를 간단하게 수행할 수 있다.
  • 정규 표현식의 기초인 메타 문자와 파이썬의 re 모듈을 사용해 본다.
  • 메타 문자는.(임의 문자), *(0개 이상의 반복), +(1개 이상의 반복) 등이 있다.
  • 파이썬에서는 re 모듈을 사용하여 정규 표현식을 지원한다.
# re 모듈 사용 예시
import re

pattern = r"ab*"
text = "abbb abb aab"
matches = re.findall(pattern, text)
print(matches)  # 출력: ['abbb', 'abb']
  • match(), search(), findall() 메서드를 사용해 문자열에서 패턴을 찾을 수 있다.
  • group(), start(), end() 등을 사용하여 매칭된 문자열의 정보를 얻을 수 있다.
  • 정규식을 컴파일할 때 re.IGNORECASE, re.MULTILINE 등의 옵션을 줄 수 있다.
  • 정규식에서 역슬래시(\)를 사용할 때 파이썬 문자열에서 두 번 사용해야 하는 문제를 해결하기 위해 raw string(r"...")을 사용한다.
  • (?=...), (?!...) 등의 메타 문자를 사용하여 문자열을 소비하지 않고도 패턴을 검색할 수 있다.
  • ()를 사용하여 부분 문자열을 그룹으로 묶고, group() 메서드를 통해 그룹화된 문자열을 참조할 수 있다.
  • 전방 탐색은 특정 패턴 앞이나 뒤에 있는 문자열을 찾는 데 사용된다.
  • sub() 메서드를 사용하여 정규식을 통해 문자열을 다른 문자열로 바꿀 수 있다.
  • *, + 등은 기본적으로 최대한 많이 매칭하려고 하지만, *?, +?+? 와 같은 방식으로 최소 매칭을 할 수도 있다.

파이썬 활용 및 심화 소개 이미지