python_11 装饰器,闭包
装饰器:本质就是函数,功能是为其他函数添加附加功能
原则:
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包
#装饰器:
def timmer(func):
def wrapper(*args,**kwargs):
time1=time.time()
res=func(*args,**kwargs)
time2=time.time()
print('函数的运行时间是%d'%(time2-time1))
return res
return wrapper @timmer
def cal(l):
res=0
for i in l:
res+=i
time.sleep(0.1)
return res a=cal(range(10)) print(a) >>>函数的运行时间是1
45
高阶函数定义:
1.函数接收的是一个函数名
2.函数的返回值是一个函数名
3.满足上述任意一个条件都可以称之为高阶函数
import time def foo():
time.sleep(0.5)
print("sadfa") def test(func):
print(func)
t1=time.time()
func()
t2=time.time()
print("函数的运行时间是%ds"%(t2-t1)) test(foo)#修改了函数的调用方式
#不修改源代码
#不修改foo调用方式
#多运行了一次,不合格
def foo():
time.sleep(1)
print("from the foo") def dec(func):
t1=time.time()
func()
t2=time.time()
print("%s的运行时间是%d"%(func,(t2-t1)))
return func foo=dec(foo)
foo()
函数的闭包:闭包是由函数及其相关的引用环境组合而成的实体,如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
def father(name):
print('from father %s'%name)
def son():
print('my father is %s'%name)
def grandson():
print('my grandpa is %s'%name)
grandson()
son()
print(locals()) father('alex') >>>from father alex
my father is alex
my grandpa is alex
{'son': <function father.<locals>.son at 0x00000169A59B7268>, 'name': 'alex'}
装饰器框架:
#装饰器框架
def timmer(func):
def wapper():
print(func)
func()
return wapper
def timmer_test(func):
def add_time():
t1=time.time()
func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return add_time def test():
time.sleep(2)
print('test函数运行完毕') test=timmer_test(test)
test()
>>>test函数运行完毕
该函数的运行时间是2
@语法糖:
def timmer(func):
def add_time():
t1=time.time()
func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕') test() >>>test函数运行完毕
该函数的运行时间是2
函数闭包加上返回值:
def timmer(func):
def add_time():
t1=time.time()
res=func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return res
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕')
return '这是test的返回值' res=test()#这里就是在运行add_time
print(res) >>>test函数运行完毕
该函数的运行时间是2
这是test的返回值
再加上参数:
def timmer(func):
def add_time(*args,**kwargs):
t1=time.time()
res=func(*args,**kwargs)
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return res
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test(name,age):
time.sleep(2)
print('test函数运行完毕,名字是%s,年龄是%d'%(name,age))
return '这是test的返回值' @timmer
def test1(name,age,gender):
time.sleep(3)
print('test1函数运行完毕,名字是%s,年龄是%d,性别是%s'%(name,age,gender))
return '这是test1的返回值' res=test('alex',19)#这里的test是运行的add_time
print(res)
res1=test1('sb',20,'male')
print(res1) >>>test函数运行完毕,名字是alex,年龄是19
该函数的运行时间是2
这是test的返回值
test1函数运行完毕,名字是sb,年龄是20,性别是male
该函数的运行时间是3
这是test1的返回值
解压序列:
a,b,c='hel'
print(a,b,c) e,f,g=(4,5,6)
print(e,f,g) #取出第一个值和最后两个值
l=['alex',7,8,9,7,8,5,2,1,5,6,4,8,6,4,6,'is','sb'] #*_代表中间所有的值,_可以换成任意值
x,*_,y,z=l
print(x,y,z) >>>h e l
4 5 6
alex is sb
调换两变量的值:
a=20
b=100
a,b=b,a
print(a,b) >>>100 20
装饰器加上验证功能:
user_dic={'name':None,'login':False}
def yanzheng(func):
    global zt
    def wapper(*args,**kwargs):
        if user_dic['name'] and user_dic['login']:
            res=func(*args,**kwargs)
            return
        name=input('请输入用户名:').strip()
        psw=input('请输入密码:').strip()
        if  name=='alex' and psw=='':
            res=func(*args,**kwargs)
            user_dic['name']=name
            user_dic['login']=True
            return res
        else:
            print('用户名或密码错误')
    return wapper
@yanzheng
def index():
    print('欢迎来到京东主页')
@yanzheng
def home(name):
    print('欢迎回家%s'%name)
@yanzheng
def car(name):
    print('%s的购物车里有%s'%(name,'奶茶'))
index()
home('alex')
car('alex')
>>>请输入用户名:alex
请输入密码:123
欢迎来到京东主页
欢迎回家alex
alex的购物车里有奶茶
user_list=[
{'user_name':'alex','psw':''},
{'user_name':'blex','psw':''},
{'user_name':'clex','psw':''},
{'user_name':'dlex','psw':''} ] current_zt={'name':None,'login':False} def yanzheng(func):
def wapper(*args,**kwargs):
global user_name
if current_zt['name'] and current_zt['login']:
res=func(*args,**kwargs)
return res
user_name=input('请输入用户名:').strip()
psw=input('请输入密码:').strip()
for user_dic in user_list:
if user_name==user_dic['user_name'] and psw==user_dic['psw']:
res=func(*args,**kwargs)
current_zt['name']=user_name
current_zt['login']=True
return res
else:
print('用户名或密码错误')
return wapper @yanzheng
def index():
print('欢迎来到京东主页') @yanzheng
def home():
print('欢迎回家%s'%user_name) @yanzheng
def car():
print('%s的购物车里有%s'%(user_name,'奶茶')) index()
home()
car() >>>请输入用户名:blex
请输入密码:456
欢迎来到京东主页
欢迎回家blex
blex的购物车里有奶茶
将原装饰器加上参数:直接在最外层加一个函数带上参数,使用装饰器时也需带上参数
user_list=[
{'user_name':'alex','psw':''},
{'user_name':'blex','psw':''},
{'user_name':'clex','psw':''},
{'user_name':'dlex','psw':''} ] current_zt={'name':None,'login':False} def renzhen(type='ldb'):
def yanzheng(func):
def wapper(*args,**kwargs):
global user_name
print('认证类型是%s'%type)
if type=='ldb':
if current_zt['name'] and current_zt['login']:
res=func(*args,**kwargs)
return res
user_name=input('请输入用户名:').strip()
psw=input('请输入密码:').strip()
for user_dic in user_list:
if user_name==user_dic['user_name'] and psw==user_dic['psw']:
res=func(*args,**kwargs)
current_zt['name']=user_name
current_zt['login']=True
return res
else:
print('用户名或密码错误')
elif type=='abb':
print('不知道这个类型')
res = func(*args, **kwargs)
return res
else:
print('类型错误')
res = func(*args, **kwargs)
return res
return wapper
return yanzheng @renzhen(type='ldb')
def index():
print('欢迎来到京东主页') @renzhen(type='abb')
def home():
print('欢迎回家%s'%user_name) @renzhen(type='sss')
def car():
print('%s的购物车里有%s'%(user_name,'奶茶')) index()
home()
car()
python_11 装饰器,闭包的更多相关文章
- python中函数总结之装饰器闭包
		
1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器 ...
 - 函数基础(三)    装饰器\闭包 day 12
		
目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...
 - python之闭包与装饰器
		
python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...
 - 15 python 初学(闭包,函数装饰器)
		
这一部分很重要,一定要透彻理解.可参考大神博客: http://www.cnblogs.com/yuanchenqi/articles/5830025.html 闭包: 如果在一个内部函数里,对在外 ...
 - python 闭包与装饰器
		
1.闭包--返回子函数名 作用:使用子函数之外的父函数的变量 闭包就是你调用了一个函数a,这个函数a反悔了一个子函数名b,这个返回的函数b就叫做闭包 代码举例 def a(): test = 'aa' ...
 - python基础-闭包函数和装饰器
		
闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...
 - Python学习基础(三)——装饰器,列表生成器,斐波那契数列
		
装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...
 - Day13有参装饰器,三元表达式,匿名函数
		
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...
 - python基础知识10-描述器和装饰器
		
课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...
 
随机推荐
- 引擎设计跟踪(九.14.3.4) mile stone 2 - model和fbx导入的补漏
			
之前milestone2已经做完的工作, 现在趁有时间记下笔记. 1.设计 这里是指兼容3ds max导出/fbx格式转换等等一系列工作的设计. 最开始, Blade的3dsmax导出插件, 全部代码 ...
 - magento 1.9 上传后图片前后台无法正常显示
			
1.上传后图片不显示,设置 允许 flash 2.保证php 执行是内存大小至少为为128M,多种方式设置,这里以init_set为例子,在index.php 加入下面一行代码,根据情况而定 ini_ ...
 - python中使用redis实战
			
from redis import StrictRedis rds = StrictRedis(host='127.0.0.1', port=6379, db=0, decode_responses= ...
 - Python学习:函数式编程(lambda, map() ,reduce() ,filter())
			
1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...
 - 【java】多态
			
多态:某一类事物的多种存在形态 如:动物中的猫和狗猫对象对象的类型是猫类型,即 cat c1= new cat()但同时猫也是动物中的一种,也可以把猫成为动物,即 animal c1= new cat ...
 - codechef February Challenge 2018 简要题解
			
比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...
 - Mongodb中的 原子性 隔离性
			
读写锁 Mongodb使用读写锁来来控制并发操作: 当进行读操作的时候会加读锁,这个时候其他读操作可以也获得读锁.但是不能或者写锁. 当进行写操作的时候会加写锁,这个时候不能进行其他的读操作和写操作. ...
 - 软件推荐----数据库数据处理Navicat Premium
			
一般情况下,企业对数据库的管控很严,通常管控分成以下: 对整台服务器管理权限,如:操作系统Administrator+SA 对单个数据库(Oracle的表空间)完全权限,如:SQL DB_Owner ...
 - Layout-1相关代码
			
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
 - Magic xpa 3.x很容易将数据导出到Excel中
			
Magic xpa 3.x很方便的将表中数据导出到Excel文件中,还可以自动将表中数据生成各种图表. 通过使用自带的打印数据内部事即可实现. 1.首先将打印数据任务属性设置为“是”. 2.可使用主程 ...