python에서의 범위 표현
30 May 2016
몇주전에 성신님께서 python에서의 범위 표현에 대해 질문하셨었다.
>>> a = [0, 1, 2]
>>> a[0:2]
[0, 1]
인 경우, 어째서 a[0:2]는 [0, 1, 2]가 아닌 [0, 1]인 지 궁금하시다는 것이었다.
python에서 정수 범위를 표현할 때에는 반 열림 구간(half-open interval)을 사용한다. 반 열림 구간은 시작과 끝을 a, b로 한 경우 a <= x < b 인 x(x는 정수)의 집합을 의미한다. 만약, 닫힘 구간을 사용한다면 a <= x <= b인 x의 집합일 것이다.
반 열림 구간을 사용할 때에는 닫힘 구간에 비해 여러가지 장점이 있다.
1. 공집합이나 비어있는 구간을 쉽게 표현할 수 있다.
>>> range(0, 0)
[]
만약 닫힘 구간으로 공집합을 나타내고자 한다면, 아래와 같을 것이다.
>>> range(0, -1)
2. 구간의 끝 값에 시작 값을 빼주면 구간의 크기를 쉽게 알 수 있다.
>>> len(range(10))
10
>>> len(range(1, 10))
9
3. range를 합치는 경우, 훨씬 직관적이다.
>>> range(0, 2) + range(2, 4)
[0, 1, 2, 3]
닫힘 구간을 사용하는 경우에는 아래와 같을 것이다.
>>> range(0, 2) + range(2, 4)
[0, 1, 2, 2, 3, 4]
4. list의 인덱스 범위를 쉽게 표현할 수 있다.
>>> l = [1, 2, 3, 4]
>>> for i in range(0, len(l)):
... print l[i]
이와 같이, 반 열림 구간을 사용하면 여러모로 직관적이고 편리하다. 그럼에도 불구하고 PHP이나 ruby와 같은 몇몇 언어는 닫힘 구간을 사용하는 경우가 있다. 정확한 이유는 모르겠지만, 아마 정수 이외의 값을 range로 다루기 위함이 아닐까 싶다. 실제로 PHP와 ruby에서는 문자의 range를 생성할 수 있다.