enumerate()

ddurru·2024년 12월 5일

for loop와 enumerate()

일반적으로 많은 프로그래밍 언어의 경우, i,j,k와 같은 인덱스(index) 변수를 증가시키면서 for loop를 돌림 (나도 그랬음...🥲)

하지만 파이썬에서는 enumerate()라는 내장함수를 통해 인덱스 변수를 사용하지 않고 루프를 돌리는 방식이 선호되며, 이는 Pythonic(=파이썬다운ㅎㅎ)이다!!!

for loop

  • for <원소> in <목록>:
    • <목록>
      • 리스트(list), 튜플(tuple), 문자열(string), 반복자(iterator), 제너레이터(generator) 등 순회가 가능한 왠만한 모든 데이터 타입을 사용할 수 있음
    • <원소>
      • 순회 변수(loop variable)
      • <목록> 부분에 넘긴 객체가 담고 있는 원소들이 루프가 도는 동안 하나씩 차례로 할당
# 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) 않아 보이는 방법

enumerate()

  • 좀 더 파이썬답게 인덱스(index)와 원소를 동시에 접근하면서 루프를 돌릴 수 방법
  • 파이썬 내장함수로 for 문의 in 뒷 부분을 enumerate() 함수로 한 번 감싸주기
  • enumerate() 함수는 기본적으로 인덱스와 원소로 이루어진 튜플(tuple)을 만들어줌
  • 인덱스와 원소를 각각 다른 변수에 할당하고 싶다면 인자 풀기(unpacking)를 해줘야 함
# 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) 객체를 반환해주는 함수 ***

참고

(1) 파이썬의 enumerate() 내장 함수로 for 루프 돌리기

profile
2024.04.15 ~

0개의 댓글