🔥 Python yield
완벽 가이드: 반복문을 더 스마트하게!
안녕하세요! 😊
오늘은 Python의 강력한 기능 중 하나인 yield
키워드에 대해 쉽게 설명해볼게요. 처음 들으면 어렵게 느껴질 수 있지만, 천천히 따라오면 누구나 이해할 수 있어요! 🚀
🧐 yield
란 무엇인가?
Python에서 yield
는 함수를 멈췄다가 다시 실행할 수 있도록 만드는 마법 같은 키워드예요. 보통 함수는 return
을 만나면 값을 반환하고 종료되지만, yield
를 사용하면 함수를 멈춘 상태에서 나중에 다시 이어서 실행할 수 있어요! 🎩✨
예제를 보면 바로 이해될 거예요! 👇
def simple_yield():
yield 1
yield 2
yield 3
for value in simple_yield():
print(value)
📝 출력 결과:
1
2
3
이 함수는 값을 하나씩 yield
하면서 멈췄다가, for
반복문이 실행될 때마다 다음 값을 반환해요! 💡
🔍 yield
vs return
📌 return
은 함수가 값을 한 번만 반환하고 끝나요. 하지만 yield
는 값을 반환한 후에도 함수가 종료되지 않고 다음에 이어서 실행할 수 있어요.
✅ return
사용 예시
def simple_return():
return [1, 2, 3]
print(simple_return()) # [1, 2, 3]
🚀 한 번에 모든 값을 반환하고 끝!
✅ yield
사용 예시
def simple_yield():
yield 1
yield 2
yield 3
print(simple_yield()) # <generator object simple_yield at 0x...>
📌 simple_yield()
를 실행하면 generator
객체가 반환돼요. 값을 보려면 반복문을 사용해야 해요! 🔄
for value in simple_yield():
print(value)
🎯 yield
의 동작 원리
함수가 실행될 때 yield
를 만나면 함수가 멈추고 값을 반환해요. 그리고 다시 호출되면 멈췄던 곳에서 이어서 실행됩니다. 🎬
def generator_example():
print("🔄 시작!")
yield 1
print("🔄 중간!")
yield 2
print("🔄 끝!")
gen = generator_example()
print(next(gen)) # 🔄 시작! → 1 반환
print(next(gen)) # 🔄 중간! → 2 반환
print(next(gen)) # 🔄 끝! → StopIteration 예외 발생
📝 출력 결과:
🔄 시작!
1
🔄 중간!
2
🔄 끝!
Traceback (most recent call last):
...
StopIteration
📢 yield
는 next()
가 호출될 때마다 실행되고, 마지막까지 가면 StopIteration
예외가 발생해요!
⚡ yield
실전 활용 예제
📌 1. 메모리 절약! 큰 파일 한 줄씩 읽기 📄
def read_large_file(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.strip()
for line in read_large_file("large_file.txt"):
print(line) # 한 줄씩 출력됨
✅ 한꺼번에 파일을 읽지 않고 한 줄씩 가져오니까 메모리를 절약할 수 있어요!
📌 2. 무한 루프 가능! 카운터 만들기 🔢
def infinite_counter():
num = 0
while True:
yield num
num += 1
counter = infinite_counter()
for _ in range(5):
print(next(counter))
📝 출력 결과:
0
1
2
3
4
✅ 무한으로 증가하는 숫자를 생성할 수도 있어요!
📌 3. yield
로 트리 탐색하기 🌳
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def in_order_traversal(node):
if node is not None:
yield from in_order_traversal(node.left)
yield node.value
yield from in_order_traversal(node.right)
# 트리 구성
root = Node(10, Node(5, Node(2), Node(7)), Node(15, None, Node(20)))
for value in in_order_traversal(root):
print(value)
📝 출력 결과:
2
5
7
10
15
20
✅ 트리 데이터를 효율적으로 탐색할 수 있어요!
🚀 yield from
으로 더 쉽게 쓰기
Python 3.3부터 yield from
을 사용하면 중첩된 제너레이터를 더 쉽게 호출할 수 있어요! 🎉
def sub_generator():
yield 1
yield 2
def main_generator():
yield from sub_generator()
yield 3
for value in main_generator():
print(value)
📝 출력 결과:
1
2
3
✅ yield from
을 쓰면 제너레이터 안에서 또 다른 제너레이터를 호출할 때 간결해져요!
🎉 결론
Python의 yield
는 반복적인 데이터 생성, 메모리 효율적인 처리, 트리 탐색 등의 다양한 상황에서 유용하게 활용될 수 있어요. 🤓✨
🔹 yield
는 값을 반환하면서도 함수가 멈추지 않는다! 🔹 yield
를 쓰면 대량 데이터 처리 시 메모리를 절약할 수 있다! 🔹 yield from
을 사용하면 더 간결한 코드 작성이 가능하다!
지금 바로 yield
를 활용해보세요! 😆🔥