2010-07-08 2 views
5

이 질문은 다소 길어질 수 있으므로 사전에 사과드립니다.과도한 위치 인수, 인수 목록 또는 튜플 풀기 및 반복 가능한 반복 포장

우리는 다음과 같은 세 가지 경우에 *를 사용할 수 있습니다 파이썬에서

:

I. 우리는 인수의 임의의 번호로 호출되고 싶어하는 기능 등 in this example 등의 정의 :

def write_multiple_items(file, separator, *args): 
    file.write(separator.join(args)) 

이 경우 초과 위치 인수는 튜플으로 수집됩니다.

II.

>>> range(3, 6)    # normal call with separate arguments 
[3, 4, 5] 
>>> args = [3, 6] 
>>> range(*args)   # call with arguments unpacked from a list 
[3, 4, 5] 

III를 : 인수가 목록 또는 튜플 중 하나에서 이미 우리는 in this example 별도의 위치 인수를 필요로하는 함수 호출을 풀고하고자 할 때 그 반대의 경우이다. 파이썬 3부터은 * 또한 튜플 in this example로 확장 목록 또는 튜플 풀기의 맥락에서 사용된다

>>> a, *b, c = range(5) 
>>> b 
[1, 2, 3] 

또는리스트를 들어

>>> [a, *b, c] = range(5) 
>>> b 
[1, 2, 3] 

를 둘다 경우에 따라, 언팩 된 반복 가능 항목 중 모든 필수 표현식에 지정되지 않은 모든 항목은 목록에 지정됩니다.

그래서 여기에 질문 : 경우 III에 추가 항목이 목록에 할당하는 동안 경우 에 나는, 여분의 인수는 튜플으로 수집. 이 불일치는 언제 발생 했습니까? 논의

가능한 변화가 있었다 :

[...]

는 별표 대상을 확인 튜플 대신 목록으로 내가 찾을 수있는 유일한 설명은 말한다 PEP 3132에 있었다 . 함수의 * args 인 과 일치하지만 과 일치하지만 결과의 처리를 더 어렵게 만듭니다. 일관성의 부족이 문제가 특히 당신이 결과를 처리하기를 원한다면, 당신은 항상 목록의 (b) (위의 예에서 B를 가정 말할 튜플이었다 수 제공하는 교육 학적 관점에서 그러나

,). 내가 놓친 게 있니?

답변

7

파이썬에서 우리는 다음과 같은 세 가지 경우에 *를 사용할 수 있습니다

당신은 물론, 접두사*을 의미 - 중위*이 곱셈에 사용됩니다.

그러나, 교육적 관점에서 일관성 의 부족, 특히 당신이 결과를 처리하기를 원한다면 는 당신이 항상 목록의 (b) (위의 예에서 나 가정 말할 수 주어진 문제가있다 튜플이었습니다). 내가 빠진 것이 있습니까?

저는 설계상의 문제는 (오래된 치아에 아주 오래되었습니다!) 당신이 임의의 인수를 받으면 튜플로 취급하고 있다는 것을 말합니다. 실제의 단점이없는 많은 경우에 유용합니다. 튜플 대신에리스트를 작성하는 경우에 필요하게되는 여분의 처리 및 메모리는, 함수 호출 오버 헤드 (또는 순차 언 패킹)의 문맥에서는 무시할 수 있습니다. 여분의 프로세싱과 메모리가 필요하다. 은 튜플이된다.)

목록이 아닌 튜플로 할 수있는 것은 거의 없습니다. 기본적으로 해시 키 (set 항목이나 dict 키로 사용)가 있습니다. 목록에는 훨씬 더 많은 기능이 있지만, 이 아닙니다. 그것을 변경하기 위해 단지 ... countindex과 같은 방법도 유용합니다.

+0

답해 주셔서 감사합니다. 간단히 말해서 내가 듣고있는 것은 ** ** ** 목록을 제공하도록 설계되어 있어야합니다. –

+0

@Alexandros, 저의 견해입니다.하지만 당연한 생각은 20/20입니다. 그 결정은 ... 11 년 전의 파이썬 1.5.2에서 언제 나왔는지는 잘 모르겠습니다. –

8

누락되었습니다.

IV. 또한 파이썬 3에서는 인수 목록에 노출 된 *이 위치 인수의 끝을 표시하여 keyword-only arguments을 허용합니다.

def foo(a, b, *, key = None): 
    pass 

foo(1, 2, key = 3)하지만 foo(1, 2, 3)를 호출 할 수 있습니다.

+0

감사합니다. 내 질문에 대한 답변은 아니지만 모든 사례를 하나의 스레드로 모으는 것이 좋습니다. –