四 闭包函数、装饰器

一 闭包函数

  一、什么是闭包

  二、闭包的意义与应用

二 装饰器

  一、为何要用装饰器

  二、什么是装饰器

  三、装饰器的作用

  四、装饰器的语法

  五、装饰器补充:wraps

一 闭包函数

一、什么是闭包

 1 #内部函数包含对外部作用域而非全局作用域的引用
 2
 3 #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路
 4
 5         def counter():
 6             n=0
 7             def incr():
 8                 nonlocal n
 9                 x=n
10                 n+=1
11                 return x
12             return incr
13
14         c=counter()
15         print(c())
16         print(c())
17         print(c())
18         print(c.__closure__[0].cell_contents) #查看闭包的元素

二、闭包的意义与应用

 1 #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
 2 #应用领域:延迟计算(原来我们是传参,现在我们是包起来)
 3     from urllib.request import urlopen
 4
 5     def index(url):
 6         def get():
 7             return urlopen(url).read()
 8         return get
 9
10     baidu=index(‘http://www.baidu.com‘)
11     print(baidu().decode(‘utf-8‘))

二 装饰器(装饰器就是闭包函数的一种应用场景)

一、为何要用装饰器

#开放封闭原则:对修改封闭,对扩展开放

二、什么是装饰器

1 # 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
2 # 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
3 # 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

三、装饰器的作用

 1 import time
 2 def timmer(func):
 3     def wrapper(*args,**kwargs):
 4         start_time=time.time()
 5         res=func(*args,**kwargs)
 6         stop_time=time.time()
 7         print(‘run time is %s‘ %(stop_time-start_time))
 8         return res
 9     return wrapper
10
11 @timmer
12 def foo():
13     time.sleep(3)
14     print(‘from foo‘)
15 foo()

无参装饰器

 1 def auth(driver=‘file‘):
 2     def auth2(func):
 3         def wrapper(*args,**kwargs):
 4             name=input("user: ")
 5             pwd=input("pwd: ")
 6
 7             if driver == ‘file‘:
 8                 if name == ‘egon‘ and pwd == ‘123‘:
 9                     print(‘login successful‘)
10                     res=func(*args,**kwargs)
11                     return res
12             elif driver == ‘ldap‘:
13                 print(‘ldap‘)
14         return wrapper
15     return auth2
16
17 @auth(driver=‘file‘)
18 def foo(name):
19     print(name)
20
21 foo(‘egon‘)
22
23 有参装饰器

有参装饰器

四、装饰器的语法

1 # 被装饰函数的正上方,单独一行
2         @deco1
3         @deco2
4         @deco3
5         def foo():
6             pass
7
8         foo=deco1(deco2(deco3(foo)))

五、装饰器补充:wraps

 1 from functools import wraps
 2
 3 def deco(func):
 4     @wraps(func) #加在最内层函数正上方
 5     def wrapper(*args,**kwargs):
 6         return func(*args,**kwargs)
 7     return wrapper
 8
 9 @deco
10 def index():
11     ‘‘‘哈哈哈哈‘‘‘
12     print(‘from index‘)
13
14 print(index.__doc__)

原文地址:https://www.cnblogs.com/eric_yi/p/8449148.html

时间: 2024-11-07 14:24:19

四 闭包函数、装饰器的相关文章

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

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

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

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

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

python之闭包函数 装饰器 作业

一:编写函数,(函数执行的时间是随机的) import randomdef t(): time.sleep(random.randrange(1,3)) print('hello')二:编写装饰器,为函数加上统计时间的功能 import timeimport randomdef timebe(func): def wrapper(*args,**kwargs): start_time=time.time() res = func(*args, **kwargs) end_time=time.ti

<04day>_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

闭包函数 装饰器 有参装饰器

闭包函数: 1 内部函数 2 包含对外部作用域而非全局作用域的引用闭包函数的特点: 自带作用域  延迟计算 #闭包函数定义 1 def timmer(func): 2 def inner(*args,**kwargs): 3 re = func(*args,**kwargs) 4 return re 5 return inner 6 7 index(): 8 print("hello") 9 10 index = timmer(index) #index == inner 11 ind

day12.1_闭包函数+装饰器

一.闭包函数 闭包的定义:①该函数是一个内部函数 ②该函数包含对外部的作用域(非全局作用域)中名字的引用 1. 为函数体传值的方式 1.1 使用参数形式 1.2 包给函数 def outter(x): def inner(): print(x) return inner #函数当返回值(对象) f=outter(1) #相当于赋值 f() 二.装饰器 1.装饰器是什么? ①为被装饰器对象添加额外的功能  ② 可以当成工具,函数就具备某一功能的工具 装饰器本省可以是任意可调用的对象,被装饰的对象也

Python作用域-->闭包函数-->装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外

闭包函数 装饰器

什么是闭包函数 闭:指的是闭包函数数定义在一个函数内部的函数 包:该内部函数包含对外城函数作用域名字的引用 需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数层级的限制 为什么要用闭包函数 闭包函数提供了一种为函数体传值的解决方案 如何用闭包函数 # 为函数体传值的方式一:参数 # def func(x,y): # print(x+y) # # func(1,2) 3 # 为函数体传值的方式二:闭包 def outter(x,y): # x=1 # y=2 def func()

函数装饰器和闭包(四)

上一章:函数装饰器和闭包(三) 单分派函数 假设我们现在要开发一个函数,这个函数可以传入一个元素,函数要判断元素的类型,再将其打印出来 from collections.abc import MutableSequence, MutableMapping def print_item(item): if isinstance(item, int): print("int:", item) elif isinstance(item, MutableSequence): print(&qu