프로그래밍/Python

Python yield

Terry Cho 2024. 8. 6. 01:43

`yield`는 Python에서 generator를 만드는 데 사용되는 키워드다. `yield`를 사용하면 함수의 실행을 일시 중지하고 값을 반환한 다음, 호출자가 필요할 때 실행을 재개할 수 있다. 이 기능을 사용하면 메모리를 효율적으로 사용하면서 큰 데이터 스트림을 처리할 수 있다. 이를 설명하기 위해 주어진 예제를 살펴보자.

def return_abc():
  print("From return_abc")
  return list("ABC")

def yield_abc():
  i=0
  for char in list("ABC"):
    yield(char)
    i +=1
    print(str(i) + " From yield_abc")

for ch in return_abc():
  print("Calling return_abc:"+ch)

print("="*5)
for ch in yield_abc():
  print("Calling yield_abc :"+ch)


이 코드는 두 개의 함수를 정의한다: `return_abc`와 `yield_abc`. 이 함수들은 모두 문자열 "ABC"의 문자를 하나씩 반환하지만, 동작 방식이 다르다.

1. `return_abc` 함수:
    - 리스트 `['A', 'B', 'C']`를 한 번에 반환한다.
    - `for` 루프에서 리스트의 각 요소를 순회하면서 출력한다.

2. `yield_abc` 함수:
    - generator를 반환한다.
    - `for` 루프 안에서 `yield` 키워드를 사용하여 하나씩 문자를 반환한다.
    - `yield`는 함수의 실행을 일시 중지하고 현재 값을 반환한 다음, 호출자가 다음 값을 요청할 때 실행을 재개한다.
    - 문자가 반환된 후에 루프 내에서 `i`가 증가하고, `i`의 값을 출력한다.

코드를 실행하면 다음과 같은 결과가 나타난다:

From return_abc
Calling return_abc:A
Calling return_abc:B
Calling return_abc:C
=====
Calling yield_abc :A
1 From yield_abc
Calling yield_abc :B
2 From yield_abc
Calling yield_abc :C
3 From yield_abc


출력 결과를 보면:

- `return_abc` 함수는 리스트 전체를 한 번에 반환하기 때문에 함수가 호출될 때 모든 문자를 출력한다.
- `yield_abc` 함수는 각 문자를 하나씩 반환하고 `yield`에 도달할 때마다 실행을 중지했다가, 다음 문자를 요청받으면 다시 실행을 재개한다. 각 문자를 반환한 후에 `i`를 증가시키고 출력한다.

따라서, `yield`를 사용하면 함수가 값을 하나씩 반환하면서 메모리를 효율적으로 사용할 수 있다. generator는 큰 데이터 집합을 처리할 때 특히 유용하다.