Форум сайта python.su
0
Недавно начал изучать python, и вот возник такой вопрос.
Есть следующий код:
def total(initial, *numbers, extra_number): count = initial for number in numbers: count += number count += extra_number print(count) total(10, 1, 2, 3, extra_number=50)
def total(initial=5, *numbers, **keywords): count = initial for number in numbers: count += number for key in keywords: count += keywords[key] return count print(total(10, 1, 2, 3, vegetables = 50, fruits = 100))
Отредактировано RaZoR0987 (Март 9, 2019 23:39:23)
Офлайн
857
>>> def f(a, b, *c, **d): ... print(a) ... print(b) ... print(c) ... print(d) ... >>> f(1, 2, 3, 4, 5, n1=6, n2=7, n3=8) 1 2 (3, 4, 5) {'n1': 6, 'n2': 7, 'n3': 8} >>>
Офлайн
27
Одна звёздочка создаёт из “лишних” позиционных аргументов кортеж, а две звёздочки из именованных аргументов создаёт словарь. Т.е. звёздочки сворачивают (упаковывают) аргументы.
В примере от py.user.next f принимает только два позиционных аргумента a и b, остальные от 3 до 5 аргумент *с упаковывает в кортеж. **d упаковывает все именованные аргументы в словарь, где ключом являются имена аргументов.
Кстати, если звездочки используются при вызове какой-либо функции, то передаваемая последовательность распакуется в отдельные позиционные аргументы, а словарь распакуется в именованные
def f(a,b,c,d,n1=1, n2=2, n3=3): print(a) print(b) print(c) print(d) print(n1) print(n2) print(n3) x = (3, 4, 5) y = {'n1': 6, 'n2': 7, 'n3': 8} f(2, *x, **y)
Офлайн