파이썬 next() 메서드 – 가장 세련된 반복자 활용법

Python을 쓰다 보면 이런 상황이 생깁니다:

"리스트에서 조건에 맞는 첫 번째 항목만 딱 꺼내고 싶은데, 어떻게 하지?"

이럴 때 가장 Pythonic하고 세련된 방법이 바로 next()입니다. 실제로 이 글을 쓰게 된 계기도, 리스트에서 원하는 항목을 깔끔하게 뽑아내는 next() 코드를 쓸 때마다 매번, "와, 이건 정말 우아하다..." 라는 감탄이 나오기 때문입니다. 그래서 제가 개인적으로 아주 좋아하는 코드 중 하나이기도 합니다. Django와 DRF를 좋아하는 저같은 분들에게 필수적인 코드이기도 하지요.
왜 이 메서드가 Django 에서 유용한지는 아래에서 설명을 드리겠습니다.

그만큼 next()는 작지만 강력한 도구입니다. 사용법도 어렵지 않지만, 한 번도 써보지 않은 사람에게는 낯설게 느껴질 수 있기 때문에, 이 글에서는 아주 친절하게 설명드려보겠습니다.


next()의 본질: 이터레이터의 다음 값을 요청하는 함수

next() iterator flow diagram

먼저 개념부터 잡고 갑시다.

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의 반복자 철학이 담긴 매우 강력한 도구입니다. 특히 리스트에서 조건에 맞는 첫 항목을 뽑고 싶을 때 이보다 더 직관적이고 간결한 표현은 드뭅니다.

이 글을 통해 여러분도 “아, 나도 저 코드 써보고 싶다”는 생각이 드셨다면, 이미 반쯤은 익숙해진 거예요. 이제부터는 직접 몇 번 써보며 몸에 익히기만 하면 됩니다.

앞으로도 간단하면서도 멋진 파이썬 코드를 종종 소개드릴 예정입니다. 😊