반응형
Notice
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 데이터베이스
- 컴퓨터비전
- 클라우드컴퓨팅
- 프로그래밍
- 인공지능
- 딥러닝
- 프로그래밍언어
- 네트워크
- I'm Sorry
- 웹개발
- 데이터과학
- 파이썬
- 소프트웨어
- 소프트웨어공학
- 머신러닝
- Yes
- 데이터구조
- 자바스크립트
- 보안
- 빅데이터
- 알고리즘
- 컴퓨터공학
- 사이버보안
- 디자인패턴
- 데이터분석
- 네트워크보안
- springboot
- 컴퓨터과학
- 자료구조
- 버전관리
Archives
- Today
- Total
스택큐힙리스트
만약 range()가 Python 3.3에서 제너레이터라면, 왜 range에 next()를 호출할 수 없을까요? 본문
반응형
어쩌면 나는 웹에서의 잘못된 정보에 속아들었을 수도 있지만, 아마도 뭔가를 잘못 이해한 것 같습니다. 지금까지 배운 내용에 따르면, 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)과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은 범위에 없습니다
>>> 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