파이썬 목록과 혼동 : 그것들이 반복자입니까?
저는 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
'developer tip' 카테고리의 다른 글
PHP 루트 디렉토리에 txt 파일 생성 및 저장 (0) | 2020.11.14 |
---|---|
C ++ 11 std :: bind와 boost :: bind의 차이점 (0) | 2020.11.14 |
ExecutorService를 Java의 데몬으로 전환 (0) | 2020.11.13 |
주어진 문자열을 식별하는 방법은 16 진수 색상 형식입니다. (0) | 2020.11.13 |
Rails / Rspec Make 테스트는 http 기본 인증으로 통과합니다. (0) | 2020.11.13 |