Функции и их параметры в языке Python
Аргументы в Python 3
Наиболее эффективный способ управления аргументами в Python 3 - это комбинация обязательных позиционных аргументов и необязательных именованных с значениями по умолчанию. Такой подход обеспечивает ясность кода и гибкость вызова.
def create_user(username, email, is_active=True):
return {'name': username, 'email': email, 'active': is_active}аргументы print python (аргументы функции print в python)
Здесь username и email обязательны, а is_active по умолчанию True.
Цель: создание предсказуемых функций с минимальным риском ошибок при вызове.
Как сделать функцию, принимающую любое количество позиционных аргументов?
def concatenate(*strings):
return ''.join(strings)Python 3 аргументы (аргументы в python 3)
Пояснение: *strings собирает все переданные позиционные аргументы в кортеж.
Типичная ошибка: передача именованного аргумента, например concatenate(sep=',', 'a') вызовет ошибку, так как после *args имена не допускаются. Следует помнить, что *args принимает только позиционные аргументы.
Как передать произвольное количество именованных аргументов?
def build_query(**filters):
return {k: v for k, v in filters.items()}
аргумент параметр python (аргументы и параметры в python)
Пояснение: **filters собирает все именованные аргументы в словарь.
Ошибка: попытка передать позиционный аргумент после **kwargs или передать дублирующееся имя. Не следует путать с *args.
Как заставить передавать аргумент только по ключу?
def connect(host, *, port=80):
print(host, port)аргумент класса python (аргументы класса python)
Символ * отделяет keyword-only аргументы. port можно передать только как port=8080.
Забыли поставить *: тогда port станет обычным позиционным аргументом. Обязательно использовать * в сигнатуре.
Как сделать аргумент только позиционным?
def read_file(path, /, encoding='utf-8'):
with open(path, encoding=encoding) as f:
return f.read()Python аргументы строки (аргументы строки в python (командная строка))
Символ / отделяет positional-only аргументы. path теперь нельзя передать по имени.
Попытка вызвать read_file(path='file.txt') вызовет TypeError. Следует помнить, что / доступен с Python 3.8.
Как добавить подсказки типов для аргументов?
def multiply(a: int, b: int = 2) -> int:
return a * bАннотации не ограничивают типы, но улучшают читаемость и работу IDE.
Ошибка: аннотации не проверяются во время выполнения. Для строгой проверки нужен mypy или pydantic.
Расширенные примеры работы с аргументами
# Декоратор с аргументами
import functools
def repeat(n):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f'Hello {name}')
greet('Alice')Hello Alice Hello Alice Hello Alice
# Функция с комбинированными аргументами (positional-only и keyword-only)
def configure(endpoint, /, timeout=30, *, retries=3):
return {'endpoint': endpoint, 'timeout': timeout, 'retries': retries}
print(configure('api.example.com', timeout=60, retries=5))
# Можно также: configure('api.example.com', 120) - timeout передан позиционно{'endpoint': 'api.example.com', 'timeout': 60, 'retries': 5}# Функция, принимающая список и произвольные именованные параметры для конфигурации
def process(data, *args, **kwargs):
print('data:', data)
print('args:', args)
print('kwargs:', kwargs)
process([1,2,3], 4, 5, key='value', flag=True)data: [1, 2, 3]
args: (4, 5)
kwargs: {'key': 'value', 'flag': True}# Использование аннотаций с typing для сложных структур
from typing import List, Optional
def find_users(ids: List[int], active_only: Optional[bool] = None) -> List[str]:
# имитация поиска
return [f'user_{i}' for i in ids if active_only is None or active_only]
result = find_users([1,2,3], active_only=True)
print(result)['user_1', 'user_2', 'user_3']
# Аргументы с изменяемыми значениями по умолчанию - 'ловушка'
def append_item(item, lst=[]):
lst.append(item)
return lst
print(append_item(1)) # [1]
print(append_item(2)) # [1, 2] - неожиданно![1] [1, 2]
# Правильный способ: использовать None и создавать новый список
def append_item_correct(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(append_item_correct(1)) # [1]
print(append_item_correct(2)) # [2][1] [2]