2017-09-06 1 views
2

필자는 함수 매개 변수에 값을 할당 할 때 파이썬이 따르는 알고리즘을 이해하려고 노력해 왔으며 매우 혼란 스러웠습니다. 나는 실제로 어떤 값이 어떤 매개 변수에 할당되는지를 실제로 알 수 있도록 알고리즘을 더 잘 이해하고 싶습니다. 위치 인수, 키워드 인수, * args, * kwargs 및 키워드 전용 인수가 있습니다. 어떻게이 모든 것이 할당되고 어떤 순서로 이루어 집니까?함수 매개 변수에 값을 할당 할 때 Python이 따르는 프로세스는 무엇입니까?

은 하나의 특정 예를 들어 다음과 같은 코드를 가지고 : 그러나

func(c=3, *(1, 2)) # prints 1 2 3 

을 내가 그것을 실행하는 경우 : 나는 다음과 같은 형식으로이 함수를 호출하면

def func(a, b, c): 
    print(a, b, c) 

이 정상적으로 실행하는 것입니다 이 사용이 제공하는 SyntaxError :

func(c=3, 1, 2) 

일의 두 가지 형태 얼마나 다른 전화? 첫 번째 호출에서 튜플은 개별 인수로 압축이 풀립니다. 그것은 두 번째 형식으로 변환되는 것과 같지 않습니까? 이것이 일어난다면 두 번째 형식도 제대로 작동해야하지만 그렇지 않습니다.

그래서 실제로 무슨 일이 벌어지고 있습니까?

답변

1

은 특별한 아무것도 없다 : 그것은 파이썬이 작동하는 단지 방법입니다.

파이썬은 명명 된 매개 변수 후 위치 매개 변수를 전달 금지합니다. 그냥 당신이 선택적 인수 또는 후 키워드 전용 인수 후 필수 인수 함수를 정의 할 수있다. 그러나 함수를 호출 할 때 명명 된 인수 이전에 위치 인수를 사용하는 것이 더 읽기 쉽지만 함수 정의의 경우 실제로는 "모호성 제거"문제입니다. 그러나 그것은 분명히 어떤 방식으로 대칭을 이루고 있습니다.

당신이 풀고 사용하여 보았 듯이이 작업을 우회 할 수 있지만,이 가격에 온다 :

def func(a, b, c): 
    pass 

%timeit func(c=3, *(1, 2)) 
# 810 ns ± 16.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 
%timeit func(1, 2, c=3) 
# 383 ns ± 1.47 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

기억하는 것이 실제로 매우 중요합니다 : 그것은 때문에 추가 작업의 약간 느리다 당신이 만약 당신이 성과로 지불 한 Pythons 언어를 싸우는 것을 시도하십시오. 경우


당신은 기본적으로 당신의 기능은 *args**kwargs 인수로이 있다면처럼 작동 관심이 있습니다. *args에있는 모든 위치 지정 인수와 모든 명명 된 인수를 **kwargs에 수집 한 다음 실제 함수 인수에 "바인딩"합니다.

+0

하지만 * 왜 * 유효한 구문이 아닌가요? 필자는 예제에서 두 번째 호출 유형처럼 키워드 인수를 할당 한 다음 나머지 값을 빈 매개 변수에 할당 할 수 있습니다. –

+0

이것이 Python 언어 구문이 작동하는 방식입니다. 인수를 푸는 것은 위치 인수를 전달하는 것과 다릅니다. – MSeifert

+0

@AsadMoosvi 답변을 업데이트했습니다. 나는 원래의 대답이 그 요점을 놓쳤다 고 생각한다. 코멘트 주셔서 감사합니다 :) – MSeifert

0

파이썬에서 함수가 * 인 매개 변수로 호출되면 함수 정의에 정의 된 순서대로 매개 변수에이 값을 할당합니다.예를 들어

:

def func(a, b, c): 
    print(a, b, c) 
func(a=3, *(1, 2)) 

이것은이 발생합니다

TypeError: func() got multiple values for keyword argument 'a'

또는

def func(a, b, c): 
    print(a, b, c) 
func(b=3, *(1, 2)) 

가 발생합니다

TypeError: func() got multiple values for keyword argument 'b'

이 경우 변수 c가 명시 적으로 지정되고 나머지 매개 변수는 가변 길이 인수 목록에서 지정됩니다. 질문의 두 번째 부분에 오는

, 파이썬은 명시 적으로 만 모든 값이 잘 작동 코드를 passed.Following 후 매개 변수에 데이터를 할당 할 수 있습니다

def func(a, b, c): 
     print(a, b, c) 
    func(3, 1,c=2)) 

하지만 func(3,b=1,2) or func(a=3,1,2)

이에 대한 자세한 정보는 여기를 참조하십시오 What does ** (double star/asterisk) and * (star/asterisk) do for parameters?

관련 문제