파이썬 next()
메서드 – 가장 세련된 반복자 활용법
Python을 쓰다 보면 이런 상황이 생깁니다:
"리스트에서 조건에 맞는 첫 번째 항목만 딱 꺼내고 싶은데, 어떻게 하지?"
이럴 때 가장 Pythonic하고 세련된 방법이 바로 next()
입니다. 실제로 이 글을 쓰게 된 계기도, 리스트에서 원하는 항목을 깔끔하게 뽑아내는 next()
코드를 쓸 때마다 매번, "와, 이건 정말 우아하다..." 라는 감탄이 나오기 때문입니다.
그래서 제가 개인적으로 아주 좋아하는 코드 중 하나이기도 합니다. Django와 DRF를 좋아하는 저같은 분들에게 필수적인 코드이기도 하지요.
왜 이 메서드가 Django 에서 유용한지는 아래에서 설명을 드리겠습니다.
그만큼 next()
는 작지만 강력한 도구입니다. 사용법도 어렵지 않지만, 한 번도 써보지 않은 사람에게는 낯설게 느껴질 수 있기 때문에, 이 글에서는 아주 친절하게 설명드려보겠습니다.
next()
의 본질: 이터레이터의 다음 값을 요청하는 함수
먼저 개념부터 잡고 갑시다.
next(iterator[, default])
iterator
: 반복 가능한 객체에서.next()
를 호출할 수 있는 이터레이터default
: 반복이 끝났을 때StopIteration
예외 대신 반환할 기본값- 반환값: 이터레이터에서 다음 값을 하나 꺼냄
예시:
it = iter([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
print(next(it)) # StopIteration 예외 발생
예외 방지:
print(next(it, '끝')) # 기본값 반환 → '끝'
자, 여기까지 이해하셨다면 next()
는 이터레이터를 한 단계씩 진행시키는 도구라는 것을 알 수 있어요. 그런데 이것만으로는 아직 실전에서의 쓰임새가 잘 와닿지 않죠? 이제부터 진짜 매력을 보여드릴게요.
실전 예제 – 리스트에서 조건에 맞는 첫 항목 꺼내기
users = [
{'id': 1, 'name': 'Alice'},
{'id': 2, 'name': 'Bob'},
{'id': 3, 'name': 'Charlie'},
]
user = next((u for u in users if u['id'] == 2), None)
print(user) # {'id': 2, 'name': 'Bob'}
이 구문을 처음 접했을 때의 인상은 정말 강렬했어요. 너무 간결하고 세련됐거든요. for
루프를 쓰면 4~5줄짜리 코드가, 단 한 줄로 정리됩니다. 그리고 이건 단순히 짧아서 좋은 게 아니라 의도가 명확하게 드러나는 코드라는 점에서 훨씬 우월합니다.
이 방식이 멋진 이유는?
- 한 줄에 조건과 검색이 모두 담긴다
- 결과가 없을 경우
None
을 반환하게 되어 안전하다 for
루프 없이 간결하다 (하지만 내부적으로는for
와 동일한 반복 수행)
이 구문은 특히 초보자에게는 “오 이런 표현도 가능해?” 라는 감탄을 자아내고, 중급자에게는 “이건 반드시 내 레퍼토리에 넣어둬야겠다” 싶은 코드예요.
dict.get()
과 비교해보기 – 단순 키 검색 vs 조건 검색
my_dict = {'name': 'Alice', 'age': 30}
my_dict.get('age') # 30
my_dict.get('city', '없음') # '없음'
이처럼 dict.get()
은 정해진 키가 있는 경우에 아주 유용하죠. 하지만 next()
는 리스트 안의 딕셔너리처럼, 조건을 걸어 특정 항목을 찾아야 하는 상황에서 진가를 발휘합니다.
user = next((u for u in users if u['name'].startswith('C')), None)
이렇게 하면 name
이 C로 시작하는 첫 사용자를 찾을 수 있습니다. .get()
으로는 절대 불가능한 조건 기반의 접근이죠.
Django와 next() – 실제로 많이 씁니다
Django에서 QuerySet
은 이터러블이지만 지연 평가(lazy evaluation)입니다. 따라서 먼저 list()
로 강제로 평가해야 합니다. 그 이후에 조건 검색을 하는 데 next()
가 매우 유용하죠.
qs = list(MyModel.objects.filter(active=True))
item = next((obj for obj in qs if obj.name == '홍길동'), None)
이 방식은 다음과 같은 상황에서 유용합니다:
- filter()
로는 충분히 좁혀졌지만, 최종 조건이 복잡하거나 동적일 때
- .first()
로 처리할 수 없는 사용자 정의 조건이 있을 때
- 반복문 없이 단순히 한 개만 빠르게 꺼내고 싶을 때
실제로 저도 Django 개발을 하면서 .first()
로 못 잡는 조건들을 다룰 때 이 방법을 자주 씁니다. 코드를 읽는 동료들도 이 표현을 보면 의미를 바로 이해할 수 있어서 협업에도 좋아요.
사용 팁 요약
next((x for x in iterable if 조건), None)
형태를 눈으로 외워두세요.- 반환이 없을 수 있으므로
default
값은 꼭 지정하는 습관을 들이세요. dict.get()
은 키 검색,next()
는 조건 검색이라고 외워두면 좋습니다.- 반복 가능한 모든 객체(iterable)에서 사용할 수 있습니다.
- 너무 남용하지 마세요 – 복잡한 조건은 차라리
for
문이 더 명확할 수도 있어요.
마무리 – 코드를 아름답게 만드는 작은 도구
next()
는 단순한 함수처럼 보이지만, Python의 반복자 철학이 담긴 매우 강력한 도구입니다. 특히 리스트에서 조건에 맞는 첫 항목을 뽑고 싶을 때 이보다 더 직관적이고 간결한 표현은 드뭅니다.
이 글을 통해 여러분도 “아, 나도 저 코드 써보고 싶다”는 생각이 드셨다면, 이미 반쯤은 익숙해진 거예요. 이제부터는 직접 몇 번 써보며 몸에 익히기만 하면 됩니다.
앞으로도 간단하면서도 멋진 파이썬 코드를 종종 소개드릴 예정입니다. 😊
Add a New Comment