본문 바로가기

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() 메서드를 사용하여 정규식을 통해 문자열을 다른 문자열로 바꿀 수 있다.
  • *, + 등은 기본적으로 최대한 많이 매칭하려고 하지만, *?, +?+? 와 같은 방식으로 최소 매칭을 할 수도 있다.

혹시 이해가 어려우시다면, 이전 글을 먼저 참고해보시면 좋을 것 같습니다.

 

파이썬 활용 (1): 클래스, 모듈, 패키지, 예외처리

안녕하세요! 지난 글까지 파이썬 기초 부분을 다뤄보았습니다. 이번에는 파이썬을 좀 더 활용하여 효율적으로 사용할 수 있는 내용을 중점적으로 정리해보았습니다. 클래스, 모듈, 패키지, 예외

actshiny.com

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

 

 

 

 

 

반응형