Programing

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

lottogame 2020. 2. 22. 11:19
반응형

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


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

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

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


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

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

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

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

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

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


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

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

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

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

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


자연어로

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

파이썬에서

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

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

이터레이터는 이전에 대한 호출에 의해 항목이 소비되었는지 여부에 관계없이 __iter__()메소드가 동일한 객체 ( self)를 리턴 한다는 차이점을 가지고 반복 가능 합니다 next().


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

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

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

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

Mr. obj이 테스트에서 성공한 이후 (유효한 반복자를 반환하는 특정 방법을 통해), 우리는 형용사에게 보상합니다 : 이제 "iterable Mr. 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는 다음 항목을 가져옵니다.

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


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

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

우리가 어두운 방에 있고 바닥에 아들을위한 벽돌이 있다고 가정 해 봅시다. 다른 크기, 색의 벽돌은 이제 중요하지 않습니다. 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
>>>

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


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

 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 +-+

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

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

반복 가능 : 반복 가능한 것은 반복 가능합니다. 리스트, 문자열 등과 같은 시퀀스와 유사합니다. 또한 __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

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

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

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

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


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


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

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

Iterable : Iterable은 Iter 메소드를 지원하는 시퀀스 유형 객체입니다.

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

반복자 : 반복자는 다음 메소드를 호출하고 시퀀스를 가로 지르는 객체입니다. 다음 메소드를 호출하면 현재 횡단 한 객체를 반환합니다.

예:

x=[1,2,3,4]

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

y=iter(x)

iter (x)를 호출하면 x 객체에 iter 메서드가있는 경우에만 iterator를 반환합니다. 그렇지 않으면 예외가 발생합니다 .Iterator (x)를 호출하면 y가 다음과 같이 할당됩니다.

y=[1,2,3,4]

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

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

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

예:

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

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

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

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

유창한 파이썬 인 Luciano Ramalho.


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

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

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

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

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

참고 URL : https://stackoverflow.com/questions/9884132/what-exactly-are-iterator-iterable-and-iteration



반응형