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는 기능에 대한 설명을 담고 있으며, 기능을 지원하는 데 필요한 변경 사항을 개괄합니다. 이 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의 일반적인 사용을 방해하지 않는다는 점에 유의하십시오.

하위 호환성 문제

추가되는 키워드가 없고 기존 코드의 의미도 바뀌지 않으므로, 세 가지 해법 모두 기존 코드를 깨뜨리지 않고 구현할 수 있습니다.

References