Python Iterator와 Iterable의 차이점은 무엇입니까?


대답 1:

반복자

  1. Iterator는 내부 상태 변수를 통해 반복 횟수를 기억하는 객체입니다 .Iterator는 내부 상태 변수를 통한 반복 횟수를 기억하는 객체입니다. 반복이 마지막 항목을 통과 할 때이 변수를 0으로 다시 설정하는 것은 없습니다. . some_list = [1, 2]
    iterator_of_some_list = iter (some_list)
    iterator_of_some_list에서 i의 경우 :
        인쇄 (i)
    iterator_of_some_list에서 j의 경우 : # 작동하지 않습니다
        인쇄 (j)

    #하지만
    some_list에서 k의 경우 :
     인쇄 (k)
    some_list에서 l의 경우 : # works
     인쇄 (l)
    또한 반복자의 iter () 메소드가 자체를 리턴하기 때문입니다 (상태를 기억하는 데 필수적 임).

이터 러블

  1. 반복은 여러 번 반복 할 수있는 객체입니다. 반복은 이미 반복자에서 수행되므로 반복자의 다중 반복 기능은 다중 반복자 인스턴스화로 구현됩니다. some_list = [1, 2]

    some_list에서 k의 경우 :
        some_list에서 l의 경우 :
            인쇄 (l, k)
    -“for k…”는 iter (some_list)를 호출합니다. iter ()는 iterable에서 __iter __ ()를 호출하여 iterator 객체 (반복 가능한 객체 데이터 포함)를 반환합니다.-“for l…”는 다시 iter (some_list)를 호출하고 새로운 반복자 인스턴스가 제공됩니다-반복자 객체 모두 루프 상태를 독립적으로 추적합니다 .DRY 원칙은 단순히 반복자 (__iter __ () 메소드를 구현하여 반복자 인스턴스를 반환 함) 반복자 객체의 반복자 객체 기능을 반복적으로 재사용합니다. Iterables는 메모리에 상주하는 데이터 구조를 가리 키므로 zeroIterators 객체에서 시작하는 순차적 인덱스를 취할 수있는 __getitem __ () 메소드와 같은 메소드를 구현합니다. 예를 들어 메모리의 데이터 구조에 대한 포인터를 항상 보유 할 필요는 없습니다. 다음 값으로 느리게로드 된 발전기의 경우. 이로 인해 수퍼 쿨 퍼포먼스가 향상되고 큰 인기를 얻는 주된 이유입니다.

대답 2:

이터 러블 :

__getitem __ (인덱스)

문자열 = "abc"
문자열의 문자 :
    인쇄 문자
  1. 인덱스 0으로 시작하십시오. 문자열 .__ getitem __ (index) IndexError 발생? loopIncrement 인덱스의 StopRun 본문, 2로 돌아 가기
MySequence 클래스 :
    데프 __getitem __ (자체, 색인) :
        색인> 10 인 경우 :
            IndexError ( "충분하다!")
        반환 값 * 10

반복자가 필요한 이유는 무엇입니까?

Bulat Bochkariov의 답변

 확장 가능한 반복자 인터페이스를 제공합니다.

iter (객체)

__iter __ ()

  1. 객체의 다음 항목을 반환하거나 StopIteration을 발생시켜 iteration의 끝을 알리는 next () 메소드 (python 3에서 __next __ ()로 이름 변경) [b]. self를 리턴하는 __iter __ () 메소드.
  • 반복자에는 __iter __ (또는 __getitem__)가 있어야하지만 반복자는 __iter__와 함께 다음에 있어야합니다. 반복의 시맨틱은 전자의 것만 있지만 후자는 반복 가능한 것처럼 동작해야 for-loop가 반복자를 실행할 수 있습니다.

 성능 향상으로 반복을 나열 할 수 있습니다.

사전 반복에 큰 성능 향상을 허용합니다

dict.keys ()의 키 :
    인쇄 키
dict.iterkeys ()의 키 :
    인쇄 키

dict의 키를 위해

요소에 대한 임의 액세스를 제공하지 않고 반복을위한 인터페이스를 제공 할 수 있습니다.

{__getitem__, keys, values, items}의 서브 세트 만 구현하는 맵핑을 포함하여 시퀀스 및 맵핑을 에뮬레이트하는 기존의 모든 사용자 정의 클래스 및 확장 오브젝트와 역 호환됩니다.

비 시퀀스 컬렉션에 대한 코드 반복을보다 간결하고 읽기 쉽게 만듭니다.

dict에 키가있는 경우 :

dict.has_key (k) 인 경우 :

__next __ ()에 대한 논거 : 많은 반복자가 루프 for 루프에서 사용되지만 사용자 코드도 next ()를 직접 호출하므로 __next __ ()를 작성해야하는 것은 추악합니다. 또한 프로토콜의 가능한 확장은 prev (), current () 및 reset () 작업을 허용하는 것입니다. 반드시 __prev __ (), __current __ (), __reset __ ()을 사용하고 싶지 않습니다. (돌이켜 보면 __next __ ()로 가서 새로운 내장 next (it)를 호출하는 것이 더 좋았을 것입니다 .__ next __ (). 그러나 아쉽지만 너무 늦었습니다 .Python 2.2에 배포되었습니다 2001 년 12 월부터.)

참고 문헌 / 추가 정보 :

PEP 234-반복자

파이썬의 "for"문장 이해

파이썬 제너레이터와 이터레이터의 차이점