파이썬 - 생성자: 초보자를 위한 부드러운 소개
안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘, 우리는 파이썬 생성자의 세계로 흥미진진한 여행을 떠날 거예요. 이전에 들어본 적이 없다고 해도 걱정 마세요 - 우리는 맨 처음부터 시작하여 점차 상승하겠습니다. 이 튜토리얼을 끝내면, 여러분도 전문가처럼 생성자를 만들어볼 수 있을 거예요!
파이썬 생성자는 무엇인가요?
아주 긴 책을 읽고 있다고 상상해봅시다. 전체 책을 한 번에 복제하는 것보다 (많은 셔츠를 낭비할 수 있죠!), 한 페이지씩 읽는 것이 좋죠. 이런 식으로 파이썬에서 생성자는 작동합니다!
생성자는 우리가 한 번에 모든 값을 계산하고 메모리에 저장하는 대신, 시간이 지남에 따라 값을 생성할 수 있는 특별한 함수입니다. 그들은 필요할 때마다 값을 생산하는 마법의 공장과 같아요.
왜 생성자를 사용하나요?
- 메모리 효율성: 생성자는 메모리에 친화적입니다. 모든 값을 한 번에 저장하지 않습니다.
- 성능: 특히 큰 데이터셋을 다룰 때 코드의 성능을 향상시킬 수 있습니다.
- 간단성: 생성자는 코드를 더 깔끔하고 읽기 쉽게 만들 수 있습니다.
그럼, 어떻게 작동하는지 살펴보죠!
생성자 만들기
파이썬에서 생성자를 만드는 두 가지 주요 방법이 있습니다:
- 생성자 함수 사용
- 생성자 표현식 사용
생성자 함수
생성자 함수는 일반 함수와 마치 같지만, return
키워드 대신 yield
를 사용합니다. 다음은 간단한 예제입니다:
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
# 생성자 사용
for number in count_up_to(5):
print(number)
출력:
1
2
3
4
5
이 예제에서, count_up_to
는 생성자 함수입니다. 함수는 값을 전달할 때마다 실행을 일시 중지하고 상태를 기억합니다. 다음에 호출될 때는 멈춘 곳에서 다시 시작합니다.
생성자 표현식
생성자 표현식은 리스트 컴프리헨션과 비슷하지만, 꺾쇠괄호 대신 괄호를 사용합니다. 이는 생성자를 간결하게 만드는 방법입니다. 다음은 예제입니다:
# 생성자 표현식
squares = (x**2 for x in range(5))
# 생성자 사용
for square in squares:
print(square)
출력:
0
1
4
9
16
이 생성자 표현식은 순간에 제공되는 제곱된 숫자 시퀀스를 만듭니다. 모든 값을 메모리에 저장하지 않습니다.
생성자에서 예외 처리
생성자는 예외를 처리할 수도 있습니다. 정말 멋질 것 같죠! 다음은 예제입니다:
def div_generator(a, b):
try:
result = a / b
yield result
except ZeroDivisionError:
yield "0으로 나눌 수 없습니다!"
# 생성자 사용
g = div_generator(10, 2)
print(next(g)) # 출력: 5.0
g = div_generator(10, 0)
print(next(g)) # 출력: 0으로 나눌 수 없습니다!
이 예제에서, 우리의 생성자는 0으로 나누는 경우를 우아하게 처리합니다.
일반 함수 vs 생성자 함수
일반 함수와 생성자 함수의 차이를 비교해보겠습니다:
# 일반 함수
def get_squares(n):
squares = []
for i in range(n):
squares.append(i**2)
return squares
# 생성자 함수
def gen_squares(n):
for i in range(n):
yield i**2
# 일반 함수 사용
print(get_squares(5)) # 출력: [0, 1, 4, 9, 16]
# 생성자 함수 사용
for square in gen_squares(5):
print(square) # 각 제곱수를 새 줄에 출력
주요 차이점은 다음과 같습니다:
- 메모리 사용: 일반 함수는 모든 값을 한 번에 만들고 저장하지만, 생성자는 하나씩 생성합니다.
- 문법: 일반 함수는
return
를 사용하지만, 생성자는yield
를 사용합니다. - 반복: 생성자는 직접 반복할 수 있지만, 일반 함수의 결과는 변수에 저장해야 합니다.
비동기 생성자
파이썬 3.6에서 비동기 생성자가 도입되었습니다. 이는 일반 생성자와 비슷하지만, 비동기 프로그래밍을 위한 것입니다. async def
와 yield
를 사용합니다:
import asyncio
async def async_gen():
for i in range(3):
await asyncio.sleep(1)
yield i
async def main():
async for item in async_gen():
print(item)
asyncio.run(main())
이 예제는 비동기 작업을 시뮬레이션하여 시간이 지남에 따라 값을 제공합니다.
생성자 메서드
생성자는 몇 가지 특별한 메서드를 가지고 있어서 매우 유용할 수 있습니다. 여기 가장 일반적인 몇 가지를 표로 정리해보겠습니다:
메서드 | 설명 |
---|---|
next() |
생성자에서 다음 항목을 가져옵니다 |
send() |
생성자에 값을 보냅니다 |
throw() |
생성자 내에서 예외를 발생시킵니다 |
close() |
생성자를 닫습니다 |
send()
를 사용하는 빠른 예제를 보여드리겠습니다:
def echo_generator():
while True:
received = yield
print(f"받음: {received}")
g = echo_generator()
next(g) # 생성자를 초기화
g.send("안녕") # 출력: 받음: 안녕
g.send("세상") # 출력: 받음: 세상
그리고 그렇게 끝! 여러분은 파이썬 생성자의 놀라운 세계로 첫 걸음을 내딛었습니다. 기억해요, 연습이 실력을 만든다는 말이 있습니다. 이 개념들을 실험해보세요. 알지 못하게 될 때까지, 여러분은 파이썬 프로그램에서 다양한 흥미로운 문제를 해결하기 위해 생성자를 사용하게 될 거예요. 코딩을 즐겁게!
Credits: Image by storyset