博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习--08函数式编程
阅读量:6342 次
发布时间:2019-06-22

本文共 3014 字,大约阅读时间需要 10 分钟。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

高阶函数

Python支持高阶函数(Higher-order function)

什么是高阶函数呢?把函数作为参数传入,这样的函数称为高阶函数。

高阶函数的特点:

1、变量可以指向函数

>>> abs(10)10>>> abs
>>> x = abs>>> x

这个例子告诉我们:abs是函数,abs(10)是函数调用;可以将函数赋给一个变量,这个变量也指向了函数。

2、函数名也是变量

>>> abs = 10>>> abs10

例子中,当我们把一个函数名重新赋值后,该函数名不再指向函数,而是指向整数10,说明函数名本身也是变量,是指向函数的变量。

3、函数参数可以传入函数

def test(x,y,f):    return f(x) + f(y)print(test(1, -2, abs))

输出:

3

map函数

map(function f, Iterable iterable)# 返回: Iterable

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

示例:

def f(x):    return x*xiterator = map(f, [1,2,3,4])print(list(iterator))

输出:

[1, 4, 9, 16]

map返回的结果是个迭代器(Iterator)。我们可以使用for循环获取结果或者直接使用list()函数将结果转变为list:

iterator = map(f, [1,2,3,4])for x in iterator:    print(x)

输出:

14916

reduce函数

reduce(function f, Iterable iterable)

reduce()函数同样接收两个参数,一个是函数,一个是Iterable,reduce把结果继续和序列的下一个元素做累积计算,返回的是累计结果,非迭代器。注意的是reduce()传入的函数 函数f 必须接收两个参数。

import functoolsdef f(x,y):    return x*10+yiterator = functools.reduce(f, [1,2,3,4])print(iterator)

输出:

1234

reduce在Python3.3+已经移到functools里了,需要先导入functools。

字符串转整数示例:

from functools import reducedef str2int(s):    def fn(x, y):        return x * 10 + y    def char2num(s):        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]    return reduce(fn, map(char2num, s))

调用:

>>> str2int('135')135

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:

def f(x, y):    return x + yreduce(f, [1, 3, 5, 7, 9], 100)

结果将变为125。

filter函数

filter(function f, Iterable iterable)# 返回: Iterable

map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。True保留,False丢弃。

def f(x):    if x % 2 == 0:        return Truer = filter(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])print(list(r))

输出:

[2, 4, 6, 8]

sorted函数

sorted(Iterable iterable, key=None)

Python内置的sorted()函数就可以对list进行排序,按从小到大。

它还可以接收一个key函数来实现自定义的排序,key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

l = [10,5,2,7]s = sorted(l)print(s)

输出:

[2, 5, 7, 10]
def opposite(x):    return -xl = [10,5,2,7]s = sorted(l, key=opposite)print(s)

输出:

[10, 7, 5, 2]

装饰器

装饰器(Decorator)是一种在代码运行期间动态增加功能的方式。例如,我们有个写日志的函数log(),我们希望在不修改该函数的情况取增强该函数的功能,比如日志前打印一行时间和该函数名:

import timedef writelog(func):    def wrapper(*args, **kw):        print('['+ time.strftime('%Y-%m-%d %H:%M:%S') + '] :' + func.__name__)        return func(*args, **kw)    return wrapper@writelogdef log(msg):    print(msg)log('This is a test msg.')

输出:

[2017-01-11 21:10:53] :logThis is a test msg.

这个例子里我们编写了装饰器writelog()用来增加函数log()的功能,只需要在函数log()前加@writelog即可。其中func.__name__代表函数的函数名。内部函数wrapper()名字非固定的,可以自定义名称。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。

偏函数

大家不要被这个名字给吓到,其实很简单的一个东西:用于固定函数的行为。例如,函数int(x, base=10)默认只需要传第一个参数,因为第二个参数默认是10,代表10进制。

如果我们想默认使用2进制呢,一般是这样:

def int2(x):    return int(x, 2)

而偏函数就是专门干这事情的。使用偏函数表示上面自定义方法就是:

import functoolsint2 = functools.partial(int, base=2)print(int2('10'))print(int('10'))

输出:

210

是不是很简单?

所以,简单总结偏函数functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

转载地址:http://epkla.baihongyu.com/

你可能感兴趣的文章
boost bind使用指南
查看>>
/etc/fstab功能详解
查看>>
oracle高速缓存机制
查看>>
使用ntpdate更新系统时间
查看>>
Android M 特性 Doze and App Standby模式详解
查看>>
IE FF(火狐) line-height兼容详解
查看>>
谷歌Pixel 3吸引三星用户, 但未动摇iPhone地位
查看>>
python获取当前工作目录
查看>>
VUE中使用vuex,cookie,全局变量(少代码示例)
查看>>
grep -w 的解析_学习笔记
查看>>
量化交易之启航
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
IO Foundation 3 -文件解析器 FileParser
查看>>
linux学习经验之谈
查看>>
mysqld_multi实现多主一从复制
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>