function

Атрибуты встроенных функции

  • __doc__ - Строка документирования

  • __name__ - Имя функции/метода

  • __self__ - Ссылка на экземпляр, ассоциированный с данным методом (для связанных методов)

Атрибуты функции

  • __closure__ - Кортеж, содержащий данные, связанные с вложенными областями видимости

  • __code__ - Скомпилированный байт-код функции

  • __defaults__ - Кортеж с аргументами по умолчанию

  • __dict__ - Словарь, содержащий атрибуты функции

  • __doc__ - Строка документирования

  • __globals__ - Словарь, определяющий глобальное пространство имен

  • __name__ - Имя функции

lambda функции

f = lambda x: x*2
for i in (1,2):
    print(f(i))
# 2
# 4

Пользовательски функции

def func(text):
    """
    документация функции
    докстринг
    """
    print(text)

func('http://ilnurgi.ru')
# http://ilnurgi.ru
def func(first_arg, second_arg):
    """
    функция с позиционными аргументами
    func(1, 2)
    """

def func(first_arg=None, second_arg=None):
    """
    функция с аргументами по умолчанию
    func()
    func(second_arg=2)
    """

def func(*args, **kwargs):
    """
    func(1, b=2) ->
        (1, )
        {'b': 2}
    """
    print(args)
    print(kwargs)
def func(a, b, /, c, d *, e, f)
    """
    a, b - могут быть присвоены только в порядке перечисления значений
    e, f - только присвоение через указание ключей
    c, d - любым указанным способом
    / - отделяет аргументы,
        значения которым могут быть присвоены только на основе порядка перечисления значений
        во время вызова функции,
        от аргументов,
        допускающих присвоение в произвольном порядке
    * - отедляет переменные,
        для которых применимо только присвоение.
    """
func(10, 20, 30, 40, e=50, f=60)
func(10, 20, c=30, d=40, e=50, f=60)

Декораторы

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

def prepare(func):
    """
    декоратор
    """

    def wrapp(*args, **kwargs):
        print(1)
        result = func(*args, **kwargs)
        print(3)
        return result

    return wrapp

@prepare
def func():
    """
    декорируемая функция
    """
    print(2)

func()
# 1
# 2
# 3
def prepare_with_parameters(params):
    print(0)
    def decorator(func):
        def wrapp():
            print(1)
            result = func()
            print(3)
            return result
        return wrapp
    return decorator

@prepare_with_parameters(0)
def func():
    print(2)

func()
# 0
# 1
# 2
# 3

Генераторы

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

def countdown(n):
    print u'Обратный отсчет!'
    while n > 0:
        yield n
        n -= 1

c = countdown(3)
c.next()
# Обратный отсчет
# 3
c.next()
# 2
c.next()
# 1
gen.gi_code

Объект с программным кодом функции-генератора

gen.gi_frame

Кадр стека функции-генератора

gen.gi_running

Целое число, указывающее – выполняется ли функция-генератор в настоящий момент

gen.next()

Выполняет функцию-генератор, пока не будет встречена следующая инструкция yield, и возвращает полученное значение

(в Python 3 этот метод вызывает метод __next__())

gen.send(value)

Передает значение value генератору.

Это значение возвращается выражением yield в функции-генераторе.

После этого функция-генератор продолжит выполнение, пока не будет встречена следующая инструкция yield.

Метод send() возвращает значение, полученное от этой инструкции yield

gen.close()

Закрывает генератор, возбуждая исключение GeneratorExit в функции-генераторе.

Этот метод вызывается автоматически, когда объект генератора уничтожается сборщиком мусора

gen.throw(exc[, exc_value[, exc_tb]])

Возбуждает исключение в функции-генераторе в точке вызова инструкции yield.

  • exc - тип исключения

  • exc_value - значение исключения

  • exc_tb - необязательный объект с трассировочной информацией.

    Если исключение перехвачено и обработано, вернет значение, переданное следующей инструкции yield

Сопрограммы

Функция обрабатывающая последовательность входных параметров.

def print_matches(matchtext):
    print 'Поиск подстроки', matchtext
    while True:
        # Получение текстовой строки
        line = (yield)
        if matchtext in line:
            print line

matcher = print_matches('python')

# Перемещение до первой инструкции (yield)
matcher.next()
# Поиск подстроки python

matcher.send("Hello World")
matcher.send("python is cool")
# python is cool
matcher.send("yow!")

# Завершение работы с объектом matcher
matcher.close()

Аннтоации в функциях:

Warning

Добавлено в 3 ветке

def func(a: 'Параметр', b: 10 + 5 = 3) -> None:
   pass

Функция возвращает None, для параметров a и b заданы описания и для b задано значение по умолчанию.

После создания функции все выражения будут выполнены и результаты сохранятся в виде словаря в атрибуте __annotations__ объекта функции.

Замыкания

def sum_factory(first):
    """
    функция создает сумматор
    """
    def sum(second):
        """
        переменная first замыкается в этой функции
        """
        return first + second
    return sum

sum_2 = sum_factory(2)

sum_2(1)
# 3

sum_2(10)
# 12