Имеется две функции:

1
2
def a(*args):
        print args

и

1
2
def b(**args):
        print args

Чем они отличаются? Обе функции принимают произвольное число аргументов об этом свидетельствует символ «*» перед args, но функция b позволяет принимать именованные. В теле a параметр обрабатывается как кортеж. В подтверждение тому немного изменим тело первой функции и вызовем ее:

1
2
3
4
def a(*args):
        print type(args)

a(1, 2, 3, 4, 5, "вышел", "зайчик", "погулять")    # type 'tuple'

Параметр args в теле функции b обрабатывается как словарь, содержащий пары название-значение произвольного количества аргументов:

1
2
3
4
def b(**args):
        print type(args)

b(name='anry', age=20)    # type 'dict'