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.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
随机推荐
- [转]mysql 存储过程中使用多游标
From : http://www.netingcn.com/mysql-procedure-muti-cursor.html mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致 ...
- smb与samba
为了使Windows 主机间的资源能够共享,微软于1980年开发了SMB(Server Message Block)通信协议,并通过SMB通信协议,使网络上各台主机之间能够共享文件.打印机等资源.目前 ...
- spring mvc 返回乱码SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题
原文地址:https://www.cnblogs.com/fzj16888/p/5923232.html 先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文 ...
- Maven 搭建spring boot多模块项目(附源码),亲测可以,感谢原创
原创地址:https://segmentfault.com/a/1190000005020589 我的DEMO码云地址,持续添加新功能: https://gitee.com/itbase/Spring ...
- #incldue<cctype>函数系列
#include <cctype>的函数 c++中应该是#include <cctype> c中应该是#include <ctype.h> 以下为字符函数库中常用的 ...
- go语言之进阶篇空接口
1.空接口 示例: package main import "fmt" func xxx(arg ...interface{}) { } func main() { //空接口万能 ...
- c#中的数组、ArrayList、List区别【转】
首先说明C#中的Array类:Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义.Array 类提供了各种用于数组的属性和方法.关于Array类的一些属性及方法详见博文:C ...
- Solr4.0+IKAnalyzer中文分词安装(转)
有近2年没接触Solr跟Lucene了,这2年自己跟solr/lucene都发生了很多变化.不过有种疏途同归的感觉,那就是都向分布式/云和监控靠了.2年前接触了solrcloud,那时大概玩了一周.那 ...
- iOS开发-UITapGestureRecognizer手势
手势在iOS开发中是一个比较常用的功能,不过相对来说大家用的比较少,经常刷网易新闻,上次用了一下捏合手势才发现可以调整字体大小.昨天看到一个介绍摇一摇这个功能的,没看到之前一直都觉得摇一摇是微信的专有 ...
- MyBatis动态SQL foreach标签实现批量插入
需求:查出给定id的记录: <select id="getEmpsByConditionForeach" resultType="com.test.beans.Em ...