Параметры и аргументы функций Python: примеры и решения

Раздел: Python -> Функции

Аргументы и параметры в Python

Параметры – это переменные, объявленные в сигнатуре функции. Аргументы – значения, подставляемые при вызове. Понимание разницы помогает избежать путаницы и строить гибкие функции.

def welcome(name):  # name - параметр
    return f"Добро пожаловать, {name}!"

print(welcome("Елена"))  # "Елена" - аргумент

аргументы print python (аргументы функции print в python)

Добро пожаловать, Елена!

Python 3 аргументы (аргументы в python 3)

Как передать аргументы по позиции?

Самый простой способ: порядок аргументов совпадает с порядком параметров.

def subtract(a, b):
    return a - b

print(subtract(10, 3))  # a=10, b=3

аргумент параметр python (аргументы и параметры в python)

7

аргумент класса python (аргументы класса python)

Если передать аргументов меньше, чем параметров, возникнет ошибка TypeError: missing required positional argument. Например, subtract(10) вызовет исключение.

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

Именованные аргументы позволяют явно указывать, какому параметру какое значение присваивается. Порядок не имеет значения.

def create_user(username, email, age):
    return f"{username} ({email}), {age} лет"

print(create_user(age=25, email="test@example.com", username="alice"))

Python аргументы строки (аргументы строки в python (командная строка))

alice (test@example.com), 25 лет

аргумент метода python (аргументы метода python)

При смешивании позиционных и именованных аргументов позиционные должны идти первыми. Имена ключей должны совпадать с именами параметров.

Как задать параметры со значениями по умолчанию?

Значение по умолчанию делает параметр необязательным. Если аргумент не передан, используется значение по умолчанию.

def power(base, exponent=2):
    return base ** exponent

print(power(5))    # 5^2 = 25
print(power(5,3))  # 5^3 = 125

Python args (аргументы в python)

25
125

именованные аргументы функции python (именованные аргументы функции python)

Изменяемые объекты (список, словарь) в качестве значения по умолчанию разделяются между вызовами. Исправить можно, используя None и создавая объект внутри функции.

Как принять произвольное количество аргументов?

Синтаксис *args собирает все дополнительные позиционные аргументы в кортеж. Имя args не обязательно, но это соглашение.

def concatenate(*words):
    return ' '.join(words)

print(concatenate("Python", "is", "great"))

именованные аргументы python (именованные аргументы python)

Python is great

количество аргументов функции python (количество аргументов функции python)

*args должен быть последним среди позиционных параметров. Если после него идут другие параметры, они могут быть только именованными.

Как принять произвольное количество именованных аргументов?

**kwargs собирает все именованные аргументы в словарь. Опять же, имя может быть другим, но принято использовать kwargs.

def display_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

display_info(name="Иван", job="разработчик", city="СПб")

параметры и аргументы функции python (параметры и аргументы функции python)

name: Иван
job: разработчик
city: СПб

Python передать аргументы (передача аргументов в python)

Ключи в **kwargs должны быть строками – валидными идентификаторами Python. Нельзя передать, например, 123=value.

Как сделать параметры только именованными (keyword-only)?

Параметры, расположенные после * в определении функции, могут быть переданы только по имени.

def configure(*, host, port):
    print(f"Подключение к {host}:{port}")

configure(host="localhost", port=8080)   # OK
# configure("localhost", 8080)           # TypeError

Python принять аргументы (приём аргументов в python)

Подключение к localhost:8080

Python список аргументов (список аргументов в python)

Попытка передать их позиционно приведёт к ошибке TypeError: takes 0 positional arguments.

Как использовать аннотации типов для параметров?

Аннотации не влияют на исполнение, но помогают статическим анализаторам и улучшают читаемость.

def divide(dividend: float, divisor: float) -> float:
    return dividend / divisor

print(divide(10, 3))

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

3.3333333333333335
Передача значения неправильного типа не вызовет ошибки во время выполнения. Для проверки используют mypy или другие инструменты.
- Python return value (возвращаемое значение функции в python)
- абсолютное значение python (абсолютное значение в python)
- вернуть значение функции python (возврат значения из функции в python)

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

Распаковка аргументов из списка/словаря

Операторы * и ** позволяют распаковать итерируемый объект или словарь при вызове функции.

Пример
def vector_len(x, y, z):
    return (x**2 + y**2 + z**2) ** 0.5

coords = [1, 2, 3]
print(vector_len(*coords))  # эквивалентно vector_len(1,2,3)

params = {'x': 4, 'y': 5, 'z': 6}
print(vector_len(**params))
3.7416573867739413
8.774964387392123
Количество элементов при распаковке * должно совпадать с числом позиционных параметров. Для ** ключи словаря должны соответствовать именам параметров.

Комбинация *args и **kwargs

Функция может принимать как произвольное число позиционных, так и именованных аргументов. Обычно используется при создании обёрток (декораторов).

Пример
def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Вызов {func.__name__} с args={args}, kwargs={kwargs}")
        return func(*args, **kwargs)
    return wrapper

@logger
def compute(a, b, c=0):
    return a + b + c

print(compute(1, 2, c=3))
Вызов compute с args=(1, 2), kwargs={'c': 3}
6
Необходимо сохранять исходную сигнатуру; при неправильной передаче могут возникнуть неожиданные ошибки.

Передача аргументов из словаря с помощью **

Удобно, когда параметры хранятся в конфигурационном словаре.

Пример
def connect(host, port, timeout=10):
    return f"Соединение с {host}:{port}, тайм-аут {timeout}с"

config = {"host": "192.168.1.1", "port": 22, "timeout": 30}
print(connect(**config))
Соединение с 192.168.1.1:22, тайм-аут 30с
Лишние ключи в словаре приведут к ошибке TypeError: unexpected keyword argument.

Создание функции с обязательным ключевым аргументом после *

Можно комбинировать позиционные параметры, *args и keyword-only.

Пример
def tag(name, *content, cls=None, **attrs):
    attributes = ' '.join(f'{k}="{v}"' for k, v in attrs.items())
    if cls:
        attributes = f'class="{cls}" ' + attributes
    open_tag = f'<{name} {attributes.strip()}>'
    inner = ''.join(content)
    return f'{open_tag}{inner}'

print(tag('a', 'Click here', cls='link', href='http://example.com'))
Click here
Параметр cls может быть передан только по имени, так как стоит после *.

Аннотации типов с использованием typing

Более сложные типы: List, Dict, Optional, Callable. Помогают документировать ожидаемые структуры.

Пример
from typing import List, Optional

def average(values: List[float]) -> Optional[float]:
    if not values:
        return None
    return sum(values) / len(values)

print(average([1.5, 2.5, 3.0]))
print(average([]))
2.3333333333333335
None
Аннотации не проверяются во время выполнения; для реальной проверки необходима внешняя утилита.

Использование inspect для анализа параметров

Модуль inspect позволяет динамически получать информацию о параметрах функции.

Пример
import inspect

def sample(a, b, *args, c=10, **kwargs):
    pass

sig = inspect.signature(sample)
for name, param in sig.parameters.items():
    print(f"{name}: kind={param.kind.name}, default={param.default}")
a: kind=POSITIONAL_ONLY, default=empty
b: kind=POSITIONAL_ONLY, default=empty
args: kind=VAR_POSITIONAL, default=empty
c: kind=KEYWORD_ONLY, default=10
kwargs: kind=VAR_KEYWORD, default=empty
Для позиционных параметров, определённых до / (Python 3.8+), функция inspect тоже корректно определяет kind.

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

En
аргумент параметр python (python)