Функция с переменным количеством аргументов *args
Читаю книгу "Укус питона", прохожу тему "Функции", не могу взять в толк, как сработал код, приведенный в примере. Попытался поэтапно просмотреть выполнение этого кода в интерпретаторе - ясности это не добавило.
По моему разумению должно быть так. Я явно что-то не так понимаю, поправьте, пожалуйста. При вызове функции аргументу extra_numbers присваивается значение 50, в *numbers помещаются значения (10, 1, 2, 3), аргумент initial = 5 никак не изменяется, затем выполняется тело функции, по моему мнению следующим образом:
- Переменной
countприсваиваться значение аргументаinitial, то есть5. - Далее в цикле
forидет перебор параметров аргумента*numbersизмененное значение, телом цикла, которых на каждой итерации цикла хранятся в переменнойnumber. - На первой итерации цикла
forберётся первый параметр аргумента*numbers, то есть10, и складывает со значением переменнойcount. Выходит15, изменяя значение переменнойcountсобственно на15. - На второй итерации цикла
forберется второй параметр аргумета*numbers, то есть1, и складывается со значением переменнойcount, то есть со значением15и переменная получает новое значение16, которое и хранит - На третье итерации цикла происходит аналогичное тому, что происходило в 1. и 2. примере то есть переменная
countизменяется значала до18и на следующей итерации цикла на21 - Затем цикл
forпрекращает работу и выполняется следующее выражение функцииtotal, а именноcount += extra_numbers, по итогам которого переменнойcountприсваивается значение71, так как её значение под конец цикла было 18, а значение аргументаextra_numbers-50. А теперь вопрос, откуда взялось 66 и где я протупил?
def total(initial = 5, *numbers, extra_numbers):
count = initial
for number in numbers:
count += number
count += extra_numbers
print(count)
total(10, 1, 2, 3, extra_numbers = 50)
#Вывод в консоль: 66
Ответы (2 шт):
Добавим печать аргументов функции:
def total(initial = 5, *numbers, extra_numbers):
print(initial, numbers, extra_numbers)
total(10, 1, 2, 3, extra_numbers = 50)
Вывод:
10 (1, 2, 3) 50
Переданные неименованные аргументы присваиваются последовательно. Поэтому 10 попадает в initial, всё кроме extra_numbers попадает в numbers, а конкретно указанное по имени extra_numbers попадает в соответствующую переменную.
Вы немного не так поняли. Аргументу initial присваивается значение 10, потому что он стоит на первом месте. = 5 - это параметр по умолчанию. Если бы мы написали так:
total(numbers = (10, 1, 2, 3), extra_numbers = 50)
то было бы так, как вы сказали. А сейчас initial = 10, numbers = (1, 2, 3), extra_numbers = 50