Параметры и аргументы в языке Python: полный разбор
Как устроены аргументы в функциях Python
Основной способ передачи данных в функцию - это позиционные и именованные аргументы. Для гибкого числа параметров существуют *args и **kwargs.
Позиционные аргументы
Аргументы передаются в порядке объявления параметров. Количество должно совпадать, иначе возникает ошибка.
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")
greet("Анна", 25)аргументы print python (аргументы функции print в python)
Привет, Анна! Тебе 25 лет.
Python 3 аргументы (аргументы в python 3)
Именованные аргументы
Позволяют указывать имя параметра при вызове, порядок не важен.
greet(age=30, name="Иван")
аргумент параметр python (аргументы и параметры в python)
Привет, Иван! Тебе 30 лет.
аргумент класса python (аргументы класса python)
Если смешивать позиционные и именованные, позиционные должны идти первыми. Ошибка: SyntaxError: positional argument follows keyword argument.
Произвольное количество позиционных аргументов (*args)
Звёздочка перед параметром собирает все лишние позиционные аргументы в кортеж.
def sum_all(*numbers):
return sum(numbers)
print(sum_all(1, 2, 3, 4))Python аргументы строки (аргументы строки в python (командная строка))
10
аргумент метода python (аргументы метода python)
После *args можно указывать только именованные параметры. Попытка передать ещё один позиционный аргумент вызовет ошибку.
Произвольное количество именованных аргументов (**kwargs)
Две звёздочки собирают именованные аргументы в словарь.
def print_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
print_info(name="Елена", city="Москва")Python args (аргументы в python)
name: Елена city: Москва
именованные аргументы функции python (именованные аргументы функции python)
**kwargs должен быть последним в определении функции. После него нельзя объявлять другие параметры.
Как сделать аргумент необязательным со значением по умолчанию?
Параметры со значением по умолчанию располагаются после обязательных позиционных. Если значение не передано, используется умолчание.
def repeat(text, times=1):
return text * times
print(repeat("Привет "))
print(repeat("Да ", 3))именованные аргументы python (именованные аргументы python)
Привет Да Да Да
количество аргументов функции python (количество аргументов функции python)
Значение по умолчанию вычисляется один раз при определении функции, поэтому не стоит использовать изменяемые объекты (список, словарь) в качестве умолчания - они будут общими для всех вызовов.
Как передать произвольное количество аргументов, но с некоторыми обязательными параметрами?
Обязательные параметры ставятся перед *args, а после *args можно указать только именованные (keyword-only).
def func(a, b, *args, c=0):
print(a, b, args, c)
func(1, 2, 3, 4, c=5)параметры и аргументы функции python (параметры и аргументы функции python)
1 2 (3, 4) 5
Python передать аргументы (передача аргументов в python)
Если забыть передать именованный параметр c, будет ошибка, если у него нет значения по умолчанию.
Как распаковать список или словарь при вызове функции?
Используйте звёздочку для списка/кортежа и двойную звёздочку для словаря.
def show(a, b, c):
print(a, b, c)
numbers = [10, 20, 30]
show(*numbers)
data = {'a': 1, 'b': 2, 'c': 3}
show(**data)переменное количество аргументов python (переменное количество аргументов python)
10 20 30 1 2 3
Количество элементов должно совпадать с числом параметров, иначе TypeError.
Продвинутые примеры работы с аргументами
Декоратор для логирования вызовов с произвольными аргументами
def log(func):
def wrapper(*args, **kwargs):
print(f"Вызвана {func.__name__} с args={args}, kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log
def add(a, b, c=0):
return a + b + c
print(add(1, 2))
print(add(1, 2, c=3))Вызвана add с args=(1, 2), kwargs={}
3
Вызвана add с args=(1, 2), kwargs={'c': 3}
6Передача произвольных аргументов в конструктор класса
class Person:
def __init__(self, name, **attrs):
self.name = name
for key, value in attrs.items():
setattr(self, key, value)
p = Person("Анна", age=25, city="Минск")
print(p.name, p.age, p.city)Анна 25 Минск
Функция, принимающая только именованные аргументы (keyword-only)
def connect(*, host='localhost', port=80):
print(f"Подключение к {host}:{port}")
connect(host='example.com', port=443)
# connect('example.com') - вызовет TypeErrorПодключение к example.com:443
Комбинация *args и **kwargs для передачи в другую функцию
def wrapper(func, *args, **kwargs):
print("Подготовка...")
result = func(*args, **kwargs)
print("Готово.")
return result
def multiply(a, b):
return a * b
print(wrapper(multiply, 3, 4))Подготовка... Готово. 12
Использование *args в lambda
sum_all = lambda *args: sum(args)
print(sum_all(1, 2, 3, 4, 5))15
Аннотации типов для *args и **kwargs
from typing import Any
def process(*args: int, **kwargs: str) -> None:
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
process(10, 20, name="test", desc="example")10 20 name: test desc: example
Распаковка при определении функции (PEP 448)
def combined(a, b, c, d):
print(a, b, c, d)
args = [1, 2]
kwargs = {'c': 3, 'd': 4}
combined(*args, **kwargs)1 2 3 4