PEP 212 – 루프 카운터 반복
- Author:
- Peter Schneider-Kamp <nowonder at nowonder.de>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 22-Aug-2000
- Python-Version:
- 2.1
- Post-History:
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
거부 공지
이 PEP는 거부되었습니다. PEP 279에서 도입된 enumerate()가 이 PEP에서 제안한 사용 사례를 다루며, PEP 작성자와는 연락이 닿지 않습니다.
소개
이 PEP는 자주 제안되어 온 기능인 for 루프의 루프 카운터 노출에 관해 설명합니다. 이 PEP는 이 기능의 상태와 담당자를 추적합니다. 이 PEP는 기능에 대한 설명을 담고 있으며, 기능을 지원하는 데 필요한 변경 사항을 개괄합니다. 이 PEP는 메일링 리스트 포럼에서 이루어진 논의를 요약하고, 적절한 경우 추가 정보를 볼 수 있는 URL을 제공합니다. 확정적인 역사적 기록은 이 파일의 CVS 리비전 이력에 담겨 있습니다.
동기
Python의 표준 for 루프는 시퀀스의 요소를 순회합니다 [1]. 대신 인덱스를 순회하거나 요소와 인덱스를 함께 순회하는 것이 바람직한 경우가 많습니다.
이를 위해 흔히 사용되는 관용구는 직관적이지 않습니다. 이 PEP는 인덱스를 노출하는 두 가지 방법을 제안합니다.
루프 카운터 반복
인덱스를 순회하는 현재의 관용구는 내장 함수 range를 사용합니다:
for i in range(len(sequence)):
# work with index i
요소와 인덱스를 함께 순회하려면 기존 관용구를 사용하거나 새 내장 함수 zip을 사용할 수 있습니다 [2]:
for i in range(len(sequence)):
e = sequence[i]
# work with index i and element e
또는:
for i, e in zip(range(len(sequence)), sequence):
# work with index i and element e
제안된 해결책
지금까지 논의된 해결책은 세 가지입니다. 하나는 예약되지 않은 키워드를 추가하고, 다른 하나는 내장 함수 두 개를 추가합니다. 세 번째 해결책은 시퀀스 객체에 메서드를 추가합니다.
예약되지 않은 키워드 indexing
이 해결책은 선택적인 <variable> indexing 절을 추가하여 for 루프의 문법을 확장합니다. 이 절은 <variable> in 절 대신 사용할 수도 있습니다.
따라서 시퀀스의 인덱스를 순회하는 코드는 다음과 같이 됩니다:
for i indexing sequence:
# work with index i
인덱스와 요소를 함께 순회하는 코드도 마찬가지로 다음과 같습니다:
for i indexing e in sequence:
# work with index i and element e
내장 함수 indices와 irange
이 해결책은 indices와 irange라는 두 내장 함수를 추가합니다. 이 함수들의 의미는 다음과 같이 설명할 수 있습니다:
def indices(sequence):
return range(len(sequence))
def irange(sequence):
return zip(range(len(sequence)), sequence)
이 함수들은 즉시(eager) 방식이나 지연(lazy) 방식으로 구현할 수 있으며, 둘 이상의 시퀀스 인자를 받도록 쉽게 확장할 수 있어야 합니다.
이 함수들을 사용하면 인덱스를 순회하는 관용구와 요소와 인덱스를 함께 순회하는 관용구가 단순해집니다:
for i in indices(sequence):
# work with index i
for i, e in irange(sequence):
# work with index i and element e
시퀀스 객체의 메서드
이 해법은 시퀀스에 indices, items, values 메서드를 추가할 것을 제안합니다. 이 메서드들을 사용하면 각각 인덱스만, 인덱스와 요소를 함께, 요소만 순회할 수 있습니다.
이렇게 하면 인덱스를 순회하는 관용구와 요소와 인덱스를 함께 순회하는 관용구가 대폭 간단해질 것입니다:
for i in sequence.indices():
# work with index i
for i, e in sequence.items():
# work with index i and element e
또한 시퀀스와 딕셔너리의 요소를 일관된 방식으로 순회할 수 있게 될 것입니다:
for e in sequence_or_dict.values():
# do something with element e
구현
세 가지 해법 모두 SourceForge에 다소 거친 패치가 올라와 있습니다:
for i indexing a in l: for 루프 카운터 노출 [3]- 내장 함수에
indices()와irange()추가 [4] - listobject에
items()메서드 추가 [5]
이들 모두 BDFL의 판정을 거쳐 거부되었습니다.
indexing 키워드는 문법상 NAME일 뿐이므로 indexing의 일반적인 사용을 방해하지 않는다는 점에 유의하십시오.
하위 호환성 문제
추가되는 키워드가 없고 기존 코드의 의미도 바뀌지 않으므로, 세 가지 해법 모두 기존 코드를 깨뜨리지 않고 구현할 수 있습니다.
Copyright
This document has been placed in the public domain.