Python yield
`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는 큰 데이터 집합을 처리할 때 특히 유용하다.