developer tip

파이썬 목록과 혼동 : 그것들이 반복자입니까?

copycodes 2020. 11. 14. 10:44
반응형

파이썬 목록과 혼동 : 그것들이 반복자입니까?


저는 Alex Marteli의 Python in a Nutshell을 연구하고 있으며이 책은 next()메서드가 있는 모든 객체가 반복자 (또는 적어도 사용할 수 있음)라고 제안 합니다 . 또한 대부분의 이터레이터는라는 메서드에 대한 암시 적 또는 명시 적 호출에 의해 빌드된다는 것을 제안합니다 iter.

책에서 이것을 읽은 후 나는 그것을 시도하고 싶은 충동을 느꼈다. 나는 파이썬 2.7.3 인터프리터를 시작하고 이렇게했습니다.

>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
...     print x.next()

그러나 결과는 다음과 같습니다.

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'

혼란스러워서 x 객체의 구조를 비아로 연구하려고했는데 함수 객체 dir(x)가 있다는 것을 알았습니다 __iter__. 그래서 나는 그것이 그 유형의 인터페이스를 지원하는 한 반복자로 사용될 수 있다는 것을 알아 냈습니다.

그래서 다시 시도했을 때 이번에는 약간 다르게 시도했습니다.

>>> _temp_iter = next(x)

이 오류가 발생했습니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

그러나 목록이이 인터페이스를 지원하는 것으로 보이므로 반복자가 아닐 수 있으며 다음 컨텍스트에서 확실히 하나로 사용할 수 있습니다.

>>> for number in x:
...     print x

누군가가 내 마음에서 이것을 명확하게 도와 줄 수 있습니까?


그들은있는 반복 가능한 , 그러나 아니다 반복자 . iter()묵시적으로 (예를 들어를 통해 for) 또는 명시 적으로 반복자를 가져 오기 위해 전달 될 수 있지만 자체적으로는 반복기가 아닙니다.


먼저 다음을 사용하여 목록을 반복자로 변환해야합니다 iter().

In [7]: x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [8]: it=iter(x)

In [9]: for i in range(10):
    it.next()
   ....:     
   ....:     
Out[10]: 0
Out[10]: 1
Out[10]: 2
Out[10]: 3
Out[10]: 4
Out[10]: 5
Out[10]: 6
Out[10]: 7
Out[10]: 8
Out[10]: 9

In [12]: 'next' in dir(it)
Out[12]: True

In [13]: 'next' in dir(x)
Out[13]: False

객체가 반복자인지 여부 확인 :

In [17]: isinstance(x,collections.Iterator)
Out[17]: False

In [18]: isinstance(x,collections.Iterable)
Out[18]: True

In [19]: isinstance(it,collections.Iterable) 
Out[19]: True

In [20]: isinstance(it,collections.Iterator)
Out[20]: True

iterables와 iterators의 차이점이 무엇인지 혼란 스러울 경우를 대비하여. 반복기는 데이터 스트림을 나타내는 개체입니다. 반복기 프로토콜을 구현합니다.

  • __iter__ 방법
  • next 방법

Repeated calls to the iterator’s next() method return successive items in the stream. When no more data is available the iterator object is exhausted and any further calls to its next() method just raise StopIteration again.

On the other side iterable objects implement the __iter__ method that when called returns an iterator, which allows for multiple passes over their data. Iterable objects are reusable, once exhausted they can be iterated over again. They can be converted to iterators using the iter function.

So if you have a list (iterable) you can do:

>>> l = [1,2,3,4]
>>> for i in l:
...     print i,
1 2 3 4
>>> for i in l:
...     print i,
 1 2 3 4

If you convert your list into an iterator:

>>> il = l.__iter__()  # equivalent to iter(l)
>>> for i in il:
...     print i,
 1 2 3 4
>>> for i in il:
...     print i,
>>> 

List is not iterator but list contains an iterator object __iter__ so when you try to use for loop on any list, for loop calls __iter__ method and gets the iterator object and then it uses next() method of list.

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = x.__iter__()

Now it contains iterator object of x which you can use as it.next() until StopIteration exception is thrown

참고URL : https://stackoverflow.com/questions/13054057/confused-with-python-lists-are-they-or-are-they-not-iterators

반응형