Python学习--08函数式编程
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
高阶函数
Python支持高阶函数(Higher-order function)。
什么是高阶函数呢?把函数作为参数传入,这样的函数称为高阶函数。
高阶函数的特点:
1、变量可以指向函数
>>> abs(10)
10
>>> abs
<built-in function abs>
>>> x = abs
>>> x
<built-in function abs>
这个例子告诉我们:abs是函数,abs(10)是函数调用;可以将函数赋给一个变量,这个变量也指向了函数。
2、函数名也是变量
>>> abs = 10
>>> abs
10
例子中,当我们把一个函数名重新赋值后,该函数名不再指向函数,而是指向整数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*x
iterator = 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)
输出:
1
4
9
16
reduce函数
reduce(function f, Iterable iterable)
reduce()函数同样接收两个参数,一个是函数,一个是Iterable,reduce把结果继续和序列的下一个元素做累积计算,返回的是累计结果,非迭代器。注意的是reduce()传入的函数 函数f 必须接收两个参数。
import functools
def f(x,y):
return x*10+y
iterator = functools.reduce(f, [1,2,3,4])
print(iterator)
输出:
1234
reduce在Python3.3+已经移到functools里了,需要先导入functools。
字符串转整数示例:
from functools import reduce
def 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 + y
reduce(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 True
r = 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 -x
l = [10,5,2,7]
s = sorted(l, key=opposite)
print(s)
输出:
[10, 7, 5, 2]
装饰器
装饰器(Decorator)是一种在代码运行期间动态增加功能的方式。例如,我们有个写日志的函数log(),我们希望在不修改该函数的情况取增强该函数的功能,比如日志前打印一行时间和该函数名:
import time
def writelog(func):
def wrapper(*args, **kw):
print('['+ time.strftime('%Y-%m-%d %H:%M:%S') + '] :' + func.__name__)
return func(*args, **kw)
return wrapper
@writelog
def log(msg):
print(msg)
log('This is a test msg.')
输出:
[2017-01-11 21:10:53] :log
This 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 functools
int2 = functools.partial(int, base=2)
print(int2('10'))
print(int('10'))
输出:
2
10
是不是很简单?
所以,简单总结偏函数functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
Python学习--08函数式编程的更多相关文章
- Scala - 快速学习08 - 函数式编程:高阶函数
函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...
- Python学习_08_函数式编程
在python中,函数名也是一个变量,代表对一个函数内容的引用,意味着可以作为参数传入到其他函数中,根据这个特性,发散出装饰器.闭包等概念,并涉及到变量作用域等问题. 函数 python中函数操作符为 ...
- Python学习:函数式编程(lambda, map() ,reduce() ,filter())
1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- Python Decorator 和函数式编程
看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程
- Python基础:函数式编程
一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...
- 可爱的 Python : Python中的函数式编程,第三部分
英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要: 作者David Mertz在其文章<可爱的 ...
- Python进阶之函数式编程(把函数作为参数)
什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...
随机推荐
- C#-ado.net学习笔记-会有更新
ado.net 通用类对象.在本地内存暂存数据 托管类对象.让本地通用类对象连接数据库,让本地通用类对象和数据库同步 连接数据库 new connection(connectstring) comma ...
- 20145232 韩文浩 《Java程序设计》第3周学习总结
教材学习内容总结 在第三章中,知道了Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.在这一周主要学习了类类型. 对象(Object):存在的具体实体,具有明确的状态和行为 类( ...
- 修改input标签type=file类型的文字
<form name="form" id="form" method="post" enctype="multipart/f ...
- Python自动化开发 - 面向对象(一)
本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...
- DXP常用有效的快捷操作记录
1.在PCB中快速选中一个器件 1) M+C+Enter将弹出元件对话框,移动一个元件后,在十字架光标 状态时按[Enter]键 2)M(Move)+M(Move)按下时,鼠标光标变成“+”后,点击 ...
- 调试 .NET Framework 源代码、.DotNetCore源码
调试 .NET Framework 源代码..DotNetCore源码 如何调试 .NET Framework 源代码 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件 .NE ...
- C#实现枚举的相关操作
枚举中的Descript()描述值,以及枚举值是一种一一对应的关系.我们可以获取其描述值和枚举值,存放到字典中, 在实际的使用中我们就可以轻松的根据枚举值来获取其描述值,也可以通过枚举的描述值来获取其 ...
- Easyui datagrid绑定数据,新增,修改,删除方法(一)
@{ ViewBag.Title = "UsersList"; } <script type="text/javascript"> $(functi ...
- MVC 5使用ViewBag(对象)显示数据
前面Insus.NET有演示使用ViewData来实现控制器与视图的通讯.如果想了解的话,可以从下面两个链接可以查看:<MVC 5使用ViewData(对象)显示数据>http://www ...
- 【译】准备好你求职时候用的 GitHub 账号
我目前正在招聘,很多人分享了他们的GitHubs个人资料和项目,但是维护得很差,所以我决定为活跃的求职者写一个小指南. 无论是否合理,技术招聘人员倾向于从您的GitHub个人资料中推断出很多关于您的信 ...