一、闭包函数

闭包函数:1、函数内部定义函数,成为内部函数,
     2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数
  1. #最简单的无参闭包函数
  2. def func1()
  3. name='ares'
  4. def func2()
  5. print(name)
  6. #有参和返回值的闭包函数
  7. def timmer(func):
  8. def wrapper(*args,**kwargs):
  9. start_time = time.time()
  10. res=func(*args,**kwargs)
  11. stop_time=time.time()
  12. print('run time is %s' %(stop_time-start_time))
  13. return res
  14. return wrapper

二、高阶函数

  1)函数接收的参数是一个函数名
  2)函数的返回值是一个函数名
  3)满足上述条件任意一个,都可称之为高阶函数
  1. #高阶函数应用1:把函数当做参数传给高阶函数
  2. import time
  3. def foo():
  4. print('from the foo')
  5. def timmer(func):
  6. start_time=time.time()
  7. func()
  8. stop_time=time.time()
  9. print('函数%s 运行时间是%s' %(func,stop_time-start_time))
  10. timmer(foo)
  11. #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
  12. #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
  13. import time
  14. def foo():
  15. print('from the foo')
  16. def timmer(func):
  17. start_time=time.time()
  18. return func
  19. stop_time=time.time()
  20. print('函数%s 运行时间是%s' %(func,stop_time-start_time))
  21. foo=timmer(foo)
  22. foo()
  23. #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
高阶函数总结
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能
三、函数嵌套
  1. #函数的嵌套定义
  2. def f1():
  3. def f2():
  4. def f3():
  5. print('from f3')
  6. print('from f2')
  7. f3()
  8. print('from f1')
  9. f2()
  10. # print(f1)
  11. f1()
  12. '''
  13. from f1
  14. from f2
  15. from f3
  16. '''

四、装饰器

1、定义:
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)
  即、1)不修改被装饰函数的源代码
    2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式
3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
  装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
 
装饰器=高阶函数+函数嵌套+闭包
基本框架
  1. #这就是一个实现一个装饰器最基本的架子
  2. def timer(func):
  3.   def wrapper():
  4.     func()
  5.   return wrapper

例:

  1. def deco(fn):
  2. def wapper():
  3. fn()
  4. return wapper
  5. @deco
  6. def foo():
  7. print('what are you 弄啥嘞')
  8. foo()

统计一个函数运行时间的装饰器

  1. import time
    import random
    #装饰器
    def timmer(func):
    # func=index
    def wrapper():
    start_time = time.time()
    func() #index()
    stop_time=time.time()
    print('run time is %s' %(stop_time-start_time))
    return wrapper
    #被装饰函数
    def index():
    time.sleep(random.randrange(1,5))
    print('welecome to index page')
  2.  
  3. def home():
    time.sleep(random.randrange(1,3))
    print('welecome to HOME page')
  4.  
  5. index=timmer(index) #index=wrapper
    home=timmer(home)
  6.  
  7. index() #wrapper()
    home()

装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)

  1. import time
  2. import random
  3. #装饰器
  4. def timmer(func):
  5. def wrapper():
  6. start_time = time.time()
  7. func()
  8. stop_time=time.time()
  9. print('run time is %s' %(stop_time-start_time))
  10. return wrapper
  11. #被装饰函数
  12. @timmer             #index=timmer(index)
  13. def index():
  14. time.sleep(random.randrange(1,5))
  15. print('welecome to index page')
  16. # @timmer #home=timmer(home)
  17. # def home():
  18. # time.sleep(random.randrange(1,3))
  19. # print('welecome to HOME page')
  20. index() #wrapper()
  21. # home()

加多个装饰器:

  1. #加多个装饰器
  2. import time
  3. import random
  4. #装饰器
  5. def timmer(func):
  6. def wrapper():
  7. start_time = time.time()
  8. func()
  9. stop_time=time.time()
  10. print('run time is %s' %(stop_time-start_time))
  11. return wrapper
  12. def auth(func):
  13. def deco():
  14. name=input('name: ')
  15. password=input('password: ')
  16. if name == 'egon' and password == '':
  17. print('login successful')
  18. func() #wrapper()
  19. else:
  20. print('login err')
  21. return deco
  22. #被装饰函数  #多个装饰函数,从上往下添加,调用时从下往上
  23. @auth                 #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco
  24. @timmer                #index=timmer(index) #index=wrapper
  25. def index():
  26. # time.sleep(random.randrange(1,5))
  27. time.sleep(3)
  28. print('welecome to index page')
  29. def home():
  30. time.sleep(random.randrange(1,3))
  31. print('welecome to HOME page')
  32. # index() #deco()
  33. # home()

装饰器修订:

  1. #装饰器修订
  2. import time
  3. import random
  4. #装饰器
  5. def timmer(func):
  6. def wrapper(*args,**kwargs):
  7. start_time = time.time()
  8. res=func(*args,**kwargs)  #接收参数
  9. stop_time=time.time()
  10. print('run time is %s' %(stop_time-start_time))
  11. return res    #增加返回值
  12. return wrapper
  13. #被装饰函数
  14. @timmer
  15. def index():
  16. time.sleep(random.randrange(1,5))
  17. print('welecome to index page')
  18. @timmer
  19. def home(name):
  20. time.sleep(random.randrange(1,3))
  21. print('welecome to %s HOME page' %name)
  22. return 123123123123123123123123123123123123123123
  23. index()
  24. res1=index()
  25. print('index return %s' %res1)
  26. res2=home('egon') #wraper()
  27. print('home return %s' %res2)

扩展:

  1. """
  2. python内置装饰器
  3. 在python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod、property.
  4. @staticmethod 是类的静态方法,其跟成员方法的区别是没有self参数,并且可以在类不进行实例化的情况下调用
  5. @classmethod 与成员方法的区别在于所接收的第一个参数不是self(类实例的指针),而是cls(当前类的具体类型)
  6. @property 是属性的意思,表示可以通过类实例直接访问的信息
  7. """
  8.  
  9. class Foo(object):
  10. def __init__(self,var):
  11. super(Foo,self).__init__()
  12. self._var=var
  13.  
  14. @property
  15. def var(self):
  16. return self._var
  17.  
  18. @var.setter
  19. def var(self,var):
  20. self._var=var
  21.  
  22. f=Foo('var1')
  23. print(f.var)
  24. f.var='var2'
  25. print(f.var)
  26.  
  27. """
  28. 注意,对于Python新式类(new-style class),如果将上面的 “@var.setter” 装饰器所装饰的成员函数去掉,
  29. 则Foo.var 属性为只读属性,使用 “foo.var = ‘var 2′” 进行赋值时会抛出异常。
  30. 但是,对于Python classic class,所声明的属性不是 read-only的,所以即使去掉”@var.setter”装饰器也不会报错。
  31. """

Python基础(7)闭包函数、装饰器的更多相关文章

  1. python基础16_闭包_装饰器

    不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield  generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...

  2. Python基础(七) 闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  3. Python基础编程闭包与装饰器

    闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...

  4. Python基础(闭包函数、装饰器、模块和包)

    闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()

  5. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  6. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  7. python学习日记(函数--装饰器)

    楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...

  8. 21.python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...

  9. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  10. python中的闭包和装饰器

    重新学习完了函数,是时候将其中的一些重点重新捋一捋了,本次总结的东西只有闭包和装饰器 1.闭包 闭包是python函数中的一个比较重要功能,一般闭包都是用在装饰器上,一般学完闭包就会去学习装饰器,这俩 ...

随机推荐

  1. sshd 防止暴力破解

  2. stm32--USB(作为U盘)+FatFs的实现

    一.USB功能的添加(作为U盘) 添加文件 将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹: usb class为硬件相关(Library\Class): usb dri ...

  3. linux里面的fork函数创建一个新进程

    由fork创建的新进程成为子进程,fork函数被调用一次,但是返回两次,

  4. 指纹识别人脸识别 iOS

    //1.判断iOS8及以后的版本 if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){ //从iPhone5S开始,出现指 ...

  5. python接口自动化: CAS系统验证,自动完成登录并获取token,遇到302请求重定向设置(requests模块 allow_redirects=False)即可

    import requestsimport re import requests import re class Crm_token(object): try: username=int(input( ...

  6. 生产者与消费者-N:1-基于list

    多个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...

  7. ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...

  8. Python之tornado框架实现翻页功能

    1.结果如图所示,这里将html页面与网站的请求处理放在不同地方了 start.py代码 import tornado.ioloop import tornado.web from controlle ...

  9. Delphi中取得程序版本号

    Delphi做的程序,如果想包含版本信息, 必须在Delphi的集成编辑环境的菜单“Project/Options/Version Info”里面添加版本信息.即在Version Info 选项卡中选 ...

  10. 开发一个delphi写的桌面图标管理代码

    参加工作了就很少有时间去玩delphi了,这个适合初学者看看,大神勿喷 工具 delhpi7.0 access数据库 原则win下有安装office就可用 当初不太熟悉sqlite所有没用这做数据库. ...