티스토리 뷰
python에는 for문과 짝지어서 자주 나타나는 구문이 있으니, range이다.
그러나, range가 에 대한 정확한 내용을 아는 것과 모르는 것은 큰 차이를 보인다고 생각한다.
이번 포스팅을 통해 range에 대하여 알아보자.
1. range
range는 파이썬의 기본 class의 한 종류이다. 흔히 for문과 같이 따라다녀 함수나 하나의 자료형으로 착각하는 python 이용자들이 많은데, python3 이후부터 range는 엄연한 CLASS이다. 다만, python2에서 range에 대응되는 xrange는 함수이다.
정확히 말하면, 시퀀스 형의 한 종류인 클래스라 할 수 있다. (다른 말로, list, tuple과 결이 비슷하다.)
흔히 "~부터 ~까지"의 정수를 하나씩 사용하는 데 자주 사용되며, 다음과 같은 syntax를 넣어주어서 사용 가능하다.
range(start, stop, step)
range는 3개의 인자를 받을 수 있다. 3개의 인자는 range 생성자로 전달된다.
- start : 시작 정수, 기본값 0으로 설정되어있음.
- stop : 끝 정수(미만), 만약 주어지지 않을 경우 ValueError 발생
- step : 각 정수간 간격, 기본값 1로 설정되어 있음.
만약 1개의 인자가 입력된다면 stop에 들어간다. (range(stop) = range(0, stop, 1))
만약 2개의 인자가 입력된다면 순서대로 start, stop에 들어간다. (range(start, stop) = range(start, stop, 1))
step이 양수인 경우, range의 데이터는
$r[i] = start + step*i \quad (i \geq 0,\,r[i] < stop)$ 과 같이 생성되고,
step이 음수인 경우, range의 데이터는
$r[i] = start + step*i \quad (i \geq 0,\,r[i] > stop)$ 과 같이 생성된다.
만약, 초기 조건이 맞지 않는다면 (ex. range(1, 3, 5)), 빈 객체를 생성한다.
다음은 모두 객체로 생성 가능한 range의 예시이며, 이를 list형으로 바꾸고 출력하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | print(list(range(5))) # [0, 1, 2, 3, 4] print(list(range(1, 5))) # [0, 1, 2, 3, 4] print(list(range(0, 20, 4))) # [0, 4, 8, 12, 16] print(list(range(0, 10, 4))) # [0, 4, 8] print(list(range(0, -10, -2))) # [0, -2, -,4, -6, -8] print(list(range(0))) # [] print(list(range(1, 0, 2))) # [] | cs |
아래의 예시는 잘못된 range의 사용 예시이다.
1 2 3 4 5 6 7 8 9 10 | print(list(range(1.1))) # 오류! range의 인자는 모두 정수여야 함 print(list(range(1, 10, 0.5))) # 오류! range의 인자는 모두 정수여야 함 print(list(range(1, 10**20, 1))) # 오류! 정수형의 범위를 한참 벗어난 수가 입력될 경우 오버플로우 발생 가능 # 다만, 인자의 값이 정수형이 최대로 담을 수 있는 수보다 넘어도 됨 print(list(range(1, 2, 4, 6))) # 오류! range는 최대 3개의 인자까지만 받을 수 있음. | cs |
range를 쓰는 또 다른 이유는 range에서도 list, tuple에서 사용되는 연산들을 적용할 수 있다. 인덱스 찾기, 인덱스 슬라이싱, 포함/미포함 여부, 동일 여부 모두 확인할 수 있다.
이에 구체적인 예시를 들으면 다음과 같다.
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 | ra = range(0, 10, 2) # [0, 2, 4, 6, 8] print(ra) # range(0, 10, 2) print(2 in ra) # True print(20 in ra) # False print(ra.index(4)) # 2 print(ra[2]) # 4 print(ra[1:3]) # [2, 4] print(ra[::-1]) # [8, 6, 4, 2, 0] 이므로 'range(8, -2, -2)'를 출력한다. print(ra[-2]) # 6 | cs |
두 range 동일 여부 확인 시에는 두 range 객체 안의 원소가 모두 같은 지 비교한다. (python 3.3 버젼까지는 동일한 객체 인자를 가지고 있는 지를 확인하였지만, 이후에는 안의 원소를 비교한다.)
따라서, range(0, 10, 3)와 range(0, 11, 3)은 동일하다고 할 수 있다. 또한, range(0)과 range(2, 1, 4)도 동일하다고 할 수 있다.
다만, list 또는 tuple과는 다르게 두 range 간의 이어 붙이기와 반복은 불가능하다.
1 2 3 4 5 6 7 8 9 10 11 | ra = range(0, 10, 2) ra2 = range(2, 20, 5) print(ra == ra2) # False print(ra + ra2) # 오류! 이어 붙이기 불가능 print(ra * 3) # 오류! 반복 불가능 | cs |
도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍
지적이나 오타 수정 댓글 환영합니다!!
'Python' 카테고리의 다른 글
[Python] "100000000000000000 in range(100000000000000001)"이 0.1초 이상 걸린다고 생각하면 들어오세요. (0) | 2022.05.06 |
---|---|
[Python] 드디어 파이썬에서도 switch-case문이? match-case문에 대하여 알아보자! (0) | 2022.04.23 |
[Python] else문에 관한 깊은 고찰 (if-else vs. for-else / while-else를 중심으로) (0) | 2022.04.22 |
[Python] if-else 뿐만 아니라 for-else / while-else도 가능하다고? (0) | 2022.04.22 |
[Python] 정렬 메서드 sort()에 관한 모든 것 (0) | 2022.04.21 |
- Total
- Today
- Yesterday
- 구현
- 수학
- 문자열
- Proactor
- 제어문
- Network
- GDSC
- 시간복잡도
- equal
- 사칙연산
- Max
- JS
- effective async
- MIN
- C++
- BOJ
- 백준
- BRONZE
- 알고리즘
- Python
- bomblab
- 프로그래밍
- for
- CSAPP
- docker
- react
- 헤더
- C
- 함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |