>백엔드 개발 >파이썬 튜토리얼 >python3의 range는 반복자를 반환합니까?

python3의 range는 반복자를 반환합니까?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼앞으로
2019-06-03 15:31:132979검색

Python3의 범위는 무엇을 반환하나요? 많은 사람들은 이것이 간단하지 않다고 생각할 것입니다. Python 2에서는 range()가 목록을 반환합니다. Python 3에서는 range가 xrange로 대체되고 반복자(Iterator)가 반환됩니다.

축하합니다. 답이 틀렸습니다.

python3의 range는 반복자를 반환합니까?

range()는 Iterator가 아닌 Iterable을 반환합니다.

a  Python 3.6.3 (default, Nov  3 2017, 14:41:25)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: a = range(10) 
In [2]: a
Out[2]: range(0, 10)
In [3]: import collections
In [4]: isinstance(a, collections.Iterable)
Out[4]: True 
In [5]: isinstance(a, collections.Iterator)
Out[5]: False

원리는 매우 간단합니다. Iterable과 Iterator의 차이점을 비교하려고 하지 마세요. 기본적으로 동일한 다른 개념입니다. 두 가지 모두의 문자 그대로의 의미는 매우 명확합니다. Iterable은 반복 가능한 객체이며, iter(Iterable)를 호출하면 반복자를 얻게 되고 Iterator는 반복기를 호출하고 next(Iterator)를 호출하면 다음 요소를 얻게 됩니다.

Python은 프로토콜을 존중합니다. 직설적으로 말하면 오리 타이핑입니다. __iter__()를 구현하면(즉, iter()를 호출하여 Iterator를 얻을 수 있음) __next__() 및 __iter__()를 구현하면 Iterable입니다.

잠깐만요. Iterator는 다음 요소를 가져오기 위해 next()를 호출하지 않나요? Iterator가 Iterable의 __iter__() 메소드도 구현하는 이유는 무엇입니까? 이것은 순수하지 않습니다!

Python의 Iterator가 __iter__()를 구현하는 이유는 무엇입니까(일반적인 구현은 return self입니다). 공식 문서에는 매우 명확하게 나와 있습니다.

Iterators are required to have an __iter__() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted.

간단히 번역하면 Iterator에는 __iter__() 구현도 필요하다는 의미입니다. 왜냐하면 모든 Iterator가 Iterable인 경우 이러한 Iterable 위치는 아무런 방해 없이 Iterator를 사용할 수 있기 때문입니다. 예를 들어 for 루프를 예로 들어 보겠습니다. for 루프에 관해 Python 위키에서 다음 설명을 찾았습니다(아주 오래된 것임):

Basically, any object with an iterable method can be used in a for loop. Even strings, despite not having an iterable method – but we’ll not get on to that here.

즉, for 루프는 Iterable Iterator를 가져온 다음 이 Iterator를 사용하여 반복합니다. . Iterator가 __iter__() 메서드를 구현하면 for 루프는 아무런 방해 없이 Iterator를 반복할 수 있습니다. Neat! Python의 생성기도 Iterator라고 상상해 보세요. for 루프가 Iterator의 반복을 지원할 수 없다면 삶은 죽음보다 더 나쁠 것입니다.

따라서 Iterator에는 이러한 "과도한" 요구 사항이 있습니다. 모든 Iterator는 Iterable이라고 생각할 수 있습니다. 그러면 원래 질문으로 돌아가서 range()가 Iterator 대신 Iterable을 반환하는 이유는 무엇입니까?

우리가 일반적으로 range()를 사용한다는 점을 고려하면 이것이 범위를 나타내는 컨테이너라고 생각합니다. 이 컨테이너를 사용하면 문제 없이 다른 컨테이너를 초기화할 수 있습니다.

>>> numbers = range(3)
>>> tuple(numbers)
(0, 1, 2)
>>> tuple(numbers)
(0, 1, 2)

range()가 반복자를 반환하는 경우 정상적으로 보이는 위 코드에 문제가 있습니다.

>>> numbers = iter(range(3))
>>> tuple(numbers)
(0, 1, 2)
>>> tuple(numbers)
()

요약

Iterator는 상태 저장형이며 "소비 유형", "보조"의 경우 한 번만 통과할 수 있습니다. 소비"는 허용되지 않습니다. Iterable은 상태 비저장입니다(Iterable의 Iterable은 말할 것도 없고 여기서는 너무 엄격하지 않습니다). Iterable에서 iter()가 호출될 때마다 새로운 반복자가 획득됩니다.

위 내용은 python3의 range는 반복자를 반환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 kawabangga.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제