아마도 나는 웹상의 잘못된 정보의 희생양이되었을 수도 있지만, 단지 내가 무언가를 오해했을 가능성이 더 크다고 생각합니다. 지금까지 배운 내용에 따라 range ()는 생성기이고 생성기는 반복기로 사용할 수 있습니다. 그러나이 코드 :
myrange = range(10)
print(next(myrange))
이 오류가 발생합니다.
TypeError: 'range' object is not an iterator
내가 여기서 무엇을 놓치고 있습니까? 나는 이것이 0을 인쇄하고 myrange
. 저는 Python을 처음 사용하므로 다소 기본적인 질문에 대한 사과를 받아들이십시오.하지만 다른 곳에서는 좋은 설명을 찾을 수 없습니다.
답변
range
불변의 반복 가능한 객체의 클래스입니다. 반복 동작은 list
s 와 비교할 수 있습니다 next
. 직접 호출 할 수 없습니다 . 사용하여 반복자를 가져와야합니다 iter
.
그래서 아니, range
발전기가 아닙니다.
“왜 직접 반복 가능하게 만들지 않았는지”라고 생각할 수 있습니다. 글쎄, range
s는 그렇게 할 수없는 몇 가지 유용한 속성을 가지고 있습니다.
- 변경이 불가능하므로 사전 키로 사용할 수 있습니다.
- 그들은이
start
,stop
그리고step
(파이썬 3.3부터) 속성count
과index
방법을 그들은 지원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