python 函数式编程 高阶函数 装饰器
# -*- coding:gb2312 -*-
#coding=utf-8
# 高阶函数
import math
def is_sqr(x):
y = int(math.sqrt(x))
return x == y*y
print filter(is_sqr, range(1, 101)) # 返回函数
# 作用:延迟执行
def calc_prod(lst):
def lazy_prod():
def f(x,y):
return x*y
return reduce(f, lst) return lazy_prod f = calc_prod([1, 2, 3, 4])
print f() # 匿名函数
print filter(lambda s: s and len(s.strip()) > 0, ['test', None, '', 'str', ' ', 'END']) # 装饰器 @decorator
print "....装饰器...."
def log(f):
# 写法一
# def fn(x):
# print 'call ' + f.__name__ + '()...'
# return f(x)
# return fn
# 写法二
print 'call ' + f.__name__ + '()...'
return f @log
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10) # 无参数装饰器
print "....无参数装饰器...." import time
# 写法一,接收一个函数返回一个新函数,但是返回的新函数必须符合原函数的调用规则,即参数应该一致。
# 如,log()是无参函数,则调用就不能传递参数
def performance(f):
def log(x):
print time.time()
return f(x)
return log # 写法二,不用函数封装,直接添加新的操作
def performance2(f):
print time.time()
return f # 写法一优化,被装饰的函数前后可以执行不同的操作,即,返回的新函数可以在任意时候调用被装饰的函数
def performance3(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r
return log # 写法二优化,不用函数封装,直接添加新的操作
def performance4(f):
start_time = time.time()
r = f # 在此处调用被装饰函数
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r @performance4
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) # 带参数装饰器
print "....带参数装饰器...." def performance_parm(unit='s'):
def performance5(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log
return performance5 @performance_parm('M')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) # 完善decorator
print "....完善decorator...."
print factorial.__name__
# => log
# 可见,由于decorator返回的新函数函数名已经不是'f2',而是@log内部定义的'wrapper'。这对于那些依赖函数名的代码就会失效。
# decorator还改变了函数的__doc__等其它属性。
# 如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中。
# Python内置的functools可以用来自动化完成这个“复制”的任务
import functools
def performance5(f):
@functools.wraps(f)
def log(x):
start_time = time.time()
r = f(x) # 在新函数的此处调用被装饰函数,但是,此时被装饰函数尚未被调用,因为log函数尚未被调用,只是返回了函数对象
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log @performance5
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print "....装饰器修改后...."
print factorial.__name__
python 函数式编程 高阶函数 装饰器的更多相关文章
- Python函数式编程-高阶函数、匿名函数、装饰器、偏函数
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- Python实用笔记 (12)函数式编程——高阶函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...
- [Python3] 035 函数式编程 高阶函数
目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...
- C#函数式编程-高阶函数
随笔分类 -函数式编程 C#函数式编程之标准高阶函数 2015-01-27 09:20 by y-z-f, 344 阅读, 收藏, 编辑 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的 ...
- 函数式编程 高阶函数 map&reduce filter sorted
函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
随机推荐
- 面试中很值得聊的二叉树遍历方法——Morris遍历
Morri遍历 通过利用空闲指针的方式,来节省空间.时间复杂度O(N),额外空间复杂度O(1).普通的非递归和递归方法的额外空间和树的高度有关,递归的过程涉及到系统压栈,非递归需要自己申请栈空间,都具 ...
- akka-typed(1) - actor生命周期管理
akka-typed的actor从创建.启用.状态转换.停用.监视等生命周期管理方式和akka-classic还是有一定的不同之处.这篇我们就介绍一下akka-typed的actor生命周期管理. 每 ...
- 我的Android知识结构图——20200507停止更新,后续通过标签或分类继续完善结构图
*持续更新中.调整中(带链接的是已经总结发布的,未带链接是待发布的) *个别知识点在多个分类中都是比较重要部分,为了分类完整性 可能多出都列出了 *每一篇都是认真总结并写出来的,若哪里有问题欢迎指正 ...
- python调用大漠插件教程03窗口绑定实例
怎样利用注册好的大漠对象来绑定窗口? 直接上代码,根据代码分析 from win32com.client import Dispatch import os from win32gui import ...
- Blazor WebAssembly 修仙之途 - 组件与数据绑定
一.前言 在第一篇文章中,有提到过组件(Component)这个概念.组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component.re ...
- tomcat session漏洞反序列化详解
1. 条件1)攻击者可以控制服务器上的文件名/文件内容2)tomcat context配置了persistencemanager的fileSotre3) persistenceManager 配置了s ...
- HashiCorp遭禁不必过于担忧,博云云管产品自主可控
近日,国外知名 DevOps 服务商 HashiCorp 官网相关条款页面更新,声明中表示禁止在中国使用其 Vault 企业版产品,此事件引发国内开源界广泛关注. HashiCorp解释是由于中国的出 ...
- HTML静态页面项目:英雄联盟官网网站 的实现
效果: 源码与素材:链接: https://pan.baidu.com/s/1OuJd1lfEV7mrnf0I6FXm4A 提取码: 5c6j 复制这段内容后打开百度网盘手机App,操作更方便哦
- Blender如何设置中文界面
废话不多说,上图 bingo!!
- Java实现第八届蓝桥杯国赛 数字划分
标题:数字划分 w星球的长老交给小明一个任务: 1,2,3-16 这16个数字分为两组. 要求: 这两组数字的和相同, 并且,两组数字的平方和也相同, 并且,两组数字的立方和也相同. 请你利用计算机的 ...