파이썬에서 반복문을 사용할 때 무엇을 사용하시나요?
아마 for i in range(n) 이 바로 떠오를 겁니다.
#1
list0 = []
for i in range(10):
list0.append(i)
print(list0)
[0, 1, 2, 3, 4, 5, 6,7 ,8 ,9]
이제 반복문을 이용해 리스트를 순회하려고 합니다.
어떻게 해야할까요?
#2
for i in range(10):
print(list0[i], end = ' ')
0 1 2 3 4 5 6 7 8 9
range를 통해 i 값을 0~9로 할당하면서 list0의 인덱스로 활용하여 리스트의 value를 순회했습니다.
이 방법도 좋습니다.
하지만 더욱 pythonic한 방법이 있습니다.
#3
for num in list0:
print(num, end = ' ')
0 1 2 3 4 5 6 7 8 9
이 코드는 list0를 순회하며 각 value들을 num 변수에 직접 할당합니다.
iteratable data structure가 있으면, 이 시퀀스에 대해 직접 순회가 가능합니다.
#2 코드와 비교했을 때, 더 직관적이고 깔끔한 코드가 되었습니다. 또 list0의 길이를 알 필요가 없어졌습니다.
- iteratable data structure : 하나 이상의 데이터들이 sequential 방식으로 연결되어 있는 데이터 구조. 여기서 sequential : 메모리에서 물리적으로 연결이 되어 있는
ex) list, tuple, dirtionary, set 등.- sequnce : iteratable data structure의 각 객체
자 그럼, 반복문 내에서 이 시퀀스들의 인덱스를 같이 사용하고 싶으면 어떻게 해야할까요?
#4
for i in range(10):
print(f'{i} = {list0[0]}')
네 다시 #2 방식으로 돌아가서 이렇게 하면 되겠죠.
그런데 제가 실수를 했네요.
list0의 인덱스 자리에 i를 써야하는데 말이죠.
#5
for i in range(10):
print(f'i = list0[i]')
이처럼 이 방식은 실수하기도 쉽고, 디버깅하기도 어렵습니다.
또한 리스트 길이도 알아야하죠.
이럴 때, 강력한 method가 enemerate 입니다.
#6
for i, num in enumerate(list0):
print(f'{i} = {num}')
아주 간결하고 직관적으로 바뀌었죠?
enumerate() 메소드는 튜플로 (index, value) 값을 반환합니다.
for 루프로 (i, num)은 enumerate 함수의 반환값을 언패킹하여 각각 i=index, num=value로 할당됩니다.
라이브러리 코드 혹은 매우 복잡한 코드들을 보면 대부분의 반복문들은 enumerate로 작성된 것을 볼 수 있습니다.