【6】装饰器、闭包、偏函数、变量作用域问题
2018-10-19 06:18:56来源:博客园 阅读 ()
【一】、装饰器思想
装饰器是其实想增加一个函数的功能,但是又不想变动原来函数的代码,就用装饰器。
比如:我们用别人的一个函数,又不是很满意,所以用装饰器装饰一下即可。
def fun1(): print("嘉嘉 is a good man !") def outer(): print("****") fun1() outer()
【二】闭包
什么是闭包?
闭包:把一个函数当做一个参数传入另一个函数。本质上是一个返回函数的函数
案例1:简单的闭包实现装饰器代码
# 简单的装饰器 # 即以上起到了装饰器的作用,但是是写死了的,如何才能用一个调用来实现呢 # 闭包:把一个函数当做一个参数传入另一个函数。本质上是一个返回函数的函数 print('------------------------我是分割线-------------------------') def fun2(): print("嘉嘉 is a good man !") def outer2(fun): def inner(): print("****") fun() return inner # f代表是装饰后的返回的加强版的一个函数,并且是要装饰谁,把谁传进去。那么传入进去的东西被 # inner函数中的内容修饰了。 f=outer2(fun2) print(type(f)) f() ''' 输出: **** 嘉嘉 is a good man ! '''
其中:
f代表是装饰后的返回的加强版的一个函数,并且要装饰谁,把谁传进去。那么传入进去的东西被 # inner函数中的内容修饰了。
案例2:复杂一点的装饰器
1 # 案例2 :复杂一点的装饰器 2 def say(age): 3 print("she is %d years old " %(age) ) 4 5 # 写一个装饰器 6 def outer(func): 7 def inner(age): 8 if age<0: 9 age=0 10 say(age) 11 return inner 12 13 say2=outer(say) 14 # 此时调用的say2 其实就是outer函数返回的一个inner函数,say2他本身是函数 15 # 此时传入age=-5,执行say2函数,其实就是执行内存inner这个函数,
16 say2(-5) 17 say2(89) 18 ''' 19 输出是: 20 she is 0 years old 21 she is 89 years old 22 '''
总结:
4 # 此时调用的say2 其实就是outer函数返回的一个inner函数,say2他本身是函数 15
# 此时传入age=-5,执行say2函数,其实就是执行内存inner这个函数,
案例2-改进 :用标准的装饰器语法来写的话如下代码
# 案例2 改进 标准的装饰器 @outer #其实这个是等价 say2=outer(say) def say3(age): print("she is %d years old " %(age) ) # 写一个装饰器 def outer(func): def inner(age): if age<0: age=0 say(age) return inner # say2=outer(say) 上边给需要装饰的函数写了@ 这句话是可以直接省略的。 say3(-3) #注意:用@装饰完之后的函数名是不变的。 ''' 输出是: she is 0 years old '''
案例3-通用装饰器
此装饰器是通用版本,就不用担心传递的形参的个数问题啦
# 案例3 改进 通用装饰器 # 写一个装饰器 def outer2(func): def inner2(*args, **kwargs): ''' # 添加需要控制功能的语句块 if age<0: age=0 ''' print("我是装饰的代码块") return func(*args,**kwargs) return inner2 @outer2 def say4(age,name): print("she is %d years old ,Her name is %s "%(age,name) ) print("通用装饰器!") say4(-3,"佳佳") #注意:用@装饰完之后的函数名是不变的。 ''' 输出是:
我是装饰的代码块
she is -3 years old ,Her name is 佳佳
'''
案例1 简单的偏函数
# 偏函数:其实就是对形参的一个默认值的控制 def int_(str,base=2): return int(str,base) print(int_("1010")) # 输出:10
# 方法2 引入模块法
import functools
int3=functools.partial(int,base=2)
print(int3("1010"))
# 输出:10
作用域:
1、局部作用域
2、全局作用域
3、内建作用域
<未完待补充!>
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:认识Python
- fetchone函数和fetchall函数返回值的区别 2019-08-13
- Python之装饰器笔记 2019-08-13
- Python学习日记(九) 装饰器函数 2019-08-13
- python之函数、面向对象 2019-08-13
- python3基础之“函数(2)” 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash