一 函数对象

函数同样可以作为对象复制给一个变量,如下:

f = abs;
print(f(-10))
f = 'abs';
print(f) def add(a,b,f):
return f(a) + f(b) print(add(-1,2,f))

map 函数, map函数接受一个函数变量,第二个参数为一个可迭代对象,最后返回一个迭代器,由于迭代器的惰性,需要用list()函数返回所有元素。

def squart(n):
return n* n; print(map(squart,range(1,11) ) )
print(list(map(squart,range(1,11) ) ))

reduce函数, reduce函数接受两个参数,第一个参数同样是函数对象f,f必须接受两个参数,并且返回和参数同类型的数据。第二个参数为一个可迭代序列。

def func(a, b):
return a + b print(reduce(func, range(1,11)))

reduce和map函数不一样,reduce返回的是一个最终值

reduce(f,[x1, x2, x3, x4]) = f(f(f(x1,x2),x3),x4)

可以通过reduce和map函数搭配,将一个字符串转化为整数

def str2int(str):
def char2int(c):
return {'':0,'':1,'':2,'':3,'':4,'':5,'':6,'':7,'':8,'':9}
def convertnum(a,b):
return a*10 + b
return reduce(convertnum, map(char2int, str)) print(str2int(""))

filter 函数,filter函数同样有两个参数,第一个参数为函数对象,返回值为bool类型,第二个参数为可迭代序列,返回值为迭代器,

同样需要list()转化为序列。下面用filter和生成器实现一个素数生成器函数

def odd_generater():
n = 1
while True:
n = n+1
yield n def primer_generater():
yield 2
it = odd_generater()
while(True):
n = next(it)
yield n
it = filter(lambda x:x%n > 0, it)

打印测试:

for i in primer_generater():
if(i < 100):
print (i)
else:
break

sorted 函数,第一个接受一个list,第二个为比较的规则,可以不写

print(sorted(["Abert","cn","broom","Dog"]) )

print(sorted(["Abert","cn","broom","Dog"], key = str.lower))

print(sorted(["Abert","cn","broom","Dog"], key = str.lower, reverse = True))

二  函数封装和返回

def lazy_sum(*arg):
def sum():
x = 0
for i in arg:
x = x +i
return x
return sum f = lazy_sum(2,3,1,6,8)
print(f())

定义了一个lazy_sum函数,函数返回内部定义的sum函数。可以在函数A内部定义函数B,调用A返回函数B,从而达到函数B延时调用。

闭包:

在函数A内部定义函数B,函数B内使用了函数A定义的局部变量或参数,这种情况就是闭包。

使用闭包需要注意,在函数B中修改了函数A 定义的局部变量,那么需要使用nonlocal关键字。如果在函数B中修改了全局变量,那么需要使用global关键字。

def lazy_sum(*arg):
sums = 0
def sum():
for i in arg:
nonlocal sums
sums = sums + i
return sums
return sum f1 = lazy_sum(1,3,5,7,9)
f2 = lazy_sum(1,3,5,7,9)
print(f1 == f2)
print(f1() )
print(f2() )

匿名函数:lambda, lambda后面跟函数的参数,然后用:隔开,写运算规则作为返回值

it = map(lambda x:x*x, (1,3,5,7,9))
print(list(it)) def lazy_squart():
return lambda x:x*x
f = lazy_squart()
print(f(3) )

装饰器: 装饰器实际就是函数A中定义了函数B,并且返回函数B,为了实现特殊功能,如写日志,计算时间等等。

先看个返回函数,并且调用的例子

def decoratorfunc(func):
def wrapperfunc():
print('func name is: %s'%(func.__name__))
func()
return wrapperfunc def helloworld():
print('Helloworld !!!') helloworld = decoratorfunc(helloworld)
helloworld()

以后每次调用helloword,不仅会打印Helloworld,还会打印函数名字。

python提供装饰器的功能,可以简化上面代码,并且实现每次调用helloworld函数都会打印函数名字。

def decoratorfunc(func):
def wrapperfunc(*args, **kw):
time1 = time.time()
func(*args, **kw)
time2 = time.time()
print('cost %d secondes'%(time2-time1))
return wrapperfunc @decoratorfunc
def output(str):
print(str)
time.sleep(2) output('hello world!!!')

如果函数带参数,实现装饰器可以内部定义万能参数的函数

def decoratorfunc(func):
def wrapperfunc(*args, **kw):
time1 = time.time()
func(*args, **kw)
time2 = time.time()
print('cost %d secondes'%(time2-time1))
return wrapperfunc @decoratorfunc
def output(str):
print(str)
time.sleep(2) output('hello world!!!')

装饰器执行@decoratorfunc相当于

output = decoratorfunc(output)
output('hello world!!!')

如果装饰器需要传入参数,那么可以增加多一层的函数定义,完成装饰器参数传入和调用。

def decoratorfunc(param):
def decoratorfunc(func):
def wrapperfunc(*arg, **kw):
print('%s %s' %(param, func.__name__))
func(*arg, **kw)
return wrapperfunc
return decoratorfunc @decoratorfunc('execute')
def output(str):
print(str) output('nice to meet u')
print(output.__name__)

#实际执行过程
decorator = decoratorfunc('execute')
output = decorator(now)

output('nice to meet u')

执行print(output.__name__)发现打印出的函数名字不是output而是wrapperfunc,这对以后的代码会有影响。

可以通过python提供的装饰器@functools.wraps(func) 完成函数名称的绑定

def decoratorfunc(param):
def decoratorfunc(func):
@functools.wraps(func)
def wrapperfunc(*arg, **kw):
print('%s %s' %(param, func.__name__))
func(*arg, **kw)
return wrapperfunc
return decoratorfunc @decoratorfunc('execute')
def output(str):
print(str) print(output.__name__)

print(output.__name__)显示为output,这符合我们需要的逻辑。

三  偏函数

如函数 int(a, base = 2) 可以实现一个字符串根据base提供的进制,转化成对应进制的数字。

可以通过偏函数,实现指定参数的固定,并且生成新的函数

intnew = functools.partial(int, base = 2)
print(intnew(''))

也可以自己定义函数:

def add(a,b):
return a+b
print(add(3,7)) addnew = functools.partial(add, 3)
print(addnew(7)) addnew2 = functools.partial(add, b = 7)
print(addnew2(3))

函数部分介绍到此为止,我的公众号,谢谢关注:

 

python学习笔记(六) 函数式编程的更多相关文章

  1. python学习笔记011——函数式编程

    1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...

  2. Python学习笔记6 函数式编程_20170619

    廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...

  3. JS 学习笔记 (六) 函数式编程

    1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...

  4. Python学习笔记之函数式编程

    python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...

  5. python学习笔记1 -- 函数式编程之高阶函数 sorted排序

    python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...

  6. python学习笔记1 -- 函数式编程之高阶函数 map 和reduce

    我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def  fw(参数)这种方式定义一个函数 python有很多的内置函 ...

  7. python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值

    使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...

  8. python学习笔记1 -- 函数式编程之高阶函数 filter

    filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...

  9. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

随机推荐

  1. LVM缩小根分区

    逻辑卷不是根分区都可以在线扩容和缩小 根分区是可以在线扩容,但不可以在线缩小 Linux系统进入救援模式 依次选择: 欢迎界面 ---------- Rescue installed system C ...

  2. 第九次ScrumMeeting博客

    第九次ScrumMeeting博客 本次会议于11月4日(六)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的 ...

  3. 大前端-全栈-node+easyui+express+vue+es6+webpack+react

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 视频来源:https://www.bil ...

  4. Scrum立会报告+燃尽图(十一月十六日总第二十四次):功能开发与设计页面

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://git.coding.net/zhang ...

  5. Scrum立会报告+燃尽图(十月二十九日总第二十次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2288 项目地址:https://git.coding.net/zhang ...

  6. 欢迎来怼---作业要求 20171015 beta冲刺贡献分分配规则

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 基础分      每人占个人总分的百分之40% leangoo里面的得分    每人占个人总分里 ...

  7. C++Primer第五版——习题答案和解析

    感谢原文博主的分享:https://blog.csdn.net/misayaaaaa/article/details/53786215 新手入门必看的书.知识是一个系统化并且相互关联的体系,零散的东西 ...

  8. 有关rand(),srand()产生随机数学习总结

    看到夏雪冬日的有关rand()和srand()产生随机数的总结,挺好的,学习了,然后又有百度其他人的成果,系统总结一下.本文转自夏雪冬日:http://www.cnblogs.com/heyongga ...

  9. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  10. Objective - C 之延展

    延展:为已有的类新增私有方法,只能在本类中使用 一.创建过程: 二.总结: 1.延展只有.h文件,在其中写新方法的声明,在原本的类(Person)中写方法的实现: 2.上述的方法其实很不安全,因为如果 ...