2010-09-17 3 views

ответ

7

Как вы заявили, ваш вопрос, вы не используете их в аргументах (которые возникают, когда вы используете , вызывая функцию a), вы используете их в параметрах, которые возникают, когда вы находитесь , создавая - функция. Операторы * и ** служат для разных целей в каждой из этих ситуаций.

Когда вы находитесь , определяя функцию, они указывают, что позиционные аргументы будут помещены в кортеж, а аргументы ключевого слова будут помещены в dict. Да, я просто сказал аргументы, но в этом случае они применяются к параметрам.

def example(*args, **kwargs): 
    print "args: {0}".format(args) 
    print "kwargs: {0}".format(kwargs) 

example(1, 2, 'a', foo='bar', bar='foo') 

при запуске, это выходы:

args: (1, 2, 'a') 
kwargs: {'foo': 'bar', 'bar': 'foo'} 

Вы видите, что я имею в виду, когда я говорю, что мы применили его к PARAMATERS в определении функции? аргументы 1, 2, 'a', foo='bar', bar='foo'. параметрами являются *args, **kwargs.

Теперь вот пример применения их к аргументам.

def example2(a, b, foo=None, bar=None): 
    print "a: {0}, b:{1}, foo:{2}, bar: {3}".format(a, b, foo, bar) 

args = (1, 2) 
kwargs = {'foo': 'bar', 'bar': 'foo'} 
example2(*args, **kwargs) 

Это выходы:

a: 1, b:2, foo:bar, bar: foo 

Вы можете видеть, что, когда мы применяем их к аргументам (то есть, когда мы вызываем функцию), * имеет эффект расширения списка или кортежа для заполнения позиционные аргументы функции и ** приводят к расширению словаря для заполнения аргументов ключевого слова для функции. Вам просто нужно убедиться, что после того, как расширения были сделаны, есть достаточно и не слишком много аргументов.

в последнем примере, аргументы *args, **kwargs и параметры a, b, foo=None, bar=None

1

Каждый раз, когда вы хотите, чтобы ваша функция, чтобы принять неименованных позиционные аргументы (*), или дополнительные именованные аргументы (**).

В каждом определении функции можно включить *args, **kwargs, хотя это может и не быть отличной идеей, если передача большего количества аргументов фактически не будет иметь никакого эффекта.

2

Когда я могу передать * и ** в аргументе функции Python? то есть:

Короткий ответ: когда вам требуется переменное количество аргументов, передаваемых вашей функции.

Это, я честно считаю, что это очень широкий вопрос. Вам будет намного лучше читать больше об этих концепциях, пробовать их, а затем задавать конкретные вопросы здесь.

@ Wooble's answer поможет вам; но что поможет вам еще больше понять, что делают *args и **kwargs. Затем вы можете использовать их в соответствии с ситуациями, с которыми вы сталкиваетесь.

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

  1. http://www.network-theory.co.uk/docs/pytut/KeywordArguments.html
  2. http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/