Функции высших порядков Функции высших порядков функции, которые могут принимать в качестве аргументов и возвращать другие функции.
чисто функциональная программа не может изменять уже имеющиеся у неё данные, а может лишь порождать новые путём копирования и/или расширения старых. чисто функциональная программа не может изменять уже имеющиеся у неё данные, а может лишь порождать новые путём копирования и/или расширения старых.
Повышение надёжности кода Повышение надёжности кода за счёт чёткой структуризации и отсутствия необходимости отслеживания побочных эффектов.
Отсутствие присваиваний и замена их на порождение новых данных приводят к большим затратам памяти и вычислений при копировании. Отсутствие присваиваний и замена их на порождение новых данных приводят к большим затратам памяти и вычислений при копировании. Сборщик мусора. специальный код, который периодически освобождает память, удаляя объекты, которые уже не будут востребованы приложением
def <name>(arg1, arg2,..., argN): def <name>(arg1, arg2,..., argN): '''строка документации''' <statements>
определение функции происходит во время выполнения. определение функции происходит во время выполнения. имя функции не является однозначно определенным. Важен только объект на который ссылается имя. othername = func #связывание объекта функции с именем othername() #вызов функции
def func(x, y): def func(x, y): return x**2 + y**2 func = lambda x, y: x**2 + y**2
def func(x, y, z=7) def func(x, y, z=7) return x+y+z print func(1, y=3) # 1+3+7=11
Имена, определяемые внутри инструкции def, видны ТОЛЬКО программному коду внутри инструкции def. К ним нельзя обратиться за пределами функции. Имена, определяемые внутри инструкции def, видны ТОЛЬКО программному коду внутри инструкции def. К ним нельзя обратиться за пределами функции. Имена, определяемые внутри инструкции def, не вступают в конфликт с именами, находящимися за пределами инструкции def.
#Глобальная область видимости. #Глобальная область видимости. X = 99 # X и func определены в модуле: глобальная область def func(Y): # Y и Z определены в функции: локальная область #Локальная область видимости Z = X + Y # X – глобальная переменная return Z func(1) #result = 100
y, z = 1,2 #Глобальные переменные y, z = 1,2 #Глобальные переменные в модуле. def all_global(): global x #объявляется глобальной для присваивания x = y + z
range(5) range(5) #[0, 1, 2, 3, 4] L = [ a ** 2 for a in range(5) ] #[0, 1, 4, 9, 16] L = [a**2 for a in range(5) if a % 2 == 1] #[1, 9] L = [a1 + a2 for a1 in ['a','b','c'] for a2 in ['x','y']] #['ax', 'ay', 'bx', 'by', 'cx', 'cy']
list1 = [1,3,5] list1 = [1,3,5] list2 =[1,2,3] def inc(x): return x+10 map(inc, list1) #[11, 13, 15] map(lambda x, y: x**y, list1, list2) #[1, 9, 125] [x * y for x, y in zip(list1, list2)] #[1, 9, 125]
list = [9, 1, -4, 3, 8] list = [9, 1, -4, 3, 8] filter(lambda x: x < 5, list) #[1, -4, 3] list = [9, 1, -4, 3, 8] [x for x in list if x < 5] # [1, -4, 3]
list = [2, 3, 4, 5, 6] list = [2, 3, 4, 5, 6] reduce(lambda res, x: res*x, list, 1) #720 = ((((1*2)*3)*4)*5)*6 reduce(lambda res, x: res*x, [], 1) #1 reduce(lambda res, x: [x]+res, [1, 2, 3, 4], []) #[4, 3, 2, 1] reversed([1,2,3,4,5]) #[5,4,3,2,1]
def f(x, y, z, a=None, b=None): def f(x, y, z, a=None, b=None): print x, y, z, a, b apply(f, [1, 2, 3], {'a': 4, 'b': 5}) #1 2 3 4 5 f(*[1, 2, 3], **{'a': 4, 'b': 5}) 1 2 3 4 5
def make_adder(x): def make_adder(x): def adder(n): return x + n # захват переменной "x" из внешнего контекста return adder # То же самое, но через безымянные функции: make_adder = lambda x: ( lambda n: ( x + n ) ) f = make_adder(10) print f(7) # 17 print f(-4) # 6
from functools import partial from functools import partial def add(a, b): return a + b add1 = partial(add, b=1) print add1(2) #3
it = enumerate(sorted("PYTHON")) it.next() it = enumerate(sorted("PYTHON")) it.next() #(0, 'H') print list(it) #[(1,'N'),(2,'O'),(3,'P'),(4,'T'),(5,'Y')]
генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию
генераторные выражения — выражения, дающие в результате генератор генераторные выражения — выражения, дающие в результате генератор
Марк Лутц. Изучаем Питон. 3-е издание. Марк Лутц. Изучаем Питон. 3-е издание. http://ru.wikipedia.org/wiki/Функциональное_программирование_на_Питоне http://ru.wikipedia.org/wiki/Функциональное_программирование Г. Россум, Ф.Л.Дж.Дрейк, Д.С.Откидач «Язык программирования Python» Журнал «Практика функционального программирования» http://fprog.ru/