본문 바로가기
프로그래밍 언어/Python

파이썬 yield 키워드란? yield 키워드 사용방법

by pagehit 2024. 2. 22.
반응형

파이썬에서 "yield" 키워드의 작동 방식

파이썬에서 yield 키워드는 제너레이터 함수를 만드는 데 사용됩니다. 일반 함수가 단일 값을 반환하는 것과 달리 제너레이터 함수는 yield를 사용하여 실행을 일시 중단하고 값을 하나씩 반환합니다. 이를 통해 대규모 데이터 세트나 무한 시퀀스를 처리할 때 메모리 효율성을 높일 수 있습니다.

주요 특징:

  1. 실행 일시 중단: 함수 내에서 yield를 만나면 실행이 해당 지점에서 일시 중단되고 현재 값이 반환됩니다. 다시 시작하려면 for 루프를 사용하여 제너레이터를 반복해야 합니다. 루프가 반복될 때마다 제너레이터는 중단된 지점부터 계속 실행되며, 다른 yield에 도달하여 또 다른 값을 반환할 수 있습니다.
  2. 메모리 효율성: 리스트나 다른 데이터 구조가 모든 요소를 한 번에 저장하는 반면, 제너레이터는 필요에 따라 값만 생성합니다. 이를 통해 대규모 데이터 세트나 메모리에 저장하기 어려운 무한 시퀀스를 처리할 때 메모리 효율성을 높일 수 있습니다.
  3. 즉각 평가 vs. 지연 평가 (Eager vs. lazy evaluation): 일반 함수에서는 함수가 호출될 때 모든 계산이 수행됩니다. 그러나 제너레이터는 즉각 평가 또는 지연 평가를 사용할 수 있습니다. 즉각 평가에서는 yield를 만날 때 값을 계산하고 즉시 반환합니다. 반면 지연 평가는 루프 내에서 값이 실제로 필요할 때까지 계산을 연기하여 메모리 사용량을 더욱 최적화합니다.
  4. 구문:
def my_generator():
    for i in range(5):
        yield i * 2  # Pause and return doubled value

numbers = my_generator()  # Get a generator object
for num in numbers:       # Iterate over the generator
    print(num)             # Will print: 0, 2, 4, 6, 8
  1. 사용 사례:
  • 대규모 데이터 세트를 효율적으로 처리하기 (예: 큰 파일을 줄 단위로 읽기)
  • 이터레이터 및 사용자 정의 이터러블 구현
  • 비동기 프로그래밍을 위한 코루틴 생성
  1. return과 비교:
  • return은 함수를 종료하고 단일 값을 반환합니다.
  • yield는 함수를 일시 중단하고 필요에 따라 여러 값을 반환할 수 있습니다.

결론:

yield를 이해하면 파이썬에서 메모리 효율적이고 유연한 데이터 제너레이터를 만들 수 있으며, 이를 통해 대규모 데이터 세트와 이터러블을 효과적으로 처리할 수 있습니다.

yield를 사용하는 파이썬 코드 예시

다음은 yield를 사용하는 다양한 파이썬 코드 예시입니다.

1. 기본 예시:

def my_generator():
    yield 1
    yield 2
    yield 3

for num in my_generator():
    print(num)

출력:

1
2
3

설명:

  • my_generator 함수는 3개의 값 (1, 2, 3)을 yield를 사용하여 반환합니다.
  • for 루프는 my_generator 함수에서 반환된 값을 하나씩 반복하고 출력합니다.

2. 팩토리얼 계산:

def factorial(n):
    if n == 0:
        yield 1
    else:
        yield n * factorial(n - 1)

for i in range(5):
    print(f"{i}! = {factorial(i)}")

출력:

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24

설명:

  • factorial 함수는 재귀적으로 팩토리얼을 계산합니다.
  • yield를 사용하여 계산 과정에서 중간 값을 반환합니다.
  • for 루프는 0부터 4까지 팩토리얼 값을 계산하고 출력합니다.

3. 무한 시퀀스 생성:

def infinite_sequence():
    n = 0
    while True:
        yield n
        n += 1

for num in infinite_sequence():
    if num > 10:
        break
    print(num)

출력:

0
1
2
3
4
5
6
7
8
9
10

설명:

  • infinite_sequence 함수는 무한 시퀀스를 생성합니다.
  • yield를 사용하여 시퀀스의 각 값을 반환합니다.
  • for 루프는 10까지 시퀀스 값을 출력합니다.

4. 파일 읽기:

def read_file(filename):
    with open(filename) as f:
        for line in f:
            yield line.strip()

for line in read_file("my_file.txt"):
    print(line)

설명:

  • read_file 함수는 파일을 읽고 각 줄을 yield를 사용하여 반환합니다.
  • for 루프는 파일의 각 줄을 읽고 출력합니다.

5. 사용자 정의 이터레이터:

class MyIterable:
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        for i in range(self.start, self.end + 1):
            yield i

for num in MyIterable(1, 5):
    print(num)

출력:

1
2
3
4
5

설명:

  • MyIterable 클래스는 사용자 정의 이터레이터를 구현합니다.
  • __iter__ 메서드는 yield를 사용하여 이터레이터의 값을 반환합니다.
  • for 루프는 MyIterable 객체의 값을 반복하고 출력합니다.

결론:

yield는 다양한 상황에서 유용한 기능입니다. 위 예시들은 yield를 사용하는 몇 가지 방법을 보여줍니다.

반응형

댓글