2017-09-27 14 views
0

나는 파이썬을 배우고있다.파이썬에서 하나의 함수 호출에서 기본값과 임의의 인수를 사용하는 방법은 무엇입니까?

기본값과 임의의 인수에 대해 알게되었습니다.

그래서 기본 값을 제공하는 매개 변수와 임의의 수의 인수를 갖는 다른 매개 변수가있는 함수를 만들었습니다. 첫 번째 함수 호출에서

def make_pizza(size=15,*toppings): 
    """Summerize the pizza that we are about to make.""" 
    print("\nMaking a " + str(size) + 
    "-inch pizza with the following toppings: ") 
    for topping in toppings: 
     print("- " + topping) 


make_pizza('onion','shrimp','goda cheese','mushroom') 
make_pizza(17,'ham','extra meat','sweet con','pepperoni') 

, 나는 "15"입니다 "크기"매개 변수와 "* 토핑"임의의 인수에 대해 기본값을 사용하고 싶었다.

그러나 어떻게해야하는지 알 수 없었습니다.

여러 인자를 가진 함수를 호출하면 아무에게도 말할 수 있습니까? 하나의 함수 호출에서 매개 변수의 기본값과 임의의 인수를 어떻게 사용할 수 있습니까? 당신이 내 영어를 불편 해하는 경우 사전에 죄송

답변

2

실제로 할 수있다 혼란 스럽다. 매개 변수은 함수 정의에 사용되는 이름이며 인수은 호출에 전달 된 값입니다. 기본값와 이름을 포함이, 파이썬은 항상 위치 인수에서 모든 매개 변수를 채울 호출

, . size은 기본값이 있어도 여기에있는 또 다른 매개 변수입니다. 호출에서 name=value 구문을 사용하여 특정 매개 변수에 인수 값을 할당 할 수 있습니다 (기본값이 있는지 여부는 관계 없음).그러나 *toppings 매개 변수 이전의 모든 값은 이고 항상이 정규 위치 매개 변수가되기 때문에 파이썬에 size에 항목을 지정하지 말고 현재 함수 정의로 지정해서는 안됩니다.

*toppings 매개 변수는 다른 모든 매개 변수가 값을 수신 한 후 이후의 위치 지정 인수 만 캡처합니다. 따라서 'onion'size에 할당되고 나머지는 *toppings에 할당됩니다.

파이썬 3에서, 당신은 할 수 size키워드 전용 매개 변수, name=default*toppings 이름 또는 빈 *로 배치하여 :

def make_pizza(*toppings, size=15): 

는 이제 size 만 설정할 수 있습니다 size=<new value> 키워드 인수 구문을 사용하여 전화를 걸었습니다.

파이썬이, 당신은 당신이 당신의 size 동안 그 사전에보고해야하는 후 **kwargs 포괄 매개 변수와 같은 키워드 인수를 캡처 할 수 있습니다 :

def make_pizza(*toppings, **kwargs): 
    size = kwargs.get('size', 15) # set a default if missing 

를 두 경우 모두를, 당신은해야 명시 적으로 위치 인수를 size 이름을 지정하고 후 같은 명시 적으로 이름을 키워드 인수를 넣어 기억

make_pizza('ham', 'extra meat', 'sweet con', 'pepperoni', size=17) 
+0

고맙습니다! 이제 나는 그 문제가 무엇인지를 이해한다. – Yeni

-1
def make_pizza(toppings,size=15): 
    """Summerize the pizza that we are about to make.""" 
    print("\nMaking a " + str(size) + 
    "-inch pizza with the following toppings: ") 
    for topping in toppings: 
     print("- " + topping) 


make_pizza(toppings = ['onion','shrimp','goda cheese','mushroom']) 
make_pizza(size = 17,toppings = ['onion','shrimp','goda cheese','mushroom']) 
0

당신의 접근 방식에 근본적인 문제가있다 (I 네이티브 아닙니다.) : 당신이 size로 구성하는 경우 어떻게 알 수 있습니까 때문에 모호한 또는 topping? 파이썬은 그렇게 할 수 없으므로 대안을 찾아야합니다. 이 정수의 경우

글쎄, 당신은 단순히 인수 목록에서 size를 제거하고 크기와 첫 *toppings 인수를 해석 할 수 :

그러나 간단한 유형 검사를 할 수없는 경우 경우에 실패 할 것이다
def make_pizza(*toppings): 
    if toppings and isinstance(toppings[0], int): 
     size, toppings = toppings[0], toppings[1:] 
    else: 
     size = 15 
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size)) 
    for topping in toppings: 
     print("- " + topping) 

. 아마 더 좋은 방법은 toppings 정상적인 인수 및 size 선택적 인수하게하는 것입니다 : 당신이 toppings의 순서로 전달해야 다음 그러나

def make_pizza(toppings, size=15): 
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size)) 
    for topping in toppings: 
     print("- " + topping) 

을 그리고 toppingssize의 순서를 변경하지만 아마 많은입니다 청소기.

make_pizza(['onion','shrimp','goda cheese','mushroom']) 
make_pizza(['ham','extra meat','sweet con','pepperoni'], 17) 

또한 인해 임의 위치 인수로 토핑을 유지할 수 있고 size 기본적으로 키워드 전용 매개 변수 (Python3 전용)합니다와 및 기본 값없이 매개 변수를 혼합

def make_pizza(*toppings, size=15): 
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size)) 
    for topping in toppings: 
     print("- " + topping) 

make_pizza('onion','shrimp','goda cheese','mushroom') 
make_pizza('ham','extra meat','sweet con','pepperoni', size=17) 
+0

당신은 여전히'* toppings'을 유지할 수 m에 대한 필요가 없습니다 그것은 하나의 논증이다. –

+0

@MartijnPieters 맞아, 나는 단지 그가 '크기'를 위치 인수로 원한다고 생각했다. '* toppings'를 사용하면 후행하는'size = 15' 키워드 만 (그리고 파이썬 -3 만) 만들 수 있습니다. – MSeifert