7.1 Получение всех аргументов функции
В языке Python есть несколько очень удобных способов получить изнутри функции список всех переданных в неё параметров. Давайте пройдемся по ним.
Использование *args
*args позволяет передавать переменное количество позиционных (обычных) аргументов в функцию. Эти аргументы упаковываются в кортеж и могут быть обработаны внутри функции.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Объяснение
Функция print_numbers принимает произвольное количество позиционных аргументов, упакованных в кортеж args. Мы можем перебирать аргументы внутри функции с помощью цикла for.
Преимущества
- Гибкость: Позволяет передавать любое количество аргументов в функцию.
- Универсальность: Может быть использовано для функций с неопределённым числом параметров.
Использование **kwargs
**kwargs позволяет передавать переменное количество именованных аргументов в функцию. Эти аргументы упаковываются в словарь и могут быть обработаны внутри функции.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Объяснение
Функция print_person_info принимает произвольное количество именованных аргументов, упакованных в словарь kwargs. Мы можем перебирать аргументы внутри функции с помощью метода словаря items().
Преимущества
- Гибкость: Позволяет передавать любое количество именованных аргументов в функцию.
- Читаемость: Именованные аргументы делают вызовы функций более читаемыми.
7.2 Фиксирование типа аргументов
Только позиционные аргументы
В Python 3.8 и выше можно определять функции с позиционными аргументами, которые можно передавать только по позиции. Это делается с помощью символа / в определении функции.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Вывод: Hello, Alice!
greet("Alice", greeting="Hi") # Вывод: Hi, Alice!
# greet(name="Alice") # Ошибка: TypeError
Объяснение
Функция greet принимает аргумент name, который можно передать только по позиции. Аргументы перед / могут быть переданы только по позиции.
Такой подход позволяет ограничить способ передачи аргументов, улучшая читаемость и предотвращая ошибки.
Только именованные аргументы (Keyword-Only Arguments)
Также можно определить параметры функции, которые можно передавать только по имени. Это делается с помощью символа * в определении функции.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Вывод: Hello, Alice!
greet(name="Alice", greeting="Hi") # Вывод: Hi, Alice!
# greet("Alice") # Ошибка: TypeError
Функция greet принимает аргумент name, который можно передать только по имени. Аргументы после * могут быть переданы только по имени.
Такой подход заставляет явно указывать имена аргументов, улучшая читаемость кода.
Комбинирование позиционных и именованных аргументов
Также можно комбинировать позиционные и именованные аргументы для достижения максимальной гибкости.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Вывод: Hello, Alice!
greet("Alice", greeting="Hi") # Вывод: Hi, Alice!
# greet(name="Alice") # Ошибка: TypeError
Функция greet принимает аргумент name, который можно передать только по позиции, и именованный аргумент greeting, который обязательно должен быть передан по имени. Использование и / и * позволяет комбинировать позиционные и именованные аргументы.
Полный пример всех трех ситуаций:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Вызов функции с различными аргументами
full_example(1, 2, 3, 4, e=5, f=6) # Все аргументы переданы корректно
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Ошибка: TypeError
Пояснение
- Позиционные только аргументы:
aиbдолжны быть переданы только по позиции. - Обычные позиционные или именованные аргументы:
cиdмогут быть переданы как по позиции, так и по имени. - Именованные только аргументы:
eиfдолжны быть переданы только по имени.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ