闭包(closure)是函数式编程的重要的语法结构。

  定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).

def outer():                               x = 1                                    def inner():                                       print(x)                                     return inner
f = outer()
f()                  

inner就是内部函数,inner里引用了外部作用域的变量x(x在外部作用域outer里面,不是全局作用域),则这个内部函数inner就是一个闭包。

闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境。

装饰器

  装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

  它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

简单的装饰器函数:

@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作

import time
def shoe_time(f):def inner():start = time.time()f()end = time.time()print(end-start)return inner
@shoe_time   #foo = shoe_time(foo)
def foo():#start = time.time()print("foo......")time.sleep(2)#end = time.time()#print(end-start)               #2.0001144409179688
#foo()
@shoe_time     #bar = shoe_time(bar)
def bar():# start = time.time()print("bar......")time.sleep(3)#end = time.time()#print(end-start)                #3.001171588897705
#bar()
#shoe_time(foo)              #2.0001142024993896
#shoe_time(bar)                #3.001171588897705
foo()                      #foo......                           # 2.0001144409179688
bar()                       # bar......# 3.00017142295837

带参数的被装饰函数

#功能函数加参数
import time
def shoe_time(f):def inner(x,y):start = time.time()f(x,y)end = time.time()print(end-start)return inner
@shoe_time
def add(a,b):print(a+b)time.sleep(3)
#@shoe_time
# def foo():
#     print("foo......")
#     time.sleep(2)
# @shoe_time
# def bar():
#      print("bar......")
#      time.sleep(3)
#
add(1,3)       #4#3.000171661376953#不定长参数
import time
def shoe_time(f):def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print(end-start)return inner
@shoe_time
def add(*a,**b):sum = 0for i in a:sum += iprint(sum)time.sleep(3)
#@shoe_time
# def foo():
#     print("foo......")
#     time.sleep(2)
# @shoe_time
# def bar():
#      print("bar......")
#      time.sleep(3)
#
add(1,3,4,6,78)              #92#3.000171661376953

带参数的装饰器

  装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如@shoe_time,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。

#带参数的装饰器import time
def logger(flag=""):def shoe_time(f):def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print(end-start)if flag == "true":with open("日志记录", "a",encoding="utf8") as g:g.write("值为: %s 时间为: %s\n"%(f(*x),(end-start)))return innerreturn shoe_time
@logger("true")     #@show_time
def add(*a,**b):Sum = 0for i in a:Sum += iprint(Sum)time.sleep(3)return Sum
@logger("abc")
def foo():print("foo......")time.sleep(2)
# @shoe_time
# def bar():
#     print("bar......")
#     time.sleep(3)

add(1,3,4,6,78)      #92#3.000171661376953
foo()

  @logger("true") 做了两件事:

(1)@ogger("true"):得到闭包函数show_time,里面保存环境变量flag

(2)@time   :add=show_time(add)

上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。当我 们使用@logger("true")调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。

转载于:https://www.cnblogs.com/lst1010/p/5851643.html

python 学习笔记7(装饰器)相关推荐

  1. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  2. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  3. Python学习笔记:装饰器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. [转载] python学习笔记——@property装饰器

    参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...

  5. python学习笔记之——装饰器及对象

    1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...

  6. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  7. python文件下载速度 装饰器_python学习笔记之---装饰器

    # -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...

  8. 廖雪峰python教程笔记:装饰器

    这是看廖老师python教程的第一个的笔记,因为这是这份教程最难的章节之一,我来来回回看了三遍,终于有所突破,写在这里是为了巩固自己的理解,同时也是希望有错的地方能够得到指正.具体内容见廖雪峰老师的课 ...

  9. Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...

  10. Python学习之路--装饰器

    三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...

最新文章

  1. 【Spark深入学习 -14】Spark应用经验与程序调优
  2. 用例子说明MVC 设计模式(以Objective-C 实现)
  3. checkboxlist 数据库连接代码
  4. SwipeRefreshLayout实现上拉加载
  5. python无法启动该程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
  6. vi格式化代码,撤销,重做,回退操作
  7. python_易忘的简单知识点总结
  8. python-元组数据类型-0222
  9. SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
  10. Android移动应用基础教程【使用内容提供者共享数据】
  11. 优品景象 进销存系统推荐_初步了解WMS(仓库管理系统)
  12. 测试低频噪音软件,设计制作并验证0.1Hz~10Hz超低频微弱噪音检测放大器STEP BY STEP...
  13. 商业分析的50个网站和分析方法
  14. Android自定义View单TextView显示多种文字样式
  15. Azkaban Flow 2.0的使用
  16. JQuery中$(document)是什么意思?
  17. C#编写的AccessHelper
  18. pcb布局设计_PCB设计布局的重要提示
  19. 让AI简单且强大:深度学习引擎OneFlow技术实践
  20. 我的一点企业上云经验

热门文章

  1. 在苹果Mac上如何查找和删除文件?
  2. 如何在 Mac 上的“屏幕使用时间”中设置限定通信?
  3. EverWeb for Mac(网页设计软件)
  4. Mac废纸篓无法清空怎么办?
  5. 【翻译】CodeMix使用教程(七):扩展
  6. kmp 学习【字符串-kmp学习】
  7. Loadrunner -27225错误
  8. 【逐云】阿里“水电煤”背后的人物故事
  9. 数百台浪潮服务器支撑中石油油品加工生产系统
  10. 2014北京邀请赛 F Football on Table