Функции в Python

Инструкция def

Инструкция def создает объект функции и связывает его с именем. В общем виде инструкция имеет следующий формат:

def <name>(arg1, arg2,… argN):
<statements>

Как и все составные инструкции в языке Python, инструкция def состоит из строки заголовка и следующего за ней блока инструкций, обычно с отступами (или простая инструкция вслед за двоеточием). Блок инструкций образует тело функции, то есть программный код, который выполняется интерпретатором всякий раз, когда производится вызов функции.
В строке заголовка инструкции def определяются имя функции, с которым будет связан объект функции, и список из нуля или более аргументов (иногда их называют параметрами) в круглых скобках. Имена аргументов в строке заголовка будут связаны с объектами, передаваемыми в функцию, в точке вызова.
Тело функции часто содержит инструкцию return:

def <name>(arg1, arg2,… argN):

return <value>

Присвоение функции

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

othername = func # Связывание объекта функции с именем
othername() # Вызов функции

Добавление атрибута к функции

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

def func(): … # Создает объект функции
func() # Вызывает объект
func.attr = value # Присоединяет атрибут к объекту

Использование глобальных переменных

Другими словами, инструкция global позволяет изменять переменные, находящиеся на верхнем уровне модуля, за пределами инструкции def. Как вы узнаете ниже, инструкция nonlocal практически идентична, но она применяется не к именам на верхнем уровне модуля, а к именам, находящимся в локальных областях видимости объемлющих инструкций def.
Инструкция global состоит из ключевого слова global и следующих за ним одного или более имен, разделенных запятыми, которые будут отображены на область видимости вмещающего модуля при обращении к ним или при выполнении операции присваивания внутри тела функции. Например:

X = 88 # Глобальная переменная X
def func():
global X
X = 99 # Глобальная переменная X: за пределами инструкции def
func()
print(X) # Выведет 99

В этом примере было добавлено объявление global, поэтому имя X внутри ин-
струкции def теперь ссылается на переменную X за ее пределами. На этот раз
оба имени представляют одну и ту же переменную.

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

  1. Сопоставление неименованных аргументов по позициям.
  2. Сопоставление именованных аргументов по именам.
  3. 3. Сопоставление дополнительных неименованных аргументов с кортежем
    *name.
  4. 4. Сопоставление дополнительных именованных аргументов со словарем
    **name.
  5. 5. Сопоставление значений по умолчанию с отсутствующими именованными
    аргументами.

Примеры

>> def f(*args): print(args)

>>> f(1,2,3,4)
(1, 2, 3, 4)

 

>> def f(**args): print(args)

>>> f()
{}
>>> f(a=1, b=2)
{‘a’: 1, ‘b’: 2}

 

def f(a, *pargs, **kargs): print(a, pargs, kargs)

>>> f(1, 2, 3, x=1, y=2)
1 (2, 3) {‘y’: 2, ‘x’: 1}

Пример извлечения аргументов из колекции при вызове функции

>> def func(a, b, c, d): print(a, b, c, d)

>>> args = (1, 2)
>>> args += (3, 4)
>>> func(*args)
1 2 3 4

 

>> args = {‘a’: 1, ‘b’: 2, ‘c’: 3}
>>> args[‘d’] = 4
>>> func(**args)
1 2 3 4

Нахождение минимального/либо максимального значения переданных в функцию аргументов

def minmax(test, *args):
res = args[0]
for arg in args[1:]:
if test(arg, res):
res = arg
return res
def lessthan(x, y): return x < y # См. также: lambda
def grtrthan(x, y): return x > y
print(minmax(lessthan, 4, 2, 1, 5, 6, 3)) # Тестирование
print(minmax(grtrthan, 4, 2, 1, 5, 6, 3))