수색…


반복자 대 반복자 대 생성기

iterable반복자를 반환 할 수있는 객체입니다. __iter__ 메소드가 있고 반복자를 리턴하는 상태의 오브젝트는 반복 가능합니다. 또한 __getitem__ 메소드를 구현하는 상태가 없는 객체 일 수도 있습니다. -이 메소드는 인덱스가 0이 아닌 인덱스를 취할 수 있고 인덱스가 더 이상 유효하지 않으면 IndexError 발생시킵니다.

파이썬의 str 클래스는 반복 가능한 __getitem__ 의 예제이다.

반복자 (Iterator) 는 어떤 객체에서 next(*object*) 를 호출 할 때 시퀀스의 다음 값을 생성하는 객체입니다. 게다가, __next__ 메쏘드를 가진 객체는 반복자입니다. 이터레이터는 이터레이터를 소진 한 후 StopIteration 을 발생 StopIteration 시점에서 다시 사용할 수 없습니다 .

반복 가능한 클래스 :

반복 가능한 클래스는 __iter____next__ 메서드를 정의합니다. 반복 가능한 클래스의 예 :

class MyIterable:

    def __iter__(self):

         return self

    def __next__(self):
         #code

#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:

    def __getitem__(self, index):

         if (condition):
             raise IndexError
         return (item)

 #Can produce a plain `iterator` instance by using iter(MySequence())

collections 모듈에서 추상 클래스를 인스턴스화하여이를 더 잘 보려고합니다.

예:

파이썬 2.x 2.3
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
Python 3.x 3.0
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

다음을 수행하여 Python 2의 반복 가능한 클래스에 대한 Python 3 호환성을 처리합니다.

파이썬 2.x 2.3
class MyIterable(object): #or collections.Iterator, which I'd recommend....

     ....

     def __iter__(self): 

          return self

     def next(self): #code

     __next__ = next

이제이 두 가지 모두 반복자이므로 다음을 통해 반복 할 수 있습니다.

ex1 = MyIterableClass()
ex2 = MySequence()

for (item) in (ex1): #code
for (item) in (ex2): #code

생성자 는 반복자를 만드는 간단한 방법입니다. 생성자 반복자이고 반복자는 반복자입니다.

반복 가능할 수있는 것

Iterable 은 항목이 하나씩 전달되는 항목 일 수 있습니다. 내장 된 Python 콜렉션은 반복 가능합니다.

[1, 2, 3]     # list, iterate over items
(1, 2, 3)     # tuple
{1, 2, 3}     # set
{1: 2, 3: 4}  # dict, iterate over keys

생성자는 iterables를 반환합니다.

def foo():  # foo isn't iterable yet...
    yield 1

res = foo()  # ...but res already is

전체 반복 가능 반복

s = {1, 2, 3}

# get every element in s
for a in s:
    print a  # prints 1, then 2, then 3

# copy into list
l1 = list(s)  # l1 = [1, 2, 3]

# use list comprehension
l2 = [a * 2 for a in s if a > 2]  # l2 = [6]

iterable의 한 요소 만 확인하십시오.

압축 해제를 사용하여 첫 번째 요소를 추출하고 유일한 요소인지 확인하십시오.

a, = iterable

def foo():
    yield 1

a, = foo()  # a = 1

nums = [1, 2, 3]
a, = nums  # ValueError: too many values to unpack

값을 하나씩 추출

iterable에 대한 iterator 를 얻기 위해 iter() built-in으로 시작하고 next() 사용하여 StopIteration 이 끝날 때까지 하나씩 요소를 얻는다.

s = {1, 2}   # or list or generator or even iterator
i = iter(s)  # get iterator
a = next(i)  # a = 1
b = next(i)  # b = 2
c = next(i)  # raises StopIteration

반복자는 재진입 성이 아닙니다!

def gen():
    yield 1

iterable = gen()
for a in iterable:
    print a

# What was the first item of iterable? No way to get it now.
# Only to get a new iterator
gen()


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow