Python基础进阶篇——函数式编程
来源:互联网 发布:鬼吹灯网络季播剧 编辑:程序博客网 时间:2024/04/30 02:19
上一篇博文贴出了博主学习Python的基础知识代码,这篇博文贴出博主学习Python中的函数式编程,简单说一下,函数式编程是一种编程思想,跟函数不一样。在这里将提到很多Python的内建函数,请看以下代码;
Ps:强烈建议看过博主的《Python入门基础》后再看这篇文章下的代码,这样你会很容易看懂;
欢迎大家学习交流,有问题可以再评论中提出,因为博主也是新手菜鸟,我们可以共同学习,共同进步~
#-*- coding: utf-8 -*-# tython中的map()函数;# map()函数不改变原有的list,而是返回一个新的listdef f(x): return x*xprint map(f, [1,2,3,4,5,6,7,8,9])def format_name(s): return s[0].upper()+s[1:].lower()print map(format_name, ['adam','LISA','barT'])# reduce()函数;其传入的函数f必须接收两个参数;# reduce()对list的每个元素反复调用函数f,并返回最终结果值。def fs(x,y): return x+yprint reduce(fs,[1,3,5,7,9])# 先计算两个元素:f(1,3),结果为4,# 再把结果和第3个元素计算:f(4,5),结果为9,# 再把结果和第4个元素计算:f(9,7),结果为16,# 再把结果和第5个元素计算:f(16,9),结果为25,# 没有更多的元素了,返回结果25def prop(x,y): return x*yprint reduce(prop, [2,4,5,7,12])# filter()函数也是接收一个函数f和一个list作为参数,# filter()依据判断结果自动过滤掉不符合条件的元素,返回符合条件的元素组成的新listdef is_odd(x): return x%2 == 1print filter(is_odd,[1,4,6,7,9,12,17])import mathdef is_sqr(x): r = int(math.sqrt(x)) return r*r == xprint filter(is_sqr, range(1,101))# 删除None或者空字符串功能:def is_not_empty(s): return s and len(s.strip())>0print filter(is_not_empty, ['test',None,'','str',' ','END'])# 这里说一下s.strip()用于删除s字符串中开头、结尾处的rm序列的字符;# 当rm为空时,默认删除空白符(包括:'\n','\r','\t','')# 这里rm只是个变量名a = ' 123'print a.strip()b = '\t\t123\r\n'print b.strip()c = 'abstingaaabs'd = 'absbbtingbbabs'e = 'absaatingbbbs'f = 'absfbas'rm = 'abs'print c.strip(rm) # tingprint d.strip(rm) # tingprint e.strip(rm) # tingprint f.strip(rm) # f# 自定义排序print sorted([36,5,12,9,21],cmp)# sorted()也是高阶函数,他可以接受一个比较函数来实现自定义排序;# 比较函数的定义是传入两个待比较的元素x,y,如果x应该排在y的前面,返回-1.# 如果x应该排在y的后面,返回1,如果x和y相等,返回0# cmp是函数的默认参数,如果直接传cmp则是从小到大的顺序排序;def reversed_cmp(x,y): if x>y: return -1 if x<y: return 1 return 0print sorted([36,5,12,9,21], reversed_cmp)# sorted()也可以对字符串进行排序;def cmp_ignore_case(s1,s2): u1 = s1.upper() u2 = s2.upper() if u1>u2: return 1 if u1<u2: return -1 return 0print sorted(['bob','about','Zoo','Credit'], cmp_ignore_case)# python 返回函数def cacl_sum(lst): return sum(lst)print cacl_sum([1,2,3,4,5,6]) #21 这回立马执行并返回相加的结果def cacl_sum1(lst): def lazy_sum(): return sum(lst) return lazy_sumf = cacl_sum1([1,2,3,4,5,6,])print f() # 21 所以这样你可以控制函数什么时候执行返回结果;def calc_prop(lst): def lazy_prop(): def f(x,y): return x*y return reduce(f, lst, 1) return lazy_propf = calc_prop([1,2,3,4])print f()# python中的闭包def count(): fs = [] for i in range(1,4): def f(): return i*i fs.append(f) return fsf1,f2,f3 = count()# 当count()执行的时候,返回fs中有三个函数,这三个函数所引用的变量i已经变成了3# 由于他们三个并没有被调用,所以也并没有计算i*i的值,f1()被调用的时候,才会输出3*3,结果是9;#因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量;# 用闭包决绝这种情况def count(): fs = [] for i in range(1,4): def f(j): def g(): return j*j return g r=f(i) fs.append(r) return fsf1,f2,f3 = count()print f1(), f2(), f3()# python中匿名函数,关键字lambda表示匿名函数;# 匿名函数有个限制,只能有一个表达式,不写return,返回值就是该表达式的结果def is_not_empty1(s): return s and len(s.strip())>0print filter(is_not_empty1, ['test',None,'','str',' ','END'])# 可用匿名函数简写成:print filter(lambda s:s and len(s.strip())>0,['test',None,'','str',' ','END'])# decorator装饰器:在函数调用的过程中,动态的给函数添加功能,又不想改动函数本身的代码def f1(x): return x*2def new_fn(f): def fn(x): # 这是装饰器函数,既可以调用f1()函数,也打出log; print 'call'+f.__name__+'()' return f(x) return fn#调用方法:g1 = new_fn(f1)print g1(5)# 也可以将装饰器函数结果直接赋值给f1,这样隐藏了原始定义f1f1 = new_fn(f1)print f1(5)# 简单调用;@new_fndef f2(x): return x*3print f2(10)# 这是一个log的定义# python中编写无参数decoratordef log(f): def fn(x): print 'call'+f.__name__+'()' return f(x) pass return fn pass@logdef factorial(n): return reduce(lambda x,y:x*y, range(1, n+1)) passprint factorial(10)# 若参数不是一个的函数,调用将报错#@log#def add(x,y):# return x+y# pass#print add(1,2)#这是因为上方定义的log函数写死了只含一个参数的返回函数——f(x);def log(f): def fn(*args,**kw): print 'call'+f.__name__+'()' return f(*args, **kw) return fn@logdef add(x,y): return x+y passprint add(1,2)# 这样对于任意函数,@log都能正常工作;# 编写无参数decoratorimport timedef performance(f): def fn(*args,**kw): t1 = time.time() r = f(*args, **kw) t2 = time.time() print 'call %s() in %fs' %(f.__name__,(t2-t1)) return r return fn@performancedef factorial(n): return reduce(lambda x,y:x*y, range(1,n+1))print factorial(1000)# 编写带参数decoratordef log(param): def log_decorator(f): def fn(*args, **kw): print '[%s]%s()'%(param, f.__name__) return f(*args, **kw) pass return fn pass return log_decorator pass# 调用@log("INFO")def test(x): return x*10 passprint test(10) # [INFO]test() # 100# 上面@performance只能打印秒,给他传个参数,允许打印's'或'ms'def performance(s): def performance_decorator(f): def fn(*args,**kw): t1 = time.time() r = f(*args,**kw) t2 = time.time() t = (t2-t1)*1000 if s == 'ms' else (t2-t1) print 'call%s() in %f %s'% (f.__name__, t, s) return r pass return fn pass return performance_decorator pass@performance('ms')def factorial(n): return reduce(lambda x,y:x*y, range(1,n+1))print factorial(10)print factorial.__name__ # fn# 完善decoratorimport functoolsdef performance(untils): def perf_decorator(f): @functools.wraps(f) def wapper(*args, **kw): t1 = time.time() f(*args, **kw) t2 = time.time() t = (t2-t1)*1000 if untils == 'ms' else (t2-t1) print 'call %s() in %f %s'% (f.__name__, t, untils) return r pass return wapper pass return perf_decorator pass@ performance('ms')def factorial(n): return reduce(lambda x,y:x*y, range(1,n+1)) passprint factorial.__name__ # factorial打印出来的函数名仍是函数本身的函数名#而不是函数wapper,因为functools工具把原函数的必要属性‘复制’到新函数上来了#python中的偏函数import functools#int(x,base)这里的base参数默认为10,如果传入base参数,我们就可以做n进制的转换print int ('12345',8)print int ('12345',16)def int1(x, base=2): return int (x, base) passprint int1('101100')int2 = functools.partial(int, base=8)print int2 ('12345')# 排序的偏函数改造sorted_ignore_case = functools.partial(sorted, cmp = lambda s1,s2:cmp(s1.upper(), s2.upper()))print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])
0 0
- Python基础进阶篇——函数式编程
- Python 进阶 —— 函数式编程
- Python基础进阶篇——面向对象编程基础
- Python进阶-函数式编程
- python进阶-函数式编程
- Python进阶学习笔记——函数式编程之高阶函数
- Python进阶学习笔记——函数式编程之返回函数&闭包
- 一、Python 进阶 之 函数式编程
- Python进阶---函数式编程简介
- Python进阶之函数式编程
- Python 进阶_函数式编程
- python基础——函数编程
- 廖雪峰老师——Python进阶( 函数式编程 )
- Python进阶—map函数
- Python进阶—filter函数
- 前端基础进阶(七):函数与函数式编程
- 前端基础进阶(六):函数与函数式编程
- java进阶路—编程基础
- sql增加索引
- 使用commons-fileupload上传文件到服务器
- 从Code Review 谈如何做技术
- PLSQL远程连接oracle数据库配置
- centos7下创建新用户并授权
- Python基础进阶篇——函数式编程
- ubuntu 16.04 安装 eclipse c++
- IOS 蓝牙(BLE)4.0 的认知与开发
- 调用相册 拍照 截取图片
- maven导json-lib报错
- 如何恢复MySQL主从数据一致性
- Java Jersey使用总结(转)
- RCNN介绍
- mybatis sql转义符号