티스토리 뷰

반응형

python에는 for문과 짝지어서 자주 나타나는 구문이 있으니, range이다.

 

그러나, 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 생성자로 전달된다.

 

  1. start : 시작 정수, 기본값 0으로 설정되어있음.
  2. stop : 끝 정수(미만), 만약 주어지지 않을 경우 ValueError 발생
  3. 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(15)))
# [0, 1, 2, 3, 4]
print(list(range(0204)))
# [0, 4, 8, 12, 16]
print(list(range(0104)))
# [0, 4, 8]
print(list(range(0-10-2)))
# [0, -2, -,4, -6, -8]
print(list(range(0)))
# []
print(list(range(102)))
# []
cs

 

아래의 예시는 잘못된 range의 사용 예시이다.

 

1
2
3
4
5
6
7
8
9
10
print(list(range(1.1)))
# 오류! range의 인자는 모두 정수여야 함
print(list(range(1100.5)))
# 오류! range의 인자는 모두 정수여야 함
print(list(range(110**201)))
# 오류! 정수형의 범위를 한참 벗어난 수가 입력될 경우 오버플로우 발생 가능
# 다만, 인자의 값이 정수형이 최대로 담을 수 있는 수보다 넘어도 됨
 
print(list(range(1246)))
# 오류! 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(0102)
# [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(0102)
ra2 = range(2205)
 
print(ra == ra2)
# False
 
print(ra + ra2)
# 오류! 이어 붙이기 불가능
 
print(ra * 3)
# 오류! 반복 불가능
cs

도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍

지적이나 오타 수정 댓글 환영합니다!!

 

 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
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
글 보관함