🚀 이제 return만 쓰지 마세요! Python yield가 답입니다

🔥 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

📢 yieldnext()가 호출될 때마다 실행되고, 마지막까지 가면 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를 활용해보세요! 😆🔥