Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Функции являются абстракциями, в которых детали реализации некоторого действия скрываются за отдельным именем. Хорошо написанный набор функций позволяет использовать их много раз. Стандартная библиотека Python содержит множество готовых и отлаженных функций, многие из которых достаточно универсальны, чтобы работать с широким спектром входных данных. Даже если некоторый участок кода не используется несколько раз, но по входным и выходным данным он достаточно автономен, его смело можно выделить в отдельную функцию.

Эта лекция более ориентирована на практические соображения, а

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

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

Что такое функциональное программирование?

Функциональное программирование — это стиль программирования, использующий только композиции функций. Другими словами, это программирование в выражениях, а не в императивных командах.

Как отмечает Дэвид Мертц (David Mertz) в своей статье о функциональном программировании на Python, «функциональное программирование — программирование на функциональных языках (LISP, ML, OCAML, Haskell, …)», основными атрибутами которых являются:

«Наличие функций первого класса (функции наравне с другими объектами можно передавать внутрь функций).

Рекурсия является основной управляющей структурой в программе.

Обработка списков (последовательностей).

Запрещение побочных эффектов у функций, что в первую очередь означает отсутствие присваивания (в «чистых» функциональных языках)

Запрещение операторов, основной упор делается на выражения. Вместо операторов вся программа в идеале — одно выражение с сопутствующими определениями.

Ключевой вопрос: что нужно вычислить, а не как.

Использование функций более высоких порядков (функции над функциями над функциями)».

Функциональная программа

В математике функция отображает объекты из одного множества (множества определения функции) в другое (множество значений функции). Математические функции (их называют чистыми) «механически», однозначно вычисляют результат по заданным аргументам. Чистые функции не должны хранить в себе какие–либо данные между двумя вызовами. Их можно представлять себе черными ящиками, о которых известно только то, что они делают, но совсем не важно, как.

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

других объектов. Например, без побочных эффектов невозможно представить себе функции ввода–вывода. Собственно, такие функции ради этих «эффектов» и используются. Кроме того, математические функции легко работают с объектами, требующими бесконечного объема информации (например, вещественные числа). В общем случае компьютерная программа может выполнить лишь приближенные вычисления.

Кстати, бинарные операции «+», «-», "*", "/", которые записываются в выражениях, являются «математическими» функциями над двумя аргументами — операндами. Их используют настолько часто, что синтаксис языка программирования имеет для них более короткую запись. Модуль operator позволяет представлять эти операции в функциональном стиле:

Листинг

>>> from operator import add, mul

>>> print add(2, mul(3, 4))

14

Функция: определение и вызов

Как уже говорилось, определить функцию в Python можно двумя способами: с помощью оператора def и lambda–выражения. Первый способ позволяет использовать операторы. При втором — определение функции может быть только выражением.

Забегая вперед, можно заметить, что методы классов определяются так же, как и функции. Отличие состоит в специальном смысле первого аргумента self (в нем передается экземпляр объекта).

Лучше всего рассмотреть синтаксис определения функции на нескольких примерах. После определения соответствующей функции показан один или несколько вариантов ее вызова (некоторые примеры взяты из стандартной библиотеки).

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

Вызов функции синтаксически выглядит как объект–функция(фактические параметры). Обычно объект–функция — это просто имя функции, хотя это может быть и любое выражение, которое в результате вычисления дает исполняемый объект.

Функция одного аргумента:

Листинг

def swapcase(s):

return s.swapcase

print swapcase(«ABC»)

Функция двух аргументов, один из которых необязателен и имеет значение по умолчанию:

Листинг

def inc(n, delta=1):

return n+delta

print inc(12)

print inc(12, 2)

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

Листинг

def wrap(text, width=70, **kwargs):

from textwrap import TextWrapper

# kwargs — словарь с именами и значениями аргументов

w = TextWrapper(width=width, **kwargs)

return w.wrap(text)

print wrap(«my long text …», width=4)

Поделиться:
Популярные книги

Дань псам

Эриксон Стивен
8. «Малазанская империя»
Фантастика:
фэнтези
5.80
рейтинг книги
Дань псам

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Тринадцатый IV

Реликварий

Престон Дуглас
2. Пендергаст
Фантастика:
ужасы и мистика
7.00
рейтинг книги
Реликварий

Егерь. Прилив. Книга 10

Скиба Николай
10. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Егерь. Прилив. Книга 10

Тайник

Джордж Элизабет
12. Инспектор Линли
Детективы:
криминальные детективы
7.78
рейтинг книги
Тайник

Газлайтер. Том 2

Володин Григорий Григорьевич
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Реальная угроза

Клэнси Том
4. Джек Райан
Детективы:
боевики
5.75
рейтинг книги
Реальная угроза

Кодекс Охотника. Книга ХХХ

Винокуров Юрий
30. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга ХХХ

Эволюционер из трущоб. Том 7

Панарин Антон
7. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 7

Кодекс Охотника

Винокуров Юрий
1. Кодекс Охотника
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника

Грядущая буря

Сандерсон Брендон
12. Колесо Времени
Фантастика:
фэнтези
8.67
рейтинг книги
Грядущая буря

Лев Толстой

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Лев Толстой

Адмирал. Пенталогия

Светлов Дмитрий Николаевич
Адмирал
Фантастика:
фэнтези
6.29
рейтинг книги
Адмирал. Пенталогия

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7