반복자, 반복 가능 및 반복은 정확히 무엇입니까?


442

파이썬에서 "iterable", "iterator"및 "iteration"의 가장 기본적인 정의는 무엇입니까?

여러 정의를 읽었지만 여전히 침몰하지 않는 정확한 의미를 식별 할 수 없습니다.

평신도 용어로 세 가지 정의를 도와 ​​줄 수 있습니까?

답변:


530

반복 이란 무엇인가의 각 항목을 차례로 가져 오는 일반적인 용어입니다. 명시 적이든 암시적인 루프를 사용하여 항목 그룹을 반복 할 때마다 반복입니다.

파이썬에서 iterableiterator 는 특정한 의미를 가지고 있습니다.

반복자는 가진 개체입니다 __iter__반환 방법 반복자를 , 또는 정의하는 __getitem__0부터 시작하여 순차적으로 인덱스를 취할 수있는 방법을 (그리고를 제기하지 IndexError인덱스가 더 이상 유효 할 때를). SO를 반복 가능한은 당신이 얻을 수있는 객체입니다 반복자 에서가.

반복자 A의 목적 next(파이썬 2) 또는 __next__(3 파이썬) 방법.

파이썬에서 for루프 또는 map목록 이해 등 을 사용할 때마다 next메소드가 자동으로 호출되어 반복자 에서 각 항목을 가져 오므반복 프로세스가 진행됩니다 .

학습을 시작하기에 좋은 곳 은 튜토리얼반복자 섹션과 표준 유형 페이지반복자 유형 섹션입니다 . 기본 사항을 이해 한 후 Functional Programming HOWTO반복자 섹션을 시도하십시오 .


1
collections.abc.AsyncIterator테스트 __aiter____anext__방법에 유의하십시오 . 이것은 3.6의 새로운 추가 기능입니다.
야누스 Troelsen

1
@jlh 왜 __len__반복과 관련이 있을까요? 무언가의 길이를 아는 것은 그것을 반복하는 데 어떻게 도움이됩니까?
shadowtalker

2
@shadowtalker 어떤 인덱스가 유효한지 아는 데 도움이되므로 어떤 인덱스를 사용할 수 있는지 알 수 있습니다 __getitem__.
jlh

4
@jlh 그것은 당신이 매우 의견이 많은 dfeault 행동을 제안하는 것처럼 들립니다. 즉 고려 {'a': 'hi', 'b': 'bye'}2의 길이를 가지고 있지만, 0, 1 또는 2로 인덱싱 할 수 없습니다
shadowtalker

2
@ 그림쟁이. 그러나 dict에는 __iter__방법이 있습니다. jlh는 " __getitem__0부터 시작하는 순차 색인을 취할 수 있는 방법 "이라고 정의하기 때문에 반복 가능한 객체를 참조한다고 생각 합니다.
Rich

337

파이썬 클래스를 가르치는 데 사용하는 설명은 다음과 같습니다.

ITERABLE은 다음과 같습니다

  • 반복 될 수있는 것 (즉, 문자열이나 파일을 반복 할 수있는 것) 또는
  • for-loop의 오른쪽에 나타날 수있는 것 : for x in iterable: ...또는
  • 당신이 호출 할 수있는 것도 iter()그 반복자를 반환합니다 iter(obj)또는
  • __iter__새로운 ITERATOR를 반환 하는 객체를 정의 하거나 __getitem__인덱스 조회에 적합한 메소드를 가질 수 있습니다 .

ITERATOR는 객체입니다.

  • 반복하는 동안의 위치를 ​​기억하는 상태로
  • 다음과 같은 __next__방법으로 :
    • 반복에서 다음 값을 반환
    • 다음 값을 가리 키도록 상태를 업데이트합니다.
    • 올리면 신호 StopIteration
  • 그리고 그것은 스스로 반복 가능합니다 ( __iter__을 반환 하는 메소드 가 있음을 의미 self).

노트:

  • __next__Python 3 의 메소드는 nextPython 2에서 철자가 되며
  • 내장 함수 next()는 전달 된 객체에서 해당 메소드를 호출합니다.

예를 들면 다음과 같습니다.

>>> s = 'cat'      # s is an ITERABLE
                   # s is a str object that is immutable
                   # s has no state
                   # s has a __getitem__() method 

>>> t = iter(s)    # t is an ITERATOR
                   # t has state (it starts by pointing at the "c"
                   # t has a next() method and an __iter__() method

>>> next(t)        # the next() function returns the next value and advances the state
'c'
>>> next(t)        # the next() function returns the next value and advances
'a'
>>> next(t)        # the next() function returns the next value and advances
't'
>>> next(t)        # next() raises StopIteration to signal that iteration is complete
Traceback (most recent call last):
...
StopIteration

>>> iter(t) is t   # the iterator is self-iterable

신선한 반복 자란 무엇을 의미합니까?
lmiguelvargasf

13
@lmiguelvargasf "소진 또는 부분 소비"와 반대로 "새롭고 소비되지 않은"과 같이 "신선한". 아이디어는 처음에 새로운 반복자가 시작되고 부분적으로 사용 된 반복자가 중단 된 부분을 선택한다는 것입니다.
Raymond Hettinger 2012

두 번째, 세 번째 및 네 번째 글 머리 기호는 특정 파이썬 구조, 내장 또는 메소드 호출 측면에서 의미가 무엇인지 명확하게 나타냅니다. 그러나 첫 번째 글 머리 기호 ( "반복 될 수있는 모든 것")에는 그 명확성이 없습니다. 또한 첫 번째 글 머리 기호는 for루프에 관한 것이고 첫 번째 글 머리 기호는 "루핑 오버"에 관한 것이므로 첫 번째 글 머리 기호는 두 번째 글 머리 기호와 겹치는 것 같습니다 . 이 문제를 해결할 수 있습니까?
분수대

2
Pls는 "통화 할 수있는 것 iter()"으로 " 당신이 전화 할 수있는 것"을 다시 표현하는 것을 고려 합니다 iter().
fountainhead

98

위의 답변은 훌륭하지만 내가 본 대부분의 사람들처럼 나와 같은 사람들에게 차별화를 강조하지 않습니다 .

또한 사람들은 "X는 __foo__()메서드 가있는 객체입니다"와 같은 정의를 넣어서 "너무 Pythonic"하는 경향이 있습니다. 이러한 정의는 정확합니다. 오리-타이핑 철학을 기반으로하지만 개념을 단순하게 이해하려고 할 때 방법에 중점을 두는 경향이 있습니다.

그래서 내 버전을 추가합니다.


자연어로

  • 반복 은 한 번에 하나의 요소를 한 행의 요소로 가져 오는 프로세스입니다.

파이썬에서

  • iterable 은 간단하게 반복 가능한 객체로, 반복과 같이 반복에 사용될 수 있음을 의미합니다 (예 : for루프). 어떻게? 반복자 를 사용하여 . 아래에 설명하겠습니다.

  • ... 반복자실제로 반복을 수행 하는 방법 , 특히 다음 요소 가 무엇인지 정의 하는 객체입니다 . 그것이 next()방법 이 있어야하는 이유 입니다.

반복자는 자체 __iter__()호출이 반복 self되는지 여부에 관계없이 해당 메소드가 동일한 오브젝트 ( )를 리턴 한다는 점을 구별하여 반복 가능 합니다 next().


그렇다면 파이썬 인터프리터는 for x in obj:문장 을 볼 때 어떻게 생각 합니까?

봐봐, for루프 이터레이터를위한 직업인 것 같습니다. ...이 obj사람 이 있으니 물어 보자.

"씨 obj, 반복자가 있습니까?" (... 호출 iter(obj), 호출 obj.__iter__(), 반짝이는 새 반복자를 행복하게 전달 함 _i)

좋아, 쉬웠다 ... 반복을 시작하자. ( x = _i.next()... x = _i.next()...)

Mr. obj이 테스트에서 성공한 이후 (유효한 반복자를 반환하는 특정 방법을 가짐) 우리는 형용사에게 보상합니다 obj.

그러나 간단한 경우에는 일반적으로 이터레이터와 이터 러블을 별도로 사용하면 이점이 없습니다. 따라서 자체 반복자 인 하나의 객체 정의 합니다. (파이썬은 정말 상관하지 않습니다 _i에 의해 손으로 아웃 obj모두 반짝 아니었지만, 바로 obj그 자체.)

이것이 내가 본 대부분의 예에서 (그리고 나를 계속 혼란스럽게 한 것) 당신이 볼 수있는 이유입니다.

class IterableExample(object):

    def __iter__(self):
        return self

    def next(self):
        pass

대신에

class Iterator(object):
    def next(self):
        pass

class Iterable(object):
    def __iter__(self):
        return Iterator()

그러나 한 행의 항목을 원하지만 더 많은 "커서"를 원할 때와 같이 반복자를 iterable과 분리하여 얻을 수있는 경우가 있습니다. 예를 들어 "현재"및 "앞에 오는"요소로 작업하려는 경우 둘 다에 대해 별도의 반복자를 가질 수 있습니다. 또는 거대한 목록에서 여러 스레드를 가져옵니다. 각 스레드에는 모든 항목을 순회하는 자체 반복자가있을 수 있습니다. 참조 @ 레이몬드의@ glglgl의 위의 답변.

당신이 할 수있는 일을 상상해보십시오.

class SmartIterableExample(object):

    def create_iterator(self):
        # An amazingly powerful yet simple way to create arbitrary
        # iterator, utilizing object state (or not, if you are fan
        # of functional), magic and nuclear waste--no kittens hurt.
        pass    # don't forget to add the next() method

    def __iter__(self):
        return self.create_iterator()

노트:

  • 다시 반복하겠습니다 : 반복자는 반복 할 수 없습니다 . 반복자를 "소스" for루프 로 사용할 수 없습니다 . 무엇 for루프가 기본적으로 필요로하는 것입니다 __iter__() (와 그 반환 일 next()).

  • 물론, for유일한 반복 루프는 아니므로 위의 일부 다른 구문에도 적용됩니다 ( while...).

  • 반복자 next()는 StopIteration을 발생시켜 반복을 중지 할 수 있습니다. 그러나 영원히 반복하거나 다른 수단을 사용할 필요는 없습니다.

  • 위의 "생각 과정" _i에는 실제로 존재하지 않습니다. 나는 그 이름을 만들었습니다.

  • 파이썬 3.x에는 약간의 변화가 있습니다 : next()(내장되지 않은) 메소드는 이제 호출되어야합니다 __next__(). 그렇습니다.

  • iterable에는 데이터가 있고 iterator는 다음 항목을 가져옵니다.

면책 조항 : 저는 파이썬 인터프리터의 개발자가 아니므로 인터프리터가 무엇을 생각하는지 실제로 알지 못합니다. 위의 생각은 파이썬 초보자의 다른 설명, 실험 및 실제 경험에서 주제를 이해하는 방법을 보여줍니다.


1
이것은 훌륭하지만 여전히 약간 혼란 스럽습니다. 나는 당신의 노란 상자가 for루프가 반복자를 필요로하고 있다고 생각했다고 생각했다 . 그러나 마지막 노트에서 "반복자에서 for루프를 소스로 사용할 수 없습니다 "...?
레이싱 올챙이

pass그러한 next정의를 위한 코드를 작성해야 합니까? 다음은 무언가를 반환해야하기 때문에 누군가 다음을 얻는 방법을 구현해야한다고 가정합니다.
nealmcb

@nealmcb 예, 과거의 의미라고 생각합니다. (그것은 결국 무엇 pass을위한입니다 .)
Alois Mahdal

@AloisMahdal Ahh, 나는 그 사용을 전에 보지 못했습니다. 내가 볼 때 나는 pass그것이 구문상의 이유로 있다고 생각합니다. 방금 말줄임표 개체에 대한 답을 ...찾았습니다. "나중에 할 일"블록을 나타내는 데 사용할 수 있습니다 . NotImplemented사용할 수 있습니다.
nealmcb

이터레이터와 이터 러블의 차이점을 강조하는 것이 좋지만이 대답은 모순됩니다. 먼저 '반복자도 반복 가능하다'라고 쓴다 ( 파이썬 문서에 쓰여진 것과 일치한다 ). 그러나 나중에 다음과 같이 씁니다. ' 반복자는 반복 할 수 없습니다 . 반복자는 "소스의 for루프 "로 사용할 수 없습니다 . 나는 당신의 대답의 요점을 얻었고, 그렇지 않으면 좋아하지만 이것을 고치면 도움이 될 것이라고 생각합니다.
Rich

22

iterable은 __iter__()메소드 가있는 객체입니다 . list()s 및 tuple()s 와 같이 여러 번 반복 될 수 있습니다 .

반복자는 반복되는 객체입니다. __iter__()메소드에 의해 리턴되고 자체 __iter__()메소드 를 통해 자체 리턴되며 next()메소드 ( __next__()3.x)가 있습니다.

반복은이 next()resp 를 호출하는 프로세스입니다 . __next__()때까지 StopIteration.

예:

>>> a = [1, 2, 3] # iterable
>>> b1 = iter(a) # iterator 1
>>> b2 = iter(a) # iterator 2, independent of b1
>>> next(b1)
1
>>> next(b1)
2
>>> next(b2) # start over, as it is the first call to b2
1
>>> next(b1)
3
>>> next(b1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> b1 = iter(a) # new one, start over
>>> next(b1)
1

실제로 컨테이너를 통과하는 객체입니까? 이것이 유용 했습니까?
thechrishaddad

종종, 항상 그런 것은 아닙니다. 생성기, 파일 또는 데이터베이스 커서는 한 번만 반복 할 수 있으므로 자체 반복기입니다.
glglgl

나는 b2가 b1과 독립적 일 필요는 없다고 생각한다. 이 특별한 경우에는 독립적 Iterable입니다. 독립적이지 않고 유효한 것으로 만들 수 있습니다 .

@Bin 예. 하고 Iterator항상 Iterable자체이다 Iterator의 두 통화 iter()반드시 두 개의 독립적 인 제공하지 않습니다 Iterator들.
glglgl

13

내 치트 시트는 다음과 같습니다.

 sequence
  +
  |
  v
   def __getitem__(self, index: int):
  +    ...
  |    raise IndexError
  |
  |
  |              def __iter__(self):
  |             +     ...
  |             |     return <iterator>
  |             |
  |             |
  +--> or <-----+        def __next__(self):
       +        |       +    ...
       |        |       |    raise StopIteration
       v        |       |
    iterable    |       |
           +    |       |
           |    |       v
           |    +----> and +-------> iterator
           |                               ^
           v                               |
   iter(<iterable>) +----------------------+
                                           |
   def generator():                        |
  +    yield 1                             |
  |                 generator_expression +-+
  |                                        |
  +-> generator() +-> generator_iterator +-+

퀴즈 : 당신은 어떻게 보입니까 ...

  1. 모든 반복자는 반복 가능합니까?
  2. 컨테이너 객체의 __iter__()메소드는 생성기로 구현할 수 있습니까?
  3. __next__메소드가 있는 iterable이 반드시 iterator 일 필요는 없습니까?

대답:

  1. 모든 반복자에는 __iter__메소드 가 있어야합니다 . 갖는 __iter__것은 반복 가능하기에 충분합니다. 따라서 모든 반복자는 반복 가능합니다.
  2. __iter__호출 되면 반복자를 반환해야합니다 ( return <iterator>위 다이어그램에서). 생성기를 호출하면 반복기 유형 인 생성기 반복기가 리턴됩니다.

    class Iterable1:
        def __iter__(self):
            # a method (which is a function defined inside a class body)
            # calling iter() converts iterable (tuple) to iterator
            return iter((1,2,3))
    
    class Iterable2:
        def __iter__(self):
            # a generator
            for i in (1, 2, 3):
                yield i
    
    class Iterable3:
        def __iter__(self):
            # with PEP 380 syntax
            yield from (1, 2, 3)
    
    # passes
    assert list(Iterable1()) == list(Iterable2()) == list(Iterable3()) == [1, 2, 3]
  3. 예를 들면 다음과 같습니다.

    class MyIterable:
    
        def __init__(self):
            self.n = 0
    
        def __getitem__(self, index: int):
            return (1, 2, 3)[index]
    
        def __next__(self):
            n = self.n = self.n + 1
            if n > 3:
                raise StopIteration
            return n
    
    # if you can iter it without raising a TypeError, then it's an iterable.
    iter(MyIterable())
    
    # but obviously `MyIterable()` is not an iterator since it does not have
    # an `__iter__` method.
    from collections.abc import Iterator
    assert isinstance(MyIterable(), Iterator)  # AssertionError

1
퀴즈에서는 첫 번째 글 머리 만 이해했습니다. 즉, iterator는 __iter__메소드 가 있으므로 iterable이됩니다 . 이 답변을 편집하여 2 위 및 3 위에 대해 자세히
설명해 주시겠습니까

@AnV : 내가 이해하는 한 re 2 : __iter__()반복자를 반환합니다. 생성기는 반복자이므로이 용도로 사용할 수 있습니다. re 3 : 여기에서만 추측 할 수 있지만 __iter__()누락되거나 반환되지 않으면 self반복자가 아니라고 생각합니다. 반복자 __iter__()가 반환해야 하기 때문 self입니다.
glglgl

10

그것이 누구에게 도움이되는지 모르겠지만 항상 개념을 더 잘 이해하기 위해 머리 속에 개념을 시각화하는 것을 좋아합니다. 작은 아들이 있으므로 벽돌과 백서를 사용하여 반복 가능 / 반복자 개념을 시각화합니다.

우리가 어두운 방에 있고 바닥에 아들을위한 벽돌이 있다고 가정 해 봅시다. 다른 크기, 색의 벽돌은 이제 중요하지 않습니다. 5 개의 벽돌이 있다고 가정 해 봅시다. 이 5 개의 브릭은 오브젝트 로 설명 될 수 있습니다 . 브릭 키트를 예로 들어 보겠습니다 . 우리는이 벽돌 키트로 많은 일을 할 수 있습니다 – 하나를 가져다가 두 번째로, 세 번째로, 벽돌의 장소를 바꾸고, 첫 번째 벽돌을 두 번째 위에 놓을 수 있습니다. 우리는 그것들로 많은 종류의 일을 할 수 있습니다. 따라서이 브릭 키트는 각 브릭을 거치면서 무언가를 할 수 있으므로 반복 가능한 객체 또는 시퀀스 입니다. 우리는 나의 작은 아들처럼 그것을 할 수 있습니다 – 우리는 한 번에 하나의 벽돌 놀 수 있습니다 . 다시 한번이 벽돌 키트는반복 가능 .

이제 우리는 어두운 방에 있다는 것을 기억하십시오. 아니면 거의 어둡습니다. 문제는 벽돌, 색상, 모양 등을 명확하게 볼 수 없다는 것입니다. 따라서 벽돌을 통해 무언가를하고 싶더라도 (일명 반복) – 실제로 무엇을 어떻게 알지 못합니다. 너무 어둡다.

우리가 할 수있는 일은 벽돌 키트의 요소 인 첫 번째 벽돌 근처에 있습니다. 첫 번째 벽돌 요소의 위치를 ​​알 수 있도록 흰색 형광 종이를 넣을 수 있습니다. 키트에서 벽돌을 가져갈 때마다 어두운 방에서 볼 수 있도록 흰색 종이를 다음 벽돌로 바꿉니다. 이 하얀 종이는 반복자에 지나지 않습니다 . 그것은 또한 대상 이다. 그러나 반복 가능한 객체 – 브릭 키트의 요소로 작업하고 재생할 수있는 객체.

그건 그렇고 IDLE에서 다음을 시도하고 TypeError가 발생했을 때 초기 실수를 설명합니다.

 >>> X = [1,2,3,4,5]
 >>> next(X)
 Traceback (most recent call last):
    File "<pyshell#19>", line 1, in <module>
      next(X)
 TypeError: 'list' object is not an iterator

X 목록은 우리의 벽돌 키트 였지만 흰 종이는 아니 었습니다. 반복자를 먼저 찾아야했습니다.

>>> X = [1,2,3,4,5]
>>> bricks_kit = [1,2,3,4,5]
>>> white_piece_of_paper = iter(bricks_kit)
>>> next(white_piece_of_paper)
1
>>> next(white_piece_of_paper)
2
>>>

그것이 도움이되는지 모르겠지만 도움이되었습니다. 누군가가 개념의 시각화를 확인 / 수정할 수 있다면 감사하겠습니다. 더 배우는 데 도움이 될 것입니다.


6

반복 가능 : 반복 가능한 것은 반복 가능합니다. 리스트, 문자열 등과 같은 시퀀스와 유사합니다. 또한 __getitem__메소드 또는 __iter__메소드가 있습니다. 이제 iter()해당 객체에서 함수를 사용 하면 반복자를 얻습니다.

Iterator :- iter()함수 에서 iterator 객체를 가져올 때 ; 우리 는 요소를 하나씩 얻기 위해 ( __next__()python3에서) 또는 단순히 next()(python2에서 ) 메소드 를 호출 합니다. 이 클래스 또는이 클래스의 인스턴스를 반복 자라고합니다.

문서에서 :-

반복자를 사용하면 파이썬이 널리 퍼지고 통합됩니다. 배후에서 for 문 iter() 은 컨테이너 객체를 호출  합니다. 이 함수는 __next__() 컨테이너의 요소에 한 번에 하나씩 액세스 하는 메서드 를 정의하는 반복자 객체를 반환합니다  . 더 이상 요소가 없으면  __next__() for 루프를 종료하도록 알리는 StopIteration 예외를 발생시킵니다.  내장 함수를 __next__() 사용 하여 메소드를  호출 할 수 있습니다  next(). 이 예제는 모든 작동 방식을 보여줍니다.

>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    next(it)
StopIteration

수업의 예 :-

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    def __iter__(self):
        return self
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
...     print(char)
...
m
a
p
s

4

나는 당신이 documentation 보다 훨씬 간단하게 얻을 수 있다고 생각하지 않지만 시도 할 것이다.

  • 반복반복 될 수있는 것입니다 . 실제로는 일반적으로 시작과 끝이 있는 시퀀스 와 그 안의 모든 항목을 통과하는 방법을 의미합니다.
  • Iteratoriterable 의 다음 (또는 첫 번째) 항목을 제공 (또는 보유)하는 도우미 의사 메소드 (또는 의사 속성)로 생각할 수 있습니다 . (실제로는 메소드를 정의하는 객체 일뿐입니다 next())

  • 반복 은 아마도 Merriam-Webster 정의에 의해 가장 잘 설명 될 것입니다 .

b : 지정된 횟수만큼 또는 조건이 충족 될 때까지 일련의 컴퓨터 명령 반복-재귀 비교


3
iterable = [1, 2] 

iterator = iter(iterable)

print(iterator.__next__())   

print(iterator.__next__())   

그래서,

  1. iterable반복 될 수 있는 객체 입니다 . 예를 들어 list, string, tuple 등

  2. 객체 에서 iter함수를 사용하면 반복자 객체iterable 가 반환됩니다 .

  3. 이제이 반복자 객체 에는 __next__(It 's Python 3 또는 nextPython 2) 라는 이름의 메소드가 있으며 , 이를 통해 반복 가능한 각 요소에 액세스 할 수 있습니다.

따라서 위의 코드 출력은 다음과 같습니다.

1

2


3

이터 러블 에는 __iter__매번 새로운 반복자를 인스턴스화 하는 방법이 있습니다.

반복자__next__ 는 개별 항목을 반환 하는 메서드 와을 반환 하는 메서드를 구현 __iter__합니다 self.

따라서 반복자는 반복 가능하지만 반복자는 반복자가 아닙니다.

유창한 파이썬 인 Luciano Ramalho.


2

이터 러블과 이터레이터를 다루기 전에 이터 러블과 이터레이터를 결정하는 주요 요인은 시퀀스입니다.

시퀀스 : 시퀀스는 데이터 수집입니다

반복 가능 : 반복 가능은 __iter__메소드 를 지원하는 시퀀스 유형 오브젝트입니다 .

Iter 메소드 : Iter 메소드는 입력으로 시퀀스를 가져오고 iterator로 알려진 오브젝트를 작성합니다.

반복자 : 반복자는 다음 메소드를 호출하고 시퀀스를 가로 지르는 객체입니다. 다음 메소드를 호출하면 현재 순회 한 오브젝트를 리턴합니다.

예:

x=[1,2,3,4]

x는 데이터 수집으로 구성된 시퀀스입니다

y=iter(x)

호출 iter(x)하면 x 객체에 iter 메소드가있는 경우에만 반복자를 리턴합니다. 그렇지 않으면 예외가 발생합니다. 반환자를 리턴하면 y는 다음과 같이 지정됩니다.

y=[1,2,3,4]

y는 반복자이므로 next()메소드를 지원 합니다.

다음 메소드를 호출하면 목록의 개별 요소를 하나씩 리턴합니다.

시퀀스의 마지막 요소를 반환 한 후 다음 메소드를 다시 호출하면 StopIteration 오류가 발생합니다.

예:

>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration

관찰 : y = iter (x)는 y = [1,2,3,4]가 아닙니다. y는 이제 반복자 객체이기 때문입니다. 아마도 목록이 아니라 반복자 객체임을 나타내거나 표현을 변경하려면 설명을 추가해야합니다.
coelhudo

-6

파이썬에서는 모든 것이 객체입니다. 객체가 반복 가능하다고 말하면 객체를 컬렉션으로 단계별 (즉, 반복) 할 수 있음을 의미합니다.

예를 들어 배열은 반복 가능합니다. for 루프를 사용하여 단계별로 탐색하고 인덱스 0에서 인덱스 n으로 이동할 수 있습니다. n은 배열 객체의 길이에서 1을 뺀 길이입니다.

사전 (키 / 값 쌍, 연관 배열이라고도 함)도 반복 가능합니다. 당신은 그들의 열쇠를 통해 단계 수 있습니다.

컬렉션이 아닌 객체는 반복 할 수 없습니다. 예를 들어 bool 객체에는 True 또는 False 값만 있습니다. 반복 할 수 없습니다 (반복 가능한 객체라는 것은 말이되지 않습니다).

더 읽어보세요. http://www.lepus.org.uk/ref/companion/Iterator.xml


6
컬렉션이 아닌 객체는 반복 가능 하지 않습니다. 몇 가지 예제를 제공하기 위해 생성기는 반복 가능하지만 콜렉션은 아니며 iter()표준 콜렉션 유형 을 호출 하여 작성된 반복자 오브젝트 는 반복 가능하지만 자체는 콜렉션이 아닙니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.