Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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는 메일링 리스트 포럼에서 이루어진 논의를 요약하며, 적절한 경우 추가 정보를 위한 URL을 제공합니다. 이 파일의 CVS 리비전 이력에는 확정적인 역사적 기록이 담겨 있습니다.

동기

파이썬의 표준 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> in 절 대신 사용할 수도 있는 선택적 <variable> indexing 절을 추가하여 for 루프의 구문을 확장합니다.

따라서 시퀀스의 인덱스에 대해 순회하는 것은 다음과 같이 됩니다:

for i indexing sequence:
    # work with index i

인덱스와 요소 모두에 대해 순회하는 것도 마찬가지입니다:

for i indexing e in sequence:
    # work with index i and element e

내장 함수 indicesirange

이 해결책은 indicesirange라는 두 개의 내장 함수를 추가합니다. 이들의 의미는 다음과 같이 설명할 수 있습니다:

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의 일반적인 사용을 방해하지 않는다는 점에 유의하십시오.

하위 호환성 문제

새로운 키워드가 추가되지 않고 기존 코드의 의미가 변경되지 않으므로, 세 가지 해결책 모두 기존 코드를 손상시키지 않고 구현할 수 있습니다.

References