반응형
파이썬에서 "yield" 키워드의 작동 방식
파이썬에서 yield
키워드는 제너레이터 함수를 만드는 데 사용됩니다. 일반 함수가 단일 값을 반환하는 것과 달리 제너레이터 함수는 yield
를 사용하여 실행을 일시 중단하고 값을 하나씩 반환합니다. 이를 통해 대규모 데이터 세트나 무한 시퀀스를 처리할 때 메모리 효율성을 높일 수 있습니다.
주요 특징:
- 실행 일시 중단: 함수 내에서
yield
를 만나면 실행이 해당 지점에서 일시 중단되고 현재 값이 반환됩니다. 다시 시작하려면for
루프를 사용하여 제너레이터를 반복해야 합니다. 루프가 반복될 때마다 제너레이터는 중단된 지점부터 계속 실행되며, 다른yield
에 도달하여 또 다른 값을 반환할 수 있습니다. - 메모리 효율성: 리스트나 다른 데이터 구조가 모든 요소를 한 번에 저장하는 반면, 제너레이터는 필요에 따라 값만 생성합니다. 이를 통해 대규모 데이터 세트나 메모리에 저장하기 어려운 무한 시퀀스를 처리할 때 메모리 효율성을 높일 수 있습니다.
- 즉각 평가 vs. 지연 평가 (Eager vs. lazy evaluation): 일반 함수에서는 함수가 호출될 때 모든 계산이 수행됩니다. 그러나 제너레이터는 즉각 평가 또는 지연 평가를 사용할 수 있습니다. 즉각 평가에서는
yield
를 만날 때 값을 계산하고 즉시 반환합니다. 반면 지연 평가는 루프 내에서 값이 실제로 필요할 때까지 계산을 연기하여 메모리 사용량을 더욱 최적화합니다. - 구문:
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
- 사용 사례:
- 대규모 데이터 세트를 효율적으로 처리하기 (예: 큰 파일을 줄 단위로 읽기)
- 이터레이터 및 사용자 정의 이터러블 구현
- 비동기 프로그래밍을 위한 코루틴 생성
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
를 사용하는 몇 가지 방법을 보여줍니다.
반응형
댓글