'ПРИВЕТ!'
Функции — это объекты
Все данные в программе Python представляются объектами или связями
между объектами
1
. Символьные последовательности (строки), списки,
модули и функции — все эти явления языка представляют собой объекты.
Что касается функций, то в Python они ничем не отличаются. Они — тоже
объекты.
Поскольку функция
yell
в Python является объектом, вы можете ее при-
своить еще одной переменной, точно так же, как это происходит с любым
другим объектом:
>>> bark = yell
Эта строка кода не вызывает функцию. Она берет объект-функцию, на
который ссылается имя
yell
, и создает второе имя,
bark
, которое на него
указывает. Теперь вы можете исполнить тот же самый объект-функцию,
который лежит в его основе, вызвав
bark
:
>>> bark('гав')
'ГАВ!'
Объекты-функции и их имена — это две отдельные компетенции. Вот еще
одно доказательство. Вы можете удалить первоначальное имя функции
(
yell
), и, поскольку еще одно имя (
bark
) по-прежнему указывает на ле-
жащую в основе функцию, вы все так же можете через него вызвать эту
функцию:
1
См. документацию Python «Объекты, значения и типы»:
https://docs .python .org/3/reference/
datamodel .html#objects-values-and-types
68 Глава 3 • Эффективные функции
>>> del yell
>>> yell('Привет?')
NameError: "name 'yell' is not defined"
>>> bark('эй')
'ЭЙ!'
Кстати, Python прикрепляет к каждой функции строковый идентифи-
катор. Это делается для отладочных целей во время создания функции.
К этому внутреннему идентификатору можно получить доступ посред-
ством атрибута
__name__
1
:
>>> bark.__name__
'yell'
Нужно сказать, что хотя атрибут
__name__
функции по-прежнему «yell»,
это не влияет на то, каким образом вы получаете доступ к объекту-функ-
ции из вашего программного кода. Идентификатор имени является просто
средством отладки. Указывающая на функцию переменная и сама функция
обладают совершенно разными компетенциями.
Функции могут храниться в структурах данных
Поскольку функции — это объекты первого класса, их можно хранить
в структурах данных точно так же, как это делается с другими объектами.
Например, вы можете добавить функции в список:
>>> funcs = [bark, str.lower, str.capitalize]
>>> funcs
[,
,
]
1
Начиная с Python 3.3, также имеется атрибут
__qualname__
, который служит для такой
же цели и обеспечивает строку с квалифицированным именем для устранения неодно-
значности между именами функций и классов (см. PEP 3155:
https://www .python .org/dev/
peps/pep-3155/
).
3 .1 . Функции Python — это объекты первого класса 69
Доступ к объектам-функциям, хранящимся внутри списка, осуществля-
ется точно так же, как это происходит с объектом любого другого типа:
>>> for f in funcs:
... print(f, f('всем привет'))
'ВСЕМ ПРИВЕТ!'
'всем привет'
'Всем привет'
Хранящийся в списке объект-функцию даже можно вызвать без необходи-
мости сначала присваивать его переменной. Для этого можно выполнить
поиск и затем немедленно назвать результирующий «бестелесный» объ-
ект-функцию внутри одного-единственного выражения:
>>> funcs[0]('приветище')
Do'stlaringiz bilan baham: |