Когда использовать * и ** в качестве аргумента функции в функции Python - PullRequest
0 голосов
/ 17 сентября 2010

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

def fun_name(arg1, *arg2 , ** arg3):

Ответы [ 3 ]

7 голосов
/ 17 сентября 2010

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

Когда вы определяете функцию, они указывают, что позиционные аргументы будут помещены в кортеж и чтоАргументы ключевых слов будут помещены в 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'}

Вы понимаете, что я имею в виду, когда говорючто мы применили это к параметрам в определении функции?Аргументы 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

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

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

2 голосов
/ 17 сентября 2010

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

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

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

@ Wooble's ответ поможет вам; но еще больше поможет вам понять, что делают *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/
1 голос
/ 17 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...