# -*- 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 函数式编程 高阶函数 装饰器的更多相关文章

  1. Python函数式编程-高阶函数、匿名函数、装饰器、偏函数

  2. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  3. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  4. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  5. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  6. [Python3] 035 函数式编程 高阶函数

    目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...

  7. C#函数式编程-高阶函数

    随笔分类 -函数式编程 C#函数式编程之标准高阶函数 2015-01-27 09:20 by y-z-f, 344 阅读, 收藏, 编辑 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的 ...

  8. 函数式编程 高阶函数 map&reduce filter sorted

    函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...

  9. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

随机推荐

  1. Qt版本中国象棋开发(一)

    开发目的:实现象棋人机对战简单AI,网络对战,移植到android中. 开发平台:windows10 + Qt5.4 for android 开发语言:C++ 开发过程:1.棋盘绘制: 方法一:重写  ...

  2. vue使用IntersectionObserver实现无限下拉信息流

    基于 IntersectionObserver 异步监听方法,实现无线信息流下拉加载, https://developer.mozilla.org/zh-CN/docs/Web/API/Interse ...

  3. python调用大漠插件教程02大漠插件绑定测试工具

    什么是大漠插件绑定测试工具? 这是大漠插件为了方便使用者调试绑定窗口的模式而设计的,因为有些程序不会接受一般的鼠键事件的响应模式,每个程序所需要的响应模式都不尽相同,所以这个工具可以使我们在绑定窗口时 ...

  4. js函数中的this关键字

    关于这个this关键字,也是很多项目中常常被用到的,那么,有人也许会问,干嘛要用this呢,在函数被调用时,直接指明是什么对象在调用不就行了?还整那么个模模糊糊的概念出来干嘛?不过嘛,存在即真理,既然 ...

  5. 一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝)

    背景 在日常开发中,偶尔会遇到需要复制对象的情况,需要进行对象的复制. 由于现在流行标题党,所以,一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝) 理解 首先就需要理解 js 中的数据类型 ...

  6. 进程调度函数scheduler_tick()的触发原理:周期PERIODIC定时器

    参考文章: https://www.jb51.net/article/133579.htm https://blog.csdn.net/flaoter/article/details/77509553 ...

  7. Java 第十一届 蓝桥杯 省模拟赛 合法括号序列

    合法括号序列 题目 问题描述 由1对括号,可以组成一种合法括号序列:(). 由2对括号,可以组成两种合法括号序列:()().(()). 由4对括号组成的合法括号序列一共有多少种? 答案提交 这是一道结 ...

  8. (Java实现) 洛谷 P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...

  9. (Java实现) 洛谷 P1387 最大正方形

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  10. Java实现 蓝桥杯VIP 算法提高 进制转换

    算法提高 进制转换 时间限制:1.0s 内存限制:256.0MB 问题描述 程序提示用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制 ...