range ()가 Python 3.3의 생성기 인 경우 범위에서 next ()를 호출 할 수없는 이유는 무엇입니까?


84

아마도 나는 웹상의 잘못된 정보의 희생양이되었을 수도 있지만, 단지 내가 무언가를 오해했을 가능성이 더 크다고 생각합니다. 지금까지 배운 내용에 따라 range ()는 생성기이고 생성기는 반복기로 사용할 수 있습니다. 그러나이 코드 :

myrange = range(10)
print(next(myrange))

이 오류가 발생합니다.

TypeError: 'range' object is not an iterator

내가 여기서 무엇을 놓치고 있습니까? 나는 이것이 0을 인쇄하고 myrange. 저는 Python을 처음 사용하므로 다소 기본적인 질문에 대한 사과를 받아들이십시오.하지만 다른 곳에서는 좋은 설명을 찾을 수 없습니다.


2
반복자와 루프 에서 반복 할 수있는 항목 의 차이점 은 stackoverflow.com/q/13054057/395760 을 참조하십시오 for.

1
생성기는 반복자이지만 반복자는 아니라고 말하는 것이 맞습니까?
제프

4
@Jeff Iterables는 iter반복자를 얻기 위해 사용할 수있는 객체입니다 . 반복자는를 사용하여 반복 할 수있는 개체입니다 next. 생성기는 반복기 (생성기 함수 및 생성기 표현식)의 범주입니다. 적어도 그 ... 내가 무슨 생각입니다
올레 Prypin

답변:


109

range불변의 반복 가능한 객체의 클래스입니다. 반복 동작은 lists 와 비교할 수 있습니다 next. 직접 호출 할 수 없습니다 . 사용하여 반복자를 가져와야합니다 iter.

그래서 아니, range발전기가 아닙니다.

"왜 직접 반복 가능하게 만들지 않았는지"라고 생각할 수 있습니다. 글쎄, ranges는 그렇게 할 수없는 몇 가지 유용한 속성을 가지고 있습니다.

  • 변경이 불가능하므로 사전 키로 사용할 수 있습니다.
  • 그들은이 start, stop그리고 step(파이썬 3.3부터) 속성 countindex방법을 그들은 지원 in, len__getitem__작업.
  • 동일한 작업을 range여러 번 반복 할 수 있습니다 .

>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5

11
range객체의 또 다른 멋진 기능은 __contains__값이 범위 내에 있는지 테스트하는 데 사용할 수 있는 메서드 가 있다는 것입니다 .5 in range(10) => True
kindall

답변 해주셔서 감사합니다; 이것은 이제 의미가 있습니다. 당신의 대답을 받아들이 기 전에 내가 정리하고 싶은 유일한 것은 페이지 의 1/3 정도 기울임 꼴로 된 메모 인데, "파이썬 3에서 range ()는 생성기이다" 라는 문구입니다 . 이것은 단순히 잘못된 것입니까?
제프

3
@Jeff 엄밀히 말하면 네, 잘못되었습니다. 이 메모의 작성자는 아마도 Python 3 range에서 게으르다 는 것을 의미했을 것입니다 (단지 목록을 반환하는 함수 인 Python 2와 비교할 때).
Oleh Prypin 2012 년

6
또한 : range(0,10,3)[3]9 in range(0,10,3). 범위는 거의 게으른 목록입니다.
Lennart Regebro

2
@ user3079275 "직접 반복 가능"은 잘못된 이름이며 실제로는 "반복자"를 의미합니다. 반복기에는 내부 상태가 있으므로 정의에 따라 변경할 수 있습니다. "Iterable"은 변경 가능 여부에 관계없이 반복자를 생성 할 수있는 객체입니다. 변경 가능한 객체조차도 일반적으로 반복자가 아니라 재사용 가능한 방식으로 반복기를 생성합니다 (예를 들어, 두 개의 반복기를 사용하여 두 개의 다른 위치에서 동일한 목록을 독립적으로 반복 할 수 있음).
올레 Prypin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.