반복자 (Iterators)
Python의 반복자는 next() 함수를 사용하여 하나씩 반복할 수 있는 항목 모음입니다. 컬렉션을 반복자로 변환하려면 컬렉션을 iter() 함수에 전달해야 합니다. 다음으로, 반복자 객체를 next() 함수에 전달하여 반복자의 모든 항목을 반복할 수 있습니다. 다음 스크립트는 4개 항목이 있는 색상 목록에 대한 반복기를 만들고 4개 항목 모두를 반복합니다.
colors = ["Red", "Green", "Blue", "Orange"]
my_iterator = iter(colors)
print(next(my_iterator)) # 첫 번째 item = “Red”
print(next(my_iterator)) # 두 번째 item = “Green”
print(next(my_iterator)) # 세 번째 item = “Blue”
print(next(my_iterator)) # 네 번째 item = “Orange”
Output:
Red
Green
Blue
Orange
생성기 (Generator)
생성기는 반복자의 일종으로 아이템을 하나씩 반환합니다. 생성기를 사용하면 함수 호출마다 업데이트 된 값을 갖는 함수 내부에 변수를 생성할 수 있습니다. 여러 개의 데이터를 미리 만들어 놓지 않고 필요할 때마다 즉석해서 하나씩 만들어 내는 객체를 의미합니다.
생성기는 항목별로 대용량 파일을 읽는 데 주로 사용됩니다. 예를 들어, 메모리에 맞지 않는 거대한 CSV 파일이 있는 경우 생성기를 사용하여 파일을 한 줄씩 읽고 가져온 레코드에 일부 프로세스를 적용한 다음 다음 줄을 읽을 수 있습니다.
생성기는 일반 함수 정의처럼 def 키워드를 사용합니다. 그러나 생성기 내부에서 함수 호출과 함께 업데이트 된 값을 저장할 변수를 저장하려면 yield 키워드를 사용해야 합니다. yield 변수의 값은 next()함수를 호출하여 반환할 수 있습니다.
다음 스크립트는 일반 함수로 method()를 정의하고 리스트 변수에 값을 담고 반환하였습니다.
def method():
result = ['P', 'Q', 'R']
return result
method()
Output:
['P', 'Q', 'R']
다음 스크립트는 method() 생성기를 정의하고 함수 내에서 3번의 yield 키워드를 사용하여 변수를 생성하였습니다.
def method():
yield 'P'
yield 'Q'
yield 'R'
method()
Output:
<generator object method at 0x7fabec7b6f50>
다음 스크립트는 생성기에서 생성한 값을 하나씩 출력하는 예제입니다. next()함수를 한번 호출할 때마다 하나의 값이 출력됩니다.
def method():
yield 'P'
yield 'Q'
yield 'R'
result = method()
print(next(result))
print(next(result))
print(next(result))
다음 스크립트는 하나의 매개변수를 허용하는 get_evens() 생성기를 생성합니다. 메서드 내에서 변수 x의 값은 0으로 초기화됩니다. x가 num 매개변수보다 작으면 x 값이 생성된 다음 업데이트됩니다.
def get_num(num):
x = 0
while x < num:
yield x
x = x + 2
nums = get_num(10)
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
Output:
0
2
4
6
8
다음 스크립트는 엄청난 크기의 리스트를 생성하는 구문입니다. 이 구문을 실행하면 메모리 오류가 발생할 것입니다.
a = [i*i for i in range(100000000000000000)]
print(a[0])
다음 스크립트는 엄청난 범위의 값을 생성기로 출력한 예제입니다. 생성기는 엄청난 범위를 갖더라도 하나씩 생성하므로 메모리 오류가 발생하지 않습니다.
a = (i*i for i in range(100000000000000000))
print(next(a))
'프로그래밍 언어 > 파이썬 (Python)' 카테고리의 다른 글
[파이썬 학습] 모듈 (0) | 2022.02.09 |
---|---|
[파이썬 학습] 사용자 입력과 출력 및 파일 읽고 쓰기 (0) | 2022.02.08 |
[파이썬 학습] 람다함수와 재귀함수 (0) | 2022.02.05 |
[파이썬 학습] 함수 (0) | 2022.02.04 |
[파이썬 학습] 반복문 (while문과 for문) (0) | 2022.02.03 |