Video Thumbnail

Python.02.03 Функции

Программирование на Python08:54
https://www.youtube.com/watch?v=wAre0Ljkd34

Содержание

Краткое резюме

  • Функции в Python можно определять с позиционными и именованными аргументами, при этом порядок именованных аргументов не важен.
  • Для передачи аргументов из списка или словаря в функцию используют распаковку с помощью * и ** соответственно.
  • Значения аргументов по умолчанию в функциях устанавливаются один раз при определении функции и могут вести себя неожиданно при использовании изменяемых объектов.
  • В определении функций *args и **kwargs позволяют принимать произвольное количество позиционных и именованных аргументов, которые внутри функции собираются в кортеж и словарь.

Определение и вызов функций с разными типами аргументов

В Python функцию можно определить с несколькими аргументами, например, a, b и c. Рассмотрим пример функции, которая возвращает строку, объединяющую значения этих аргументов с разделением через запятую и пробел:

def f(a, b, c):
    return f"{a}, {b}, {c}"

Вызвать такую функцию можно просто передав позиционные аргументы:

print(f(1, 2, 3))  # Выведет: 1, 2, 3

Кроме того, аргументы можно передавать по именам, в любом порядке:

print(f(1, c=3, b=2))  # Также выведет: 1, 2, 3

Важно, что позиционные аргументы сопоставляются по порядку, а именованные — по ключу.


Распаковка списка и словаря при вызове функций

Если у вас есть список с элементами [1, 2, 3], его нельзя передать в функцию напрямую как один аргумент, если функция ждёт три отдельных аргумента. Это вызовет ошибку. Чтобы передать элементы списка как отдельные позиционные аргументы, используется распаковка:

a = [1, 2, 3]
f(*a)  # Распаковывает список и передает его элементы как отдельные аргументы

Аналогично, если есть словарь с ключами и значениями, соответствующими аргументам функции, можно распаковать его с помощью **:

kwargs = {'a': 3, 'b': 2, 'c': 1}
f(**kwargs)  # Передает элементы словаря в функцию как именованные аргументы

«С помощью одной звездочки распаковываем список (последовательность) в позиционные аргументы, двумя — словарь в именованные.»


Аргументы со значениями по умолчанию

Функции можно сразу определять с аргументами, у которых есть значения по умолчанию. Например:

def f(a, b=2, c=3):
    return a + b + c

Теперь можно вызывать функцию с одним, двумя или всеми тремя аргументами:

  • f(1) вернёт 1 + 2 + 3 = 6
  • f(1, 4) вернёт 1 + 4 + 3 = 8
  • f(1, 4, 5)1 + 4 + 5 = 10

Важное замечание о значениях по умолчанию с изменяемыми объектами

При использовании изменяемых объектов (например, списков) в качестве значений по умолчанию нужно быть внимательным:

def f(a, b=[]):
    b.append(a)
    return b

При вызове:

print(f(1))  # [1]
print(f(2))  # [1, 2]

Почему? Значение по умолчанию для b вычисляется один раз при определении функции. Поэтому один и тот же список используется для всех вызовов без передачи аргумента b.


Использование *args и **kwargs в определении функций

В Python можно принимать произвольное количество аргументов с помощью конструкций:

  • *args — позиционные аргументы (собираются в кортеж)
  • **kwargs — именованные аргументы (собираются в словарь)

Например:

def f(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

f(1, 2, 3, x=4, y=5)
# Вывод:
# args: (1, 2, 3)
# kwargs: {'x': 4, 'y': 5}

Это позволяет одной функцией гибко обрабатывать различные варианты вызовов с разным количеством и типом аргументов.


✨ Таким образом, функции в Python очень гибкие: аргументы можно передавать по-разному, распаковывать из коллекций, задавать значения по умолчанию и принимать переменное число аргументов. Важно понимать особенности поведения значений по умолчанию с изменяемыми объектами, чтобы избежать неожиданных ошибок.