program tip

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

radiobox 2020. 11. 21. 14:17
반응형

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

참고 URL : https://stackoverflow.com/questions/13092267/if-range-is-a-generator-in-python-3-3-why-can-i-not-call-next-on-a-range

반응형