English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Python 참조 매뉴얼
파이썬의 이터레이터는 무엇인가요?
이터레이터는 파이썬에서 어디서나 존재합니다. 그들은 for 루프, comprehension, generator 등에서 우아하게 구현되지만, 눈에 띄지 않게 있습니다.파이썬의 이터레이터는 단순히 반복할 수 있는 객체입니다.객체
다음은 데이터를 한 개의 요소씩 반환하는 객체입니다. 기술적으로, 파이썬이터레이터 객체이를 통해 __iter__()와 __next__()라는 두 개의 특수 메서드를 구현해야 합니다. 이 두 메서드는。
이터레이터 프로토콜반복 가능한 객체에서 이터레이터를 얻을 수 있다면, 이 객체는반복. 파이썬에서 대부분의 내장 컨테이너(예:list,tuple,string등)은 반복 가능합니다.
iter() function (or __iter__() method) returns an iterator from them.
we use the next() function to manually traverse all items of the iterator. When we reach the end and there is no more data to return, it will raise StopIteration. Here is an example...
# 목록을 정의합니다 my_list = [4, 7, 0, 3] # iter()를 사용하여 이터레이터를 얻습니다 my_iter = iter(my_list) ## iter()를 사용하여 이터레이터를 얻습니다 #출력 4 print(next(my_iter)) #출력 7 print(next(my_iter)) ## next(obj)와 obj.__next__()는 같습니다 #출력 0 print(my_iter.__next__()) #출력 3 print(my_iter.__next__()) ## 이는 더 이상 요소가 없다는 오류를 일으킵니다 next(my_iter)
자동 반복을 더 우아하게 할 수 있는 방법은 다음과 같습니다.for 루프이 방법을 사용하면, 예를 들어 목록, 문자열, 파일 등 반복 가능한 모든 객체를 반복할 수 있습니다.
>>> for element in my_list: ... print(element) ... 4 7 0 3
위의 예제에서 보았듯이, for 루프는 자동으로 목록을 반복할 수 있습니다.
실제로 for 루프는 어떤 상대적으로 가능한 모든 반복 가능한 객체를 반복할 수 있습니다. 파이썬에서 for 루프가 어떻게 실제로 반복을 구현하는지 자세히 보도록 하겠습니다.
for element in iterable: # 요소에 대해 무엇인가를 수행
그러나 실제로는 이렇게 구현됩니다.
# 이터레이블 객체 iterable을 생성 iter_obj = iter(iterable) # 무한 루프 while True: try: # 다음 항목을 가져오기 element = next(iter_obj) # 요소에 대해 무엇인가를 수행 except StopIteration: # StopIteration가 발생하면 루프에서 벗어나기 break
따라서, 내부에서 for 루프는 iterable에 iter()를 호출하여 이터레이터 객체 iter_obj를 생성합니다.
ironically, this for loop is actually infinitewhile 루프。
루프 내에서, 그는 next()를 호출하여 다음 요소를 가져오고 이 값을 사용하여 for 루프의 주체를 실행합니다. 모든 항목이 끝났을 때, StopIteration가 투척되고 내부에서 잡혀서 루프가 끝납니다. 주의하십시오, 다른 모든 유형의 예외는 통과합니다.
Python에서 이터레이터를 처음부터 구축하는 것은 쉽습니다. 우리는 단지 이 메서드 __iter__()와 __next__()를 구현하면 됩니다.
__iter__() 메서드는 이터레이터 객체 자체를 반환합니다. 필요하다면 초기화를 수행할 수 있습니다.
__next__() 메서드는 시퀀스의 다음 항목을 반환해야 합니다. 끝에 도달했을 때以及在 그 이후의 호출에서, 그는 StopIteration를 발생시켜야 합니다.
여기서, 우리는 예제를 보여주고 있습니다. 이 예제는 반복마다 우리에게2의 지수. 지수는 0에서 사용자가 설정한 숫자까지입니다.
class PowTwo: """이터레이터 클래스를 구현하는 것" 2의 幂""" def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration
지금, 우리는 이터레이터를 생성하고 다음과 같이 반복할 수 있습니다.
>>> a = PowTwo(4) >>> i = iter(a) >>> next(i) 1 >>> next(i) 2 >>> next(i) 4 >>> next(i) 8 >>> next(i) 16 >>> next(i) Traceback (most recent call last): ... StopIteration
우리는 또한 for 루프를 사용하여 이터레이터 클래스를 반복할 수 있습니다.
>>> for i in PowTwo(5): ... print(i) ... 1 2 4 8 16 32
이터레이터 객체의 항목은 결코 소비되지 않습니다. 무한한 이터레이터(결코 끝나지 않는)가 있을 수 있습니다. 이러한 이터레이터를 처리할 때는 주의해야 합니다。
이는 무한 이터레이터를 보여주는 간단한 예제입니다。
내장 함수 iter()은 두 개의 매개변수를 호출할 수 있습니다. 첫 번째 매개변수는 호출할 수 있는 객체(함수)여야 하며 두 번째 매개변수는 표시자입니다. 이터레이터는 이 함수를 호출하여 반환 값이 표시자 값과 일치하는까지 호출합니다。
>>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0
int() 함수는 항상 0을 반환합니다. 따라서 iter(int,1)전달은 int() 함수를 호출하는 이터레이터를 반환합니다. 그런 다음 return 값이1이는 결코 일어나지 않으며 무한 이터레이터를 얻습니다。
우리는 또한 자신의 무한 이터레이터를 구축할 수 있습니다. 이론적으로 다음 이터레이터는 모든奇수를 반환합니다。
class InfIter: """무한 이터레이터는 모든 초기奇数""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num
실행 결과는 다음과 같습니다。
>>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7
等等...
이러한 유형의 무한 이터레이터에서 반복을 수행할 때는 종료 조건을 주의해야 합니다。
이터레이터 사용의 장점은 자원을 절약합니다. 위와 같이 모든奇수를 메모리에 저장하지 않고도 모든奇수를 얻을 수 있습니다. 이론적으로는 제한된 메모리에서 무한한 항목을 포함할 수 있습니다。
이터레이터는 또한我们的 코드가 매우 예쁘게 보이게 합니다。
파이썬에서 이터레이터를 생성하는 간단한 방법이 있습니다. 더 많은 정보를 얻으려면 다음 사이트를 방문하세요:파이썬 제너레이터 yield。