Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Косвенный вызов функций в Python

19 ноября 2015 г. Archy Просмотров: 2647 RSS Обсудить
Косвенный вызов функций в Python

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

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

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

Например, в имени, которое используется в инструкции def, нет ничего уникального: это всего лишь переменная, которая создается в текущей области видимости, как если бы оно стояло слева от знака =. После того как инструкция def будет выполнена, имя функции представляет собой всего лишь ссылку на объект - ее можно присвоить другим именам и вызывать функцию по любому из них(не только по первоначальному имени):

>>> def echo(message): # Имени echo присваивается объект функции
...     print(message)
>>> echo('Прямой вызов') # Вызов объекта по оригинальному имени
Прямой вызов
>>> x = echo # Теперь на эту функцию ссылается еще и имя x
>>> x('Косвенный вызов') # Вызов объекта по другому имени добавлением ()
Косвенный вызов

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

>>> def indirect(func, arg):
...    func(arg) # Вызов объекта добавлением ()
>>> indirect(echo, 'Вызываем функцию') # Передача функции в функцию
Вызываем функцию

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

>>> lst = [ (echo, 'Тук!'), (echo, 'Тадам!') ]
>>> for (func, arg) in lst:
...    func(arg) # Вызов функции, сохраненной в контейнере
...
Тук!
Тадам!

В этом фрагменте просто выполняется обход списка lst и производится вызов функции echo с одним аргументом(обратите внимание на операцию присваивания кортежа в заголовке инструкции цикла for). Важно понять, что функции могут также создаваться и возвращаться другими функциями:

>>> def make(label): # создает функцию, но не вызывает ее
...    def echo(message):
...        print(label + ' : ' + message)
...    return echo
...
>>> F = make('Делай') # Метка сохраняется во вложенной области видимости
>>> F('Тук!') # Вызов функции, созданной функцией make
Делай : Тук!
>>> F('Тадам!') # Вызов функции с другим сообщением но с той же меткой, созданной функцией make
Делай : Тадам!

Универсальность модели объектов в языке Python и отсутствие необходимости объявлять типы переменных обеспечивают функциям невероятную гибкость.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru yandex.ru
Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)