Array Array - Язык программирования Python
- Название:Язык программирования Python
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array Array - Язык программирования 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)
Функция произвольного числа аргументов:
Листинг
def max_min(*args):
# args — список аргументов в порядке их указания при вызове
return max(args), min(args)
print max_min(1, 2, — 1, 5, 3)
Функция с обычными (позиционными) и именованными аргументами:
Листинг
def swiss_knife(arg1, *args, **kwargs):
print arg1
print args
print kwargs
return None
print swiss_knife(1)
print swiss_knife(1, 2, 3, 4, 5)
print swiss_knife(1, 2, 3, a='abc', b='sdf')
# print swiss_knife(1, a='abc', 3, 4) # !!! ошибка
lst = [2, 3, 4, 5]
dct = {'a': 'abc', 'b': 'sdf'}
print swiss_knife(1, *lst, **dct)
Пример определения функции с помощью lambda–выражения дан ниже:
Листинг
func = lambda x, y: x + y
В результате lambda–выражения получается безымянный объект–функция, которая затем используется, например, для того, чтобы связать с ней некоторое имя. Однако, как правило, определяемые lambda–выражением функции, применяются в качестве параметров функций.
В языке Python функция может возвратить только одно значение, которое может быть кортежем. В следующем примере видно, как стандартная функция divmod() возвращает частное и остаток от деления двух чисел:
Листинг
def bin(n):
«"«Цифры двоичного представления натурального числа """
Читать дальшеИнтервал:
Закладка: