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мають бути передані тільки по імені.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ