一、高阶函数

函数只要有以下两个特征中一个就可以称为高阶函数:

  a:函数名作为一个实参传入另一个函数中

  b:函数的返回值中包含函数名

下面我们用代码来感受一下这两种形式:

import time
# 通过高阶函数将函数名作为参数传入,在不改变函数源代码的情况下为其添加功能
def bar():
time.sleep(3)
print("in the bar") def test1(func):
start_time = time.time()
func()
end_time = time.time()
print("in the function the cost time is :%s"%(end_time-start_time)) test1(bar)

  将函数名作为一个参数传入,这样就可以实现不修改函数源代码的情况下为其增加功能。

def bar():
time.sleep(3)
print("in the bar") def test2(func):
print(func)
return func
bar = test2(bar)
bar()

  返回值中包含函数名,这样就可以实现不修改函数的调用方式

  以上两点非常重要,是我们在接下来要将的装饰器能够实现的原理。

二、装饰器

  在搞清楚以上两个高阶函数的形式和可以实现的功能之后,我们就可以在此基础上实现装饰器。

  装饰器为了实现以下两个目的,一方面为已有的函数增加新的功能,另一方面要不改变函数的调用的方式。

  

import time

def timer(func):  #timer(test1) func = test1
def wrapper(*args,**kwargs): #这里加了*args和**kwargs就可以不限制被修饰参数的类型了
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print("the function runing time is %s"%(stop_time-start_time))
return wrapper @timer # test1 = timer(test1) =deco
def test1():
time.sleep(3)
print("in the test 1") #print(timer(test1)) 打印deco的内存地址
test1() #实际上在执行deco

python笔记十三(高阶函数、装饰器)的更多相关文章

  1. python 函数式编程 高阶函数 装饰器

    # -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...

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

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

  3. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  4. Python入门篇-高阶函数

    Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数  1>.First Class Object 函数在Python中是一等公民 函数也 ...

  5. Python学习之高阶函数--嵌套函数、函数装饰器、含参函数装饰器

    玩了一晚上王者,突然觉得该学习,然后大晚上的搞出来这道练习题,凌晨一点写博客(之所以这么晚就赶忙写是因为怕第二天看自己程序都忘了咋写的了),我太难了o(╥﹏╥)o 言归正传,练习题要求:构造类似京东的 ...

  6. Python学习笔记系列——高阶函数(map/reduce)

    一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...

  7. python字符串反转 高阶函数 @property与sorted(八)

    (1)字符串反转 1倒序输出 s = 'abcde' print(s[::-1]) #输出: 'edcba' 2 列表reverse()操作 s = 'abcde' lt = list(s) lt.r ...

  8. Python基础——4高阶函数

    高阶函数 函数本身可用变量指向,把变量当做函数参数的函数成为高阶函数 map and reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...

  9. 匿名函数python内置高阶函数以及递归

    匿名函数 python定义一个函数通常使用def关键词,后面跟函数名,然后是注释.代码块等. def func(): '''注释''' print('from func') 这样就在全局命名空间定义了 ...

  10. python 常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

随机推荐

  1. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(二)

    本篇为JVM虚拟机规范1.7中的运行时常量池部分系列的第二篇. 4.4.4. The CONSTANT_Integer_info and CONSTANT_Float_info Structures ...

  2. SQL优化(SQL TUNING)之10分钟完成亿级数据量性能优化(SQL调优)

    前几天,一个用户研发QQ找我,如下: 自由的海豚. 16:12:01 岛主,我的一条SQL查不出来结果,能帮我看看不? 兰花岛主 16:12:10 多久不出结果? 自由的海豚 16:12:17 多久都 ...

  3. Spring(二):Spring框架&Hello Spring

    Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架. Spring 框架 ...

  4. [Leetcode] 220. Contains Duplicate III

    Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...

  5. SpringBoot中@ManyToMany的坑

    我在User表中添加了manytomany的外键映射 @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="user_role", ...

  6. SQL Server 2014 HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING 等待

    最近有发现SAP 的MES系统上了AlwaysOn后辅助节点发现无法查询的情况,例如在辅助节点上执行: SELECT TOP 0 * FROM TABLE1; 语句执行正常SELECT TOP 1* ...

  7. SQL to Java code for Elasticsearch

    Elasticsearch虽然定位为Search Engine,但是因其可以持久化数据,很多时候,我们把Elasticsearch当成Database用,但是Elasticsearch不支持SQL,就 ...

  8. CentOS 7下Flannel安装与配置

    1. 安装前的准备 etcd 3.2.9 Docker 17.12.0-ce 三台机器10.100.97.236, 10.100.97.92, 10.100.97.81 etcd不同版本之间的差别还是 ...

  9. SSO-单点统一登录系统的设计与实现

    本文主要基于web类应用展开讨论,提供的是一种通用机制和方法,所以不论何种技术栈都可进行相应的具体实现. 实现目标 可以在相同或跨域环境下完成各应用的统一登录/注销 方案原理 本质上是采用了web应用 ...

  10. Struts2--验证框架

    Struts2的验证通过配置xml或者注解的方式.依赖与validationheworkflow接口(被默认的拦截器桟引入).validation接口执行验证并且创建一些列的错误域.workflow接 ...