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.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
随机推荐
- 灵书妙探第一季/全集Castle迅雷下载
第一季 Castle Season 1 (2009)看点:ABC电视台2009年开播的一部罪案剧,讲述一位罪案小说家Richard Castle帮助纽约警察局凶杀组破案的故事.凶案组女警探Kate B ...
- ifram 取父窗体的URL地址
var url=''; try { url = window.top.document.referrer ; } catch(M) { if (window.parent) ...
- Android热修复技术总结
https://blog.csdn.net/xiangzhihong8/article/details/77718004 插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高 ...
- C# 程序设置开机启动(一)
一.示例使用VBScript创建启动文件,并添加到Windows系统的启动目录 默认情况下 所有用户启动目录:C:\ProgramData\Microsoft\Windows\Start Menu\P ...
- Hype cycle(Gartner 成熟度曲线)
Hype cycle The hype cycle is a branded graphical presentation developed and used by the American ...
- Chart/Report资源目录
ylbtech-Chart:Chart/Report资源目录 1.Chart.js返回顶部 1-0.官网 http://www.chartjs.org 1-1.实例 http://www.chartj ...
- maven-assembly-plugin 入门指南
当你使用 Maven 对项目打包时,你需要了解以下 3 个打包 plugin,它们分别是 plugin function maven-jar-plugin maven 默认打包插件,用来创建 proj ...
- 混合开发 Hybird Cordova PhoneGap web 跨平台 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【Scala】Scala-Map使用方法
Scala-Map使用方法 scala map put_百度搜索 Scala中的Map使用例子 - CSDN博客 How to populate java.util.HashMap on the fl ...
- 【python3】 enumerate用法总结(转)
http://blog.csdn.net/churximi/article/details/51648388 enumerate()说明 enumerate()是python的内置函数 enumera ...