Параметры и аргументы функций 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)
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 = 125Python 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) # TypeErrorPython принять аргументы (приём аргументов в python)
Подключение к localhost:8080
Python список аргументов (список аргументов в python)
Как использовать аннотации типов для параметров?
Аннотации не влияют на исполнение, но помогают статическим анализаторам и улучшают читаемость.
def divide(dividend: float, divisor: float) -> float:
return dividend / divisor
print(divide(10, 3))Python функция аргумент список (список как аргумент функции python)
3.3333333333333335
Продвинутые примеры работы с аргументами
Распаковка аргументов из списка/словаря
Операторы * и ** позволяют распаковать итерируемый объект или словарь при вызове функции.
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с
Создание функции с обязательным ключевым аргументом после *
Можно комбинировать позиционные параметры, *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}{name}>'
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.