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.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
随机推荐
- svn各种箭头的含义
黄色感叹号(有冲突): 有冲突了,冲突就是你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许 你提交,防止你的提交覆盖了 ...
- 逍遥法外第一季/全集How To Get Away With Murder迅雷下载
英文译名 How To Get Away With Murder (第1季) (2014-09-26首播)ABC.本季看点: <逍遥法外又名:天才刑法班>由<实习医生格蕾>和& ...
- ExtJS 4.2 教程-01:Hello ExtJS
转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-1-hello-extjs, 本文还发布在了ExtJS教程网站起飞网上面,如果转载请保留本段声明,谢谢合作 ...
- [Web 前端] react-router4-0中文文档
cp : https://blog.csdn.net/sinat_17775997/article/details/70344625 http://618cj.com/react-router4-0% ...
- Html、Asp、Php、Jsp禁止页面缓存
html:<meta http-equiv="pragma" content="no-cache"><meta http-equiv=&quo ...
- [转]ThinkPHP中如何使用原生SQL
From : http://huangqiqing123.iteye.com/blog/1540323 TP的模型可以支持原生SQL操作,提供了query和execute两个方法,为什么原生SQL还要 ...
- Populating Next Right Pointers in Each Node II leetcode java
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- Generate Parentheses leetcode java
题目: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...
- ul里不能直接嵌套div(在ie7以前版本)
平时为了写某个js效果,从而忽略了标签的嵌套 从而导致了IE6-7混乱,在ul下,直接嵌套div,在ie7以前版本,会出现的状况是:div会被离它最近的li包裹住. 请看dome <ul cla ...
- VB.NET,C#.NET调用Web Service,利用visual studio 的实现方法
下面是一篇文章比较详细,其实具体操作很简单,把Web Service服务地址,利用工具(VS2010),通过添加引用的形式,添加到项目中来就可以应用了. 大家如果这个地方不会操场的话,可以问问我QQ: ...