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

高阶函数

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

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

高阶函数的特点:

1、变量可以指向函数

  1. >>> abs(10)
  2. 10
  3. >>> abs
  4. <built-in function abs>
  5. >>> x = abs
  6. >>> x
  7. <built-in function abs>

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

2、函数名也是变量

  1. >>> abs = 10
  2. >>> abs
  3. 10

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

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

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

输出:

  1. 3

map函数

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

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

示例:

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

输出:

  1. [1, 4, 9, 16]

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

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

输出:

  1. 1
  2. 4
  3. 9
  4. 16

reduce函数

  1. reduce(function f, Iterable iterable)

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

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

输出:

  1. 1234

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

字符串转整数示例:

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

调用:

  1. >>> str2int('135')
  2. 135

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

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

结果将变为125。

filter函数

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

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

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

输出:

  1. [2, 4, 6, 8]

sorted函数

  1. sorted(Iterable iterable key=None)

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

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

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

输出:

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

输出:

  1. [10, 7, 5, 2]

装饰器

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

  1. import time
  2. def writelog(func):
  3. def wrapper(*args, **kw):
  4. print('['+ time.strftime('%Y-%m-%d %H:%M:%S') + '] :' + func.__name__)
  5. return func(*args, **kw)
  6. return wrapper
  7. @writelog
  8. def log(msg):
  9. print(msg)
  10. log('This is a test msg.')

输出:

  1. [2017-01-11 21:10:53] :log
  2. This is a test msg.

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

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

偏函数

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

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

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

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

  1. import functools
  2. int2 = functools.partial(int, base=2)
  3. print(int2('10'))
  4. print(int('10'))

输出:

  1. 2
  2. 10

是不是很简单?

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

Python学习--08函数式编程的更多相关文章

  1. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  2. Python学习_08_函数式编程

    在python中,函数名也是一个变量,代表对一个函数内容的引用,意味着可以作为参数传入到其他函数中,根据这个特性,发散出装饰器.闭包等概念,并涉及到变量作用域等问题. 函数 python中函数操作符为 ...

  3. Python学习:函数式编程(lambda, map() ,reduce() ,filter())

    1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...

  4. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  5. Python Decorator 和函数式编程

    看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程

  6. Python基础:函数式编程

    一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...

  7. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  8. 可爱的 Python : Python中的函数式编程,第三部分

    英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要:  作者David Mertz在其文章<可爱的 ...

  9. Python进阶之函数式编程(把函数作为参数)

    什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...

随机推荐

  1. 学习node.js的C++扩展

    本想买本书,可是太贵,了一下作者可惜没有回应,不然也会去支持一下.于是自己baidu罗.先是从这个入手 安装好环境 https://github.com/nodejs/node-gyp#install ...

  2. 1105 Spiral Matrix

    This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasi ...

  3. Web结构组件

    一.Web结构组件 1.代理 位于客户端和服务器之间的HTTP实体,接收客户端的所有HTTP请求,并将这些请求转发给HTTP服务器. 2.缓存 HTTP的仓库,使常用的页面的副本可以保存在离客户端更近 ...

  4. (01背包)Buy the souvenirs (hdu 2126)

    http://acm.hdu.edu.cn/showproblem.php?pid=2126 Buy the souvenirs Time Limit: 10000/1000 MS (Java/Oth ...

  5. Hdu 1009 FatMouse' Trade 2016-05-05 23:02 86人阅读 评论(0) 收藏

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  6. hdu 5058 set应用

    http://acm.hdu.edu.cn/showproblem.php?pid=5058 set应用 水题 #include <cstdio> #include <cstdlib ...

  7. poj 2155 区间更新 单点查询

    Matrix Time Limit: 3000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class ...

  8. CentOS使用vsftpd开启FTP服务以及配置用户

    1.安装服务 #yum install vsftpd 2.配置 #vi /etc/vsftpd/vsftpd.conf # 禁止匿名访问 anonymous_enable=NO # 允许本地用户登录F ...

  9. 一些LinuxC的小知识点(一)

    以下代码在Federo9上试验成功. 一.格式化输入16进制字符串 printf(); 输入结果: 二.测试各类型的占用的字节数 int main(int argc, char *argv[]) { ...

  10. mysql rand

    在where语句中,rand有时候会出现多条记录