일반적으로 많은 프로그래밍 언어의 경우, i,j,k와 같은 인덱스(index) 변수를 증가시키면서 for loop를 돌림 (나도 그랬음...🥲)
하지만 파이썬에서는 enumerate()라는 내장함수를 통해 인덱스 변수를 사용하지 않고 루프를 돌리는 방식이 선호되며, 이는 Pythonic(=파이썬다운ㅎㅎ)이다!!!
# 01. 인덱스, 원소 출력
>>> i = 0
>>> for letter in ['A', 'B', 'C']:
... print(i, letter)
... i += 1
...
0 A
1 B
2 C
# 틀린 방법은 아니지만 i 변수가 for 반복문이 종료된 이후에도 네임 스페이스에 남아있기 때문에 이상적이지는 않음
# 02. range()와 len() 내장 함수를 이용하여 만든 인덱스 목록을 대상으로 루프를 돌리는 것
>>> letters = ['A', 'B', 'C']
>>> for i in range(len(letters)):
... letter = letters[i]
... print(i, letter)
...
0 A
1 B
2 C
# 파이썬 답지(Pythonic) 않아 보이는 방법
# 01. iter, next
>>> iter_letters = iter(['A', 'B', 'C'])
>>> next(iter_letters)
'A'
>>> next(iter_letters)
'B'
>>> next(iter_letters)
'C'
# 파이썬에서 for 문은 내부적으로 in 뒤에 오는 목록을 대상으로 계속해서 next() 함수를 호출하고 있다고 생각할 수 있음
# 일반 리스트를 iter() 함수에 넘겨 반복자(iterator)로 만든 후 next() 함수를 호출해보면 원소들이 차례로 얻어지는 것을 알 수 있음
# 02. enumerate, tuple
>>> enumerate_letters = enumerate(['A', 'B', 'C'])
>>> next(enumerate_letters)
(0, 'A')
>>> next(enumerate_letters)
(1, 'B')
>>> next(enumerate_letters)
(2, 'C')
# enumerate() 함수를 호출한 결과를 대상으로 next() 함수를 계속해서 호출해보면, 인덱스와 원소의 쌍이 튜플(tuple)의 형태로 차례로 얻어지는 것을 알 수 있음
# 03. list, enumerate
>>> list(enumerate(['A', 'B', 'C']))
[(0, 'A'), (1, 'B'), (2, 'C')]
# *** enumerate() 함수는 인자로 넘어온 목록을 기준으로 인덱스와 원소를 차례대로 접근하게 해주는 반복자(iterator) 객체를 반환해주는 함수 ***