JavaRush /Курси /Модуль 1: Python Core /Просунута робота з параметрами функцій

Просунута робота з параметрами функцій

Модуль 1: Python Core
Рівень 8 , Лекція 6
Відкрита

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 мають бути передані тільки по імені.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ