Просьба объяснить причину инверсии в конце результата компиляции и возникновения 'None'

Код заимствован из книги AByteOfPython в книге, по крайней мере в части, где представлен данный пример, смутно объясняется принцип действия этих "звездочек" и вообще мало раскрыта суть кода. прошу опытных товарищей сориентировать.

Код:

def total(a=5, *numbers, **phonebook):
    print ('a = ', a)

    #пробегаемсяя по всем элементам кортежа
    for single_item in numbers:
        print('single_item = ', single_item)

    #пробегаемся по всем элементам тел. книги.
    for first_part, second_part in phonebook.items():
        print(first_part, second_part)

print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))


результат компиляции:
a =  10
single_item =  1
single_item =  2
single_item =  3
Jack 1123
John 2231
Inge 1560
None

Ответы (1 шт):

Автор решения: Xander

Эти "звёздочки" - способ передать в функцию некоторое заранее неопределённое количество аргументов.

Если кратко, то сначала в определёнии функции пишется некоторое количество аргументов, которые перечислены явно. В вашем примере это один аргумент "a", но их может быть и больше, и вообще не быть.

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

То есть если брать ваш пример, то мы видим, что туда передаются аргументы:

10,1,2,3,Jack=1123,John=2231,Inge=1560

Первый аргумент 10 попадает в аргумент "a" - потому что этот аргумент в определении функции прописан явно.

Следующие аргументы 1, 2, 3 переданы без имён, поэтому они попадают все списком в аргумент с одной звёздочкой (numbers)

Дальше идут "ключевые" (то есть именованные) аргументы Jack=1123,John=2231,Inge=1560 поэтому они все в виде словаря попадают в аргумент с двумя звёздочками (phonebook)

Более подробно можно прочитать, например, здесь: https://habr.com/ru/company/ruvds/blog/482464/

→ Ссылка