2016-12-20 1 views
4

Хорошо известно, что для того, чтобы установить значение по умолчанию для переменной внутри функции в Python, используется следующий синтаксис:По умолчанию Инициализация Помеченные переменных внутри определения функции

def func(x = 0): 
    if x == 0: 
     print("x is equal to 0") 
    else: 
     print("x is not equal to 0") 

Так если функция вызывается в качестве таковых:

>>> func() 

Это приводит к

'x is equal to 0' 

B если аналогичная методика используется для звездных переменных, например

def func(*x = (0, 0)): 

Это приводит к синтаксической ошибке. Я попытался включить синтаксис, также делая (*x = 0, 0), но та же ошибка встречается. Можно ли инициализировать отмеченную переменную значением по умолчанию?

+0

Этот вопрос может оказать помощь вам: http://stackoverflow.com/questions/15301999/python-2-x-default-arguments-with-args- and-kwargs – deweyredman

ответ

2

звезды переменные являются нестандартными переменными, которые предназначены для обеспечения функций с произвольной длиной

* переменный является кортежем со всеми позиционными аргументами (Это обычно называется арг)

** переменные является словарем со всеми именованными аргументами (обычно это называется kwargs)

Они всегда были там, просто пусты, если ни один не предоставлен. Вы можете проверить, находится ли значение в словаре или кортеже в зависимости от типа аргумента и его инициализации.

def arg_test(*args,**kwargs): 
    if not args: 
     print "* not args provided set default here" 
     print args 
    else: 
     print "* Positional Args provided" 
     print args 


    if not kwargs: 
     print "* not kwargs provided set default here" 
     print kwargs 
    else: 
     print "* Named arguments provided" 
     print kwargs 

#no args, no kwargs 
print "____ calling with no arguments ___" 
arg_test() 

#args, no kwargs 
print "____ calling with positional arguments ___" 
arg_test("a", "b", "c") 

#no args, but kwargs 
print "____ calling with named arguments ___" 
arg_test(a = 1, b = 2, c = 3) 
+0

Huh. Наверное, я просто передумал, спасибо, спасибо! – jelvin

+0

args и kwargs смутили меня изначально тоже слишком :) –

2

, отмеченные звездочкой переменная имеет значение пустой кортеж () по умолчанию. Хотя невозможно изменить это значение по умолчанию из-за того, как работают звездные параметры (tl; dr: Python присваивает незаметные параметры, если они имеются, и собирает остальное внутри кортежа; вы можете узнать больше о них, например, в соответствующих PEP 3132: https://www.python.org/dev/peps/pep-3132/), вы можете реализовать проверку в начале функции, чтобы выяснить, является ли x пустым кортежем, а затем соответствующим образом изменить его. Ваш код будет выглядеть примерно так:

def func(*x): 
    if x ==(): # Check if x is an empty tuple 
     x = (0, 0) 
    if x == 0: 
     print("x is equal to 0") 
    else: 
     print("x is not equal to 0") 
Смежные вопросы