Разница вызова функции с звездочкой и без параметра

Я знаю, что означает звездочка в определении функции в Python.

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

def foo(*args, **kwargs):
    first_func(args, kwargs)
    second_func(*args, **kwargs)

В чем разница между первым и вторым вызовом функции?

3 ответа

Решение

arg = [1,2,3]

func(*arg) == func(1,2,3) переменные выходят из списка (или типа последовательности) как параметры

func(arg) == func([1,2,3]) список входит в

kwargs = dict(a=1,b=2,c=3)

func(kwargs ) == func({'a':1, 'b':2, 'c':3}) диктат входит

func(**kwargs ) == func(a=1,b=2,c=3) (ключ, значение) выходят из dict(или другого типа отображения) как именованные параметры

Разница в том, как аргументы передаются в вызываемые функции. Когда вы используете *аргументы распаковываются (если они являются списком или кортежем) - иначе они просто передаются как есть.

Вот пример разницы:

>>> def add(a, b):
...   print a + b
...
>>> add(*[2,3])
5
>>> add([2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (1 given)
>>> add(4, 5)
9

Когда я префикс аргумента с *фактически распаковал список в два отдельных аргумента, которые были переданы в add как a а также b, Без этого он просто передается в списке как один аргумент.

То же самое касается словарей и **за исключением того, что они передаются как именованные аргументы, а не как упорядоченные аргументы.

>>> def show_two_stars(first, second='second', third='third'):
...    print "first: " + str(first)
...    print "second: " + str(second)
...    print "third: " + str(third)
>>> show_two_stars('a', 'b', 'c')
first: a
second: b
third: c
>>> show_two_stars(**{'second': 'hey', 'first': 'you'})
first: you
second: hey
third: third
>>> show_two_stars({'second': 'hey', 'first': 'you'})
first: {'second': 'hey', 'first': 'you'}
second: second
third: third
def fun1(*args):
    """ This function accepts a non keyworded variable length argument as a parameter.
    """
    print args        
    print len(args)


>>> a = []

>>> fun1(a)
([],)
1
# This clearly shows that, the empty list itself is passed as a first argument. Since *args now contains one empty list as its first argument, so the length is 1
>>> fun1(*a)
()
0
# Here the empty list is unwrapped (elements are brought out as separate variable length arguments) and passed to the function. Since there is no element inside, the length of *args is 0
>>>
Другие вопросы по тегам