[Effective Python] BW 07. range보다는 enumerate를 사용하라

전민수·2023년 4월 27일
0

EffectivePython

목록 보기
2/10

range

파이썬에서 반복문을 사용할 때 무엇을 사용하시나요?
아마 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]')

이처럼 이 방식은 실수하기도 쉽고, 디버깅하기도 어렵습니다.
또한 리스트 길이도 알아야하죠.

enumerate

이럴 때, 강력한 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로 작성된 것을 볼 수 있습니다.

profile
Learning Mate

0개의 댓글