Параметры и аргументы в языке Python: полный разбор

Раздел: 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.

- Python функция аргумент список (список как аргумент функции python)
- Python тип аргумента (тип аргумента в python)
- Python функция в качестве аргумента (функция как аргумент в python)

Продвинутые примеры работы с аргументами

Декоратор для логирования вызовов с произвольными аргументами

Пример
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

Аргументы в Python - comments

En
Python args (python)