Python의 반복자 프로토콜 이해

이것은 free Python course에 대한 당사의 Primer에서 발췌한 것입니다.

Iterables & Iterators는 Python의 핵심입니다. 그것들이 무엇이며 그것들을 더 잘 이해하는 방법을 배우자.

먼저 몇 가지 정의:

Iterables: 한 번에 하나씩 멤버를 반환할 수 있는 객체를 iter-able이라고 합니다.

iterable에서 멤버를 한 번에 하나씩 가져오기 위해 Python은 내장 함수iter()를 제공합니다. 우리가 iter() 함수에 대한 인수로 iterable을 제공하면(반환 시 객체에 대한 __iter__() dunder 메서드 호출) iterator라는 것을 반환합니다.

코드에서 확인해 봅시다:

>>> guests = {'Luffy', 'Zorro', 'Sanji'}
>>> iter(guests)
<set_iterator object at 0x7f7983d1dab0>


위의 코드 목록은 set_iterator 객체를 반환하는 iter()로 설정된 게스트를 제공합니다. 그러나 반복자가 무엇입니까?
  • 반복자는 데이터 스트림을 나타내는 개체입니다.
    반복자 객체에서 내장next()을 반복적으로 호출하면 스트림의 다음 항목이 반환됩니다.
  • 데이터 스트림에서 더 이상 사용할 수 있는 항목이 없으면 대신 StopIteration 예외가 발생합니다.

  • 이를 이해하기 위해 위에서부터 코드를 계속 진행해 보겠습니다.

    >>> guests = {'Luffy', 'Zorro', 'Sanji'}
    >>> guest_iterator = iter(guests)
    >>> next(guest_iterator)
    'Zorro'                        # Sets are unordered
    >>> next(guest_iterator)
    'Luffy'
    >>> next(guest_iterator)
    'Sanji'
    >>> next(guest_iterator)    # No more items left in the set
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    


    위의 코드 목록에서 게스트로부터 반환된 반복자가 내장된 iter()next() 함수를 사용하여 한 번에 하나의 객체를 제공할 수 있는 방법을 볼 수 있습니다.

    객체가 반복 가능하려면 dunder 메서드__iter__()가 정의되어 있어야 합니다. Iterable에서 반복자를 반환하는 __iter__() 메서드입니다.
    sequences , setsdictionaries 와 같은 내장 개체에는 dunder 메서드__iter__()가 정의되어 있어 for 루프에서 사용할 수 있습니다.

    이제 Python이 반복을 구현하는 방법에 대해 약간의 통찰력을 얻었으므로 개체 집합을 반복하는 while 루프를 작성해 보겠습니다.

    >>> guests = {'Luffy', 'Zorro', 'Sanji'}
    >>> guest_iterator = iter(guests)    # Same as guests.__iter__()
    >>> while True:
    ...     try:
                # Same as guest_iterator.__next__()
    ...         guest = next(guest_iterator)
    ...         print(guest)
    ...     except StopIteration as e:
    ...         break
    Zorro
    Luffy
    Sanji
    


    우리가 작성한 while 루프는 for 루프를 사용하여 이터러블을 반복할 때 후드 아래에서 발생하는 것과 매우 유사합니다. for 루프와 함께 iterables를 사용할 때 for 문이 자동으로 수행하므로 iter() 함수를 호출하거나 StopIteration 오류를 처리할 필요가 없습니다.

    반복자 프로토콜을 다음과 같이 설명할 수 있습니다.
  • 먼저 iter() 함수 또는 dunder 메서드<iterable>.__iter__()를 사용하여 객체의 반복자를 구합니다.
    iterator 객체에서 내장 함수next() 또는 dunder 메서드<iterator>.__next__()를 호출합니다.
  • for 블록
  • 내에서 코드 블록 실행
  • 반복자가 발생할 때까지 다음 호출을 반복합니다StopIteration.



  • iterable 및 iterator라는 용어를 재정의합시다.

    Iterable: 반복을 허용하는 객체를 iter-able이라고 합니다. iterable은 iterator를 반환하는 메서드__iter__()를 정의해야 합니다.

    반복자: 반복자에는 __iter__() 메서드와 __next__() 메서드가 모두 있어야 합니다.

    지금까지 이터러블과 이터레이터에 대해 배운 모든 내용을 아래 표에 요약할 수 있습니다.



    이 섹션에서는 이터레이터와 이터러블의 차이점을 다루었습니다. Python에 대해 자세히 알아보려면 Primer을 방문하여 Python에 대한 무료 과정을 확인하십시오. 에서 나를 팔로우할 수도 있습니다.

    좋은 웹페이지 즐겨찾기