Функции и их параметры в языке Python

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

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

Расширенные примеры работы с аргументами

Пример
# Декоратор с аргументами
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]

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

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