Что означает звездочка * в Python?

Есть ли в языке Python особое значение, как в C? Я видел такую ​​функцию в Поваренной книге Python:

def get(self, *a, **kw)

Не могли бы вы объяснить это мне или указать, где я могу найти ответ (Google интерпретирует * как символ дикой карты и, следовательно, я не могу найти удовлетворительный ответ).

Большое спасибо.

Ответ 1

См. Определения функций в Справочнике по языку.

Если форма *identifier равна присутствует, он инициализируется кортежем получение любого избыточного позиционного параметров, по умолчанию кортеж. Если форма **identifier равна присутствует, он инициализируется новым словарь, получающий любое превышение аргументы ключевого слова, по умолчанию пустой словарь.

Также см. Функциональные вызовы.

Предполагая, что кто-то знает, что такое позиционные и ключевые аргументы, вот несколько примеров:

Пример 1:

# Excess keyword argument (python 2) example:
def foo(a, b, c, **args):
    print "a = %s" % (a,)
    print "b = %s" % (b,)
    print "c = %s" % (c,)
    print args

foo(a="testa", d="excess", c="testc", b="testb", k="another_excess")

Как вы можете видеть в приведенном выше примере, мы имеем только параметры a, b, c в сигнатуре функции foo. Поскольку d и k нет, они помещаются в словарь args. Выходной сигнал программы:

a = testa
b = testb
c = testc
{'k': 'another_excess', 'd': 'excess'}

Пример 2:

# Excess positional argument (python 2) example:
def foo(a, b, c, *args):
    print "a = %s" % (a,)
    print "b = %s" % (b,)
    print "c = %s" % (c,)
    print args

foo("testa", "testb", "testc", "excess", "another_excess")

Здесь, поскольку мы тестируем позиционные аргументы, избыточные должны быть в конце, а *args упаковывает их в кортеж, поэтому вывод этой программы:

a = testa
b = testb
c = testc
('excess', 'another_excess')

Вы также можете распаковать словарь или кортеж в аргументы функции:

def foo(a,b,c,**args):
    print "a=%s" % (a,)
    print "b=%s" % (b,)
    print "c=%s" % (c,)
    print "args=%s" % (args,)

argdict = dict(a="testa", b="testb", c="testc", excessarg="string")
foo(**argdict)

Печать

a=testa
b=testb
c=testc
args={'excessarg': 'string'}

и

def foo(a,b,c,*args):
    print "a=%s" % (a,)
    print "b=%s" % (b,)
    print "c=%s" % (c,)
    print "args=%s" % (args,)

argtuple = ("testa","testb","testc","excess")
foo(*argtuple)

Печать

a=testa
b=testb
c=testc
args=('excess',)

Ответ 2

У меня есть только одна вещь, чтобы добавить, что было непонятно из других ответов (для полноты).

Вы также можете использовать звезды при вызове функции. Например, скажем, у вас есть такой код:

>>> def foo(*args):
...     print(args)
...
>>> l = [1,2,3,4,5]

Вы можете передать список l в foo, например, так...

>>> foo(*l)
(1, 2, 3, 4, 5)

Вы можете сделать то же самое для словарей...

>>> def foo(**argd):
...     print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}

Ответ 3

Все приведенные выше ответы были совершенно ясными и полными, но только для записи я хотел бы подтвердить, что значение * и ** в python абсолютно не похоже на значение аналогично выглядящих операторов в C.

Они называются операторами распаковки аргументов и распаковки.

Ответ 4

Одна звезда означает, что переменная 'a' будет кортежем дополнительных параметров, которые были переданы функции. Двойная звезда означает, что переменная "kw" будет являться словарем переменного размера дополнительных параметров, которые были снабжены ключевыми словами.

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

def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...

Ответ 5

Я нахожу * полезным при написании функции, которая выполняет другую функцию обратного вызова в качестве параметра:

def some_function(parm1, parm2, callback, *callback_args):
    a = 1
    b = 2
    ...
    callback(a, b, *callback_args)
    ...

Таким образом, вызывающие могут передавать произвольные дополнительные параметры, которые будут переданы их функции обратного вызова. Приятно, что функция обратного вызова может использовать обычные функциональные параметры. То есть, не нужно использовать синтаксис * вообще. Вот пример:

def my_callback_function(a, b, x, y, z):
    ...

x = 5
y = 6
z = 7

some_function('parm1', 'parm2', my_callback_function, x, y, z)

Конечно, закрытие предоставляет другой способ сделать то же самое, не требуя, чтобы вы передавали x, y и z через some_function() и в my_callback_function().