엄밀하게 애기하면, range
는 숫자들의 immutable sequence를 나타내는 built-in type이다.
즉, 흔히 built-in function으로 애기하는 range()
는 사실은 range
class의 instance를 생성하는 생성자에 해당한다.
sequence
는 index를 통해 접근 가능한,
즉 item들이 놓여있는 순서가 의미를 가지는 자료구조를 추상화한 것이다.
https://dsaint31.tistory.com/569#Sequence
0에서 19까지 1씩 증가하는 list
를 만드는 방법에서
range
와 list
생성자를 다음과 같이 사용한다.
a = list(range(0,20,1)) # list(range(20))
range
의 생성자에서 paramerter들은 다음과 같음.
- 첫번째 parameter는
start
로 sequence의 첫번째 item에 해당하는 숫자임. - 두번째 parameter는
stop
으로 해당 숫자보다 하나 적은 숫자가 sequence의 마지막 item이 된다.
(negative step의 경우엔 하나 큰 숫자가 마지막 item이 됨. 즉, exclusive임) - 세번째 parameter는
step
으로 sequence에서 인접한 item들 간의 차이가 얼마나 되는지를 나타낸다.
흔히 argument를 하나만 줄 경우, start=0
, step=1
로 기본 할당되고, 주어진 argument는 stop
으로 동작한다.
argument가 두 개 주어질 경우, step=1
로 기본 할당되고 나머지 parameter들은 순서대로 argument를 값으로 가진다.
참고로 range의 arguments들은 sequence type의 객체들의 slicing과 매우 유사하다.
-1
이 sequence type의 위치를 나타내는 데 사용되는 경우, 맨 마지막 위치를 가르킴.-1
이 step으로 사용될 경우, 역순으로 iterate가 이루어짐.
range의 생성자는 integer만을 argument로 받는다.
for loop 와의 활용.
10회 반복이나 7회 반복 등이 요구되는 반복문을 만들 때, for
loop와 range
는 자주 같이 사용된다.
for
statement는iterable
객체의 item들을 iterate하는 loop structure임.range
는for
statement에서 많이 사용되는 "숫자들로 구성된iterable
객체"를 효과적으로 제공해준다.range
는 class로 일종의generator
처럼 동작함.
0~9까지의 수행을 원한다면 다음과 같이 구성된다.
for i in range(10):
print(i)
# 반복될 코드 블럭
1부터 수행한다면 range(1,11)
을 사용하여 1~10까지 수행되도록 할 수 있다.
참고로 programming에서는 sequence등에 접근할 때 index를 0부터 사용하는 것이 관례 (zero-based numbering)이다.
Matlab 등의 특이한 경우를 제외하고는 0부터 counting을 하기 때문에 여기에 익숙해지는 것이 좋다.
enumerate 사용하기
for
loop에서 현재 iteration 횟수(또는 현재 item의 index)를 명시적으로 확인해야하는 경우에
사용되는 함수(built-in function)이다.
Python의 enumerate 함수는
반복 가능한(iterable) 객체를 입력받아,
각 item(요소)를 순회하면서
index와 함께 item를 반환하는 enumerater 객체를 생성
enumerate
함수는 enumerater
object를 반환해주면서
각 반복에서 argument로 넘겨준 iterable의 item과 함께
해당 item의 index에 해당하는 int의 숫자를 반환해준다.
(index와 argument를 묶은 tuple
를 __next__()
호출마다 반환한다.)
a = ['one', 'two', 'three', 'four'] # list is an iterable object.
for t in enumerate(a):
idx = t[0]
item = t[1]
print(f'iteration {idx}: {item}')
# 다음 코드 형태로 더 많이 이용됨.
# for idx,item in enumerate(a):
# print(f'iteration {idx}: {item}')
참고로 enumerate(a, 8)
이라고 바꾸면, index가 8부터 시작한다.
index만 필요한 경우엔 다음과 같은 방법을 추천한다.
for idx, _ in enumerate(iterator):
do_something(idx)
# 아래도 같은 동작이지만, Pythonic way가 아님: 비추천
for idx in range(len(iterator)):
do_something(idx)
References
https://docs.python.org/3.6/library/stdtypes.html#ranges
https://docs.python.org/3.6/library/functions.html?highlight=enumerate#enumerate
https://gist.github.com/dsaint31x/5bbd005845eeb7a92e2537cf5036769e
'Programming' 카테고리의 다른 글
[Python] Python Script File 실행해보기 (0) | 2023.06.09 |
---|---|
[Programming] Application Programming Interface (API) (0) | 2023.06.08 |
[Python] Iterable and Iterator, plus Generator (1) | 2023.06.07 |
[Python] List Comprehension (0) | 2023.06.06 |
[Python] Assignment와 Shallow Copy, Deep Copy (0) | 2023.06.05 |