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

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

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

이 오류가 발생합니다.

TypeError: 'range' object is not an iterator

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



답변

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


답변