Python学习笔记二:函数式编程
1:Python中,内置函数名相当于一个变量,指向内置函数。所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了。
2:高级函数:Python中,可以把一个函数变量作为函数参数来使用。参数中有函数变量的函数,称之为高阶函数。
map(f,list)函数:定义一个函数f,把f和一个list作为map()的参数,可=可以对list的每一个元素进行f操作,并返回一个新的list。
reduce(f,list,init)函数:对list的元素反复进行f操作,直到list最后一个元素处理完毕。init参数可选,作为reduce计算的初始值。可以用来求和、求积。
filter(f,list)函数:接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
sorted(list)函数可对list进行排序,sorted(list,f)也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。(-1在前).sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较.
3:函数内定义函数与返回函数:Python函数中,可以再定义函数,然后把该内部函数作为返回值return。
返回函数的懒使用:用一个变量接收了函数返回值之后,相当于该变量指向了一个函数。调用该函数很简单,用 接收变量() 的形式即可调用函数。
注意:内层函数引用了外层函数的变量(外层函数参数也算变量),则该内层函数不能移到外层函数的外面去。内层函数使用外层函数的变量并且作为外层函数的返回值的情况称为闭包(Closure)。要正确使用闭包,就要确保引用的外层函数的变量在外层函数返回后不能变,不然返回后的内层函数被调用时就会使用错的参数值。
4:匿名函数:可以用 lambda 参数:表达式 定义一个匿名函数作为高阶函数的参数,表达式的结果就是匿名函数返回值。
5:装饰器
可以定义一个高阶函数,传进来一个函数参数。在高阶函数中,对参数f进行操作上的包装,如:先打印日志,再调用函数f。函数装饰器类比Java中的动态代理。
定义装饰器:
def performance(f):
def fn:
对参数函数f进行包装;
return fn;//返回包装过的函数
使用装饰器:
@performance//在需要包装的函数定义前面加 @装饰器名 ,即可把该函数传递给装饰器
def factorial(n):
函数操作 之后,在其他地方调用factorial(n)时,其实是调用装饰器中包装过的方法fn
4:带参数的装饰器
带参数的装饰器内部还包含一个装饰器,外层装饰器有参数,内部装饰器负责包装并返回包装过的函数:
def log(prefix)://外层装饰器,接收参数prefix
def log_decorator(f)://内层装饰器,对函数f进行包装
def wrapper(*args, **kw)://包装函数:自适应任何参数定义的函数,用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用
print '%s %s()...' % (prefix, f.__name__)//使用外层装饰器的参数值
return f(*args, **kw)//调用被包装的函数,注意参数列表
return wrapper//返回包装过的函数
return log_decorator//返回内层装饰器 @log('DEBUG')//定义函数时,使用装饰器并传参
def test():
pass
print test()
5:完善装饰器
使用装饰器包装过函数f后,返回fn。这样在别的地方使用f()时,其实是调用fn(),并且打印f.__name__等函数属性时,其实是fn函数的属性。
为了避免包装后函数f的属性被改变,可以在包装函数前面,通过 @functools.warps(f) 把函数f的一些属性直接赋值给fn的同名属性,使得二者一致。
def log(prefix)://外层装饰器,接收参数prefix
def log_decorator(f)://内层装饰器,对函数f进行包装
@functools.wraps(f)//把参数f的函数名等属性赋值给包装函数wrapper
def wrapper(*args, **kw)://包装函数:自适应任何参数定义的函数,用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用
print '%s %s()...' % (prefix, f.__name__)//使用外层装饰器的参数值
return f(*args, **kw)//调用被包装的函数,注意参数列表
return wrapper//返回包装过的函数
return log_decorator//返回内层装饰器 @log('DEBUG')//定义函数时,使用装饰器并传参
def test():
pass
print test()
6:偏函数
fn = functools.partial(f, 默认参数值):可以指定函数f的一些默认参数值,然后在其他地方使用 fn(参数) 调用函数f 时,就可以不写默认参数,减少代码量。
import functools def cmp_ignore_case(s1, s2)://定义比较器
return cmp(s1.lower(),s2.lower()) sorted_ignore_case = functools.partial(sorted,cmp=cmp_ignore_case)//定义偏函数,为排序函数指定默认比较器 print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])//调用偏函数进行排序
(可见,函数式编程是以函数为单位、为对象的编程思维,可以把面向对象编程的封装、代理等思想应用到函数式编程中)
Python学习笔记二:函数式编程的更多相关文章
- Clojure学习笔记(二)——函数式编程
定义 “函数式编程”是一种编程范式(programming paradigm),即如何编写程序的方法论.主要思想是把运算过程尽量写成一系列嵌套的函数调用. 举例来说,现在有这样一个数学表达式: (1 ...
- python学习笔记011——函数式编程
1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...
- Python学习笔记6 函数式编程_20170619
廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...
- python学习笔记(六) 函数式编程
一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...
- python学习笔记1 -- 函数式编程之高阶函数 map 和reduce
我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def fw(参数)这种方式定义一个函数 python有很多的内置函 ...
- Python学习笔记之函数式编程
python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...
- python学习笔记1 -- 函数式编程之高阶函数 sorted排序
python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...
- python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值
使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...
- python学习笔记1 -- 函数式编程之高阶函数 filter
filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...
- python学习笔记(二)、字符串操作
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
随机推荐
- TrafficStats——流量统计类的范例,获取实时网速
2.3开始android就提供来这个类的API,这样我们就可以方便的用他来实现统计手机流量来.这个类其实也很简单,我贴上他的几个方法,大家一看就知道怎么用了. static long getMobil ...
- Visual Studio提示“无法启动IIS Express Web服务器”的解决方法 vs调试显示无法显示此页面 ,vs调试浏览器白页
有时,在使用Visual Studio运行ASP.NET项目时,会提示“无法启动IIS Express Web服务器”,无法运行,如图: 这一般出现在重装系统之后,或者项目是从别的电脑上复制过来的.解 ...
- 支付宝 iphone6 指纹验证失败
重启 iphone6 就可以了. 再次打开 支付宝 那个 指纹功能,就有一个弹出框 可以按指纹了.
- CListCtrl 之右键菜单
在使用CListCtrl时要为它添加一个右键菜单,步骤如下: 1. 响应CListCtrl的NM_RCLICK消息. 2. 添加一个菜单资源,在菜单资源中插入要添加到菜单内容. 一般存在两种方法: ...
- html5各种页面切换效果和模态对话框
页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop ...
- Backbone.js 使用 Collection
在前面我们的 Backbone.js 用上了 Model, 但绝大数的情况下我们处理的都是一批的 Model 数据列表,所以需要有一个 Collection 来容纳 Model, 就像 Java 里最 ...
- 查看LINQ Expression編譯後的SQL語法(转)
在用了LINQ語法之後的一個月,我幾乎把SQL語法全部拋到腦後了,不過 LINQ好用歸好用,但是實際上操作資料庫的還是SQL語法,如果不知道LINQ語法 編譯過後產生怎樣的SQL語法,一不小心效能就會 ...
- PHP入门(一)
一.概述 PHP(Hypertext Preprocessor缩写),全称超级文本预处理器,是一种在服务器端执行的脚本语言.因此既具备了脚本语言的优缺点 ,又具备了后台服务器语言的优异性能.可以说PH ...
- css的overflow属性
原文:https://www.jianshu.com/p/67b536fc67c1 ------------------------------------------- 事实上我挺长一段时间都没弄清 ...
- c#:winform从一个toolstriptool上拖动一个图标到一个自定义usercontrol内。
效果: 在一个winform工程中,添加一个ToolStrip然后给它添加一个ToolStripButton(tsbStart,它就是红色框圈选的图标) this.toolStripTools = n ...