스택큐힙리스트

만약 range()가 Python 3.3에서 제너레이터라면, 왜 range에 next()를 호출할 수 없을까요? 본문

카테고리 없음

만약 range()가 Python 3.3에서 제너레이터라면, 왜 range에 next()를 호출할 수 없을까요?

스택큐힙리스트 2023. 11. 25. 11:25
반응형

어쩌면 나는 웹에서의 잘못된 정보에 속아들었을 수도 있지만, 아마도 뭔가를 잘못 이해한 것 같습니다. 지금까지 배운 내용에 따르면, range()는 제너레이터이며, 제너레이터는 반복자로 사용할 수 있습니다. 그러나 이 코드:


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

아래와 같은 오류를 발생시킵니다:


TypeError: 'range' object is not an iterator

여기서 무엇을 놓쳤을까요? 나는 0을 출력하고, myrange의 다음 값으로 이동하길 기대하고 있었습니다. 파이썬 초보라서 이렇게 기초적인 질문을 해서 죄송합니다만, 다른 곳에서 잘 설명된 내용을 찾을 수 없었습니다.

답변 1

range는 변경할 수 없는 반복 가능한 객체의 클래스입니다. 그들의 반복 동작은 list와 비교될 수 있습니다: 직접적으로 next를 호출할 수 없으며, iter를 사용하여 반복자를 가져와야 합니다.


그러므로, range는 생성자(generator)가 아닙니다.


아마도 왜 그것을 반복자로 만들지 않았을까? 생각하실 수도 있습니다. 하지만, range는 이와 같이 불가능한 유용한 속성들이 있습니다:



  • 변경할 수 없으므로 딕셔너리 키로 사용할 수 있습니다.

  • start, stop, step 속성들(since Python 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은 범위에 없습니다
>>> it = iter(myrange)
>>> it
<range_iterator 객체 (0x7f504a9be960) >
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5

답변 2

range() 함수는 Python 3.3 버전부터 제너레이터로 사용되고 있습니다. 그러나 왜 range() 함수에 next()를 호출할 수 없는지 알아보도록 하겠습니다. 이 문제에 대해 올바른 이해를 위해 Python의 반복자(iterator)에 대해 먼저 이해할 필요가 있습니다.
반복자는 값을 차례로 생성해주는 용도로 사용되는 객체입니다. 값을 하나씩 반환하며 다음 값을 생성하거나 반복할 수 있습니다. range() 함수는 반복 가능한 객체(iterable)를 생성하기 때문에, 내부적으로는 이터레이터(iterator)를 지원하고 있지만, 직접적으로 반복자는 아닙니다.
이터레이터와 반복자는 비슷한 개념이지만 조금 다릅니다. 이터레이터는 next() 함수를 호출하여 다음 값을 얻을 수 있는 객체입니다. 즉, 이터레이터는 반복 가능한 객체의 요소에 접근하는 데 사용될 수 있습니다. 그러나 range() 함수는 이터러블한(iterable) 객체를 반환하는데, next() 함수로 다음 값을 얻을 수 없습니다.
일반적으로 range() 함수는 반복문에서 사용되는 용도로 주로 사용됩니다. 예를 들어 for문에서 사용하면 범위 내의 모든 값을 순차적으로 액세스할 수 있습니다. range() 함수의 반환 값은 이터러블한 객체이기 때문에 for 루프와 같은 반복문에 직접 사용할 수 있습니다. 그리고 반복문 내에서는 자동으로 이터레이터 역할을 합니다.
따라서, range()의 결과를 직접적으로 next() 함수로 호출할 수 없습니다. 대신에 반복문을 통해 값을 차례대로 액세스하는 방식으로 사용할 수 있습니다. 이는 Python 개발자들이 코드를 보다 가독성 있게 작성하고, 오류 가능성을 줄이기 위해 선호하는 방식입니다.
결론적으로, range() 함수는 Python 3.3 버전 이후부터 이터러블 객체를 반환하지만 직접적인 반복자는 아닙니다. 이 함수는 반복문과 같은 반복 구조에서 사용하기 위해 최적화된 방식으로 설계되었습니다. 따라서 next() 함수를 사용하려면 for 루프를 통해 값을 차례로 액세스해야 합니다.

반응형
Comments