함수의 고급 활용
제너레이터 함수(Generator Functions)
제너레이터 함수(Generator Functions)는 파이썬에서 이터레이터(iterator)를 생성하는 함수이다. 이터레이터는 값을 한 번에 하나씩 반환하며, 필요한 만큼의 값을 생성하여 메모리를 효율적으로 관리할 수 있게 준다.
제너레이터 함수는 함수 본문에 yield 키워드를 사용하여 값을 반환하고 일시적으로 실행을 중단한 다음, 다음 호출에서 중단된 지점부터 다시 실행된다.
def my_generator():
yield 1
yield 2
yield 3
# 제너레이터 함수 호출 후 이터레이터 생성
my_iter = my_generator()
# 이터레이터에서 값 하나씩 추출
print(next(my_iter)) # 출력: 1
print(next(my_iter)) # 출력: 2
print(next(my_iter)) # 출력: 3
위 코드에서 my_generator 함수는 yield 키워드를 사용하여 값을 반환한다. my_generator 함수를 호출하여 이터레이터 my_iter를 생성한 후, next() 함수를 사용하여 이터레이터에서 값을 하나씩 추출한다. 제너레이터 함수는 실행 상태를 유지하고, yield 키워드에서 중단된 지점부터 다시 실행되어 값을 반환한다. 따라서 각 next() 함수 호출마다 다음 값을 생성하여 반환하게 된다.
제너레이터 함수는 메모리 사용을 최적화하면서도 필요한 값만 생성하여 사용할 수 있기 때문에 큰 데이터 세트를 처리하거나 연속적인 값을 생성해야 할 때 특히 유용하다. 또한, 제너레이터 함수를 사용하면 반복문과 함께 사용하여 간편하게 이터레이션(iteration)할 수도 있다.
def countdown(n):
while n > 0:
yield n
n -= 1
for i in countdown(5):
print(i)
# 출력:
# 5
# 4
# 3
# 2
# 1
위의 코드는 제너레이터 함수는 반복문과 함께 사용하는 코드로, countdown 제너레이터 함수는 입력된 숫자부터 1까지 카운트다운하는 값을 생성한다. 이때, 반복문에서 countdown(5)로 제너레이터를 생성하고, 각 숫자를 하나씩 출력한다.
이처럼 제너레이터 함수를 활용하면 데이터의 흐름을 효과적으로 제어하고 복잡한 연산을 수행할 수 있으며, 필요한 만큼의 값을 생성하며, 메모리를 절약하고 코드를 간결하게 유지할 수 있다.
모듈의 고급 활용
패키지와 모듈의 계층 구조
패키지는 모듈을 계층 구조로 구성하는 방법이다.
예를 들어, mypackage라는 패키지 안에 module1과 module2라는 모듈이 포함되도록 구성할 수 있다.
markdown
Copy code
mypackage/
__init__.py
module1.py
module2.py
__init__.py: 패키지 초기화 파일로, 비어있어도 된다.
module1.py: module1 모듈의 코드가 들어있는 파일이다.
module2.py: module2 모듈의 코드가 들어있는 파일이다.
이제 module1과 module2 모듈을 작성해본다.
# module1.py
def hello_module1():
print("Hello from module1!")
# module2.py
def hello_module2():
print("Hello from module2!")
패키지를 사용하는 스크립트에서는 다음과 같이 패키지와 모듈을 임포트하여 사용할 수 있다.
# main.py
from mypackage import module1, module2
module1.hello_module1()
module2.hello_module2()
실행 결과
Hello from module1!
Hello from module2!
내장 모듈과 외부 모듈
파이썬은 표준 라이브러리로 다양한 내장 모듈을 제공한다. 이러한 내장 모듈은 별도의 설치 없이 사용할 수 있지만, 외부 모듈은 파이썬 패키지 관리자(pip)를 사용하여 설치해야 한다.
datetime 모듈을 사용하여 현재 날짜와 시간을 가져올 수 있다.
import datetime
current_date = datetime.date.today()
current_time = datetime.datetime.now().time()
print("Current Date:", current_date)
print("Current Time:", current_time)
실행 결과
Current Date: 2023-06-10
Current Time: 14:30:00.123456
모듈의 문서화
모듈의 문서화는 코드 외부에 부가적인 정보를 제공하는데 사용된다. 일반적으로 문서화는 docstring 형태로 작성되며, 모듈, 클래스, 함수 등의 설명과 사용 방법을 기술한다. 예를 들어 math 모듈의 sqrt 함수에 대한 문서화 할 수 있다.
import math
print(math.sqrt.__doc__)
실행 결과
sqrt(x)
Return the square root of x.
모듈의 임포트 방식
모듈을 임포트하는 방식에는 다양한 방법이 있다. import 문을 사용하는 것 외에도 from ... import ... 문, import ... as ... 문, importlib 모듈을 사용한 동적 임포트 등을 활용할 수 있다.
모듈 전체를 임포트
import math
result = math.sqrt(16)
print(result)
특정 함수만 임포트
from math import sqrt
result = sqrt(16)
print(result)
모듈을 별칭으로 임포트
import math as m
result = m.sqrt(16)
print(result)
동적 임포트
import importlib
module_name = "math"
module = importlib.import_module(module_name)
result = module.sqrt(16)
print(result)