주변에 개발하는 친구들 보면 가끔 아주 간단한 포인트를 놓치고 어렵게 다가가는 경우를 본적이 있습니다. 쉬운 길이 있음에도 훨씬 더 복잡하고 어려운 해결방법을 찾는 경우가 있지요.
저도 한때 그랬는데, 대표적인 문제가 아래와 같은 코드에서 person 앞에 인덱스를 붙여 출력하고 싶었던 것입니다.
import os
persons = ['mother', 'father', 'gentleman', 'sexy lady']
for person in persons :
print(person)
# 원하는 출력
# 1. mother
# 2. father
# 3. gentleman
# 4. sexy lady
그래서 잠깐 고민하다가 아래처럼 코드를 짯었는데, 참 바보같은 짓이죠? 네 결과는 나옵니다. 그러나 이렇게 짜려면 파이선의 1%만 이용하는 것이지요.
import os
persons = ['mother', 'father', 'gentleman', 'sexy lady']
idx = 0
for person in persons :
idx += 1
print(idx, person)
# 원하는 출력
# 1. mother
# 2. father
# 3. gentleman
# 4. sexy lady
모든 이터레이터블한 객체 - 쉽게 말해 반복가능한 객체, 리스트와 같은 - 에는 enumerate 라는 함수가 정의되어 있고, 이 함수를 쓰면 객체안의 항목을 하나씩 꺼내어 인덱스와 함께 돌려줍니다.
딱 원하는 방식이죠? 아까 쓴 idx 를 정의하고 증가시키는 코드를 주석처리하고, for 문의 persons 객체에 enumerate 를 적용합니다. 그럼 꺼내지는 것이 바로 리턴된 항목과 그 항목의 인덱스가 됩니다.
import os
persons = ['mother', 'father', 'gentleman', 'sexy lady']
# idx = 0
for idx, person in enumerate(persons) :
# idx += 1
print(idx, person)
# 원하는 출력
# 1. mother
# 2. father
# 3. gentleman
# 4. sexy lady
짜잔 그래서 출력은 다음과 같이 원하는 대로 나오게 됩니다. 참 쉽죠잉?
C:\Python3.8.1-PyCharm\venv\Scripts\python.exe C:/Python3.8.1-PyCharm/sample/sampleFor.py
0 mother
1 father
2 gentleman
3 sexy lady
Process finished with exit code 0
그래서 저는 모든 for 문의 반복객체에는 무조건 enumerate 를 씁니다. 인덱스가 필요하던 필요없던 말이지요. 필요없으면 안쓰면 되니까요. 아래처럼 인덱스 변수를 _ 로 설정하고 그냥 무시하면 됩니다. :)
import os
persons = ['mother', 'father', 'gentleman', 'sexy lady']
for _, person in enumerate(persons) :
print(person)
다음과 같은 리스트 형태도 반복가능한 객체이기 때문에 enumerate 의 사용이 가능합니다.
import os
numbers = (23,45,67,89,13,51,68)
for idx, number in enumerate(numbers) :
print(idx,':', number)
결과로는 아래처럼 인덱스와 각 인덱스에 맞는 숫자가 나오게 됩니다. 참 쉽죠잉?
C:\Python3.8.1-PyCharm\venv\Scripts\python.exe C:/Python3.8.1-PyCharm/sample/sampleFor.py
0 : 23
1 : 45
2 : 67
3 : 89
4 : 13
5 : 51
6 : 68
Process finished with exit code 0
이상으로 for 문의 enumerate 에 대하여 알아보았습니다. 자바에도 발전된 for 문이 있는데, 그보다 파이선의 문법이 훨씬 더 직관적인듯 합니다. :)