装饰器:本质就是函数,功能是为其他函数添加附加功能

原则:

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 装饰器,闭包的更多相关文章

  1. python中函数总结之装饰器闭包

    1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器 ...

  2. 函数基础(三) 装饰器\闭包 day 12

    目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...

  3. python之闭包与装饰器

    python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...

  4. 15 python 初学(闭包,函数装饰器)

    这一部分很重要,一定要透彻理解.可参考大神博客:  http://www.cnblogs.com/yuanchenqi/articles/5830025.html 闭包: 如果在一个内部函数里,对在外 ...

  5. python 闭包与装饰器

    1.闭包--返回子函数名 作用:使用子函数之外的父函数的变量 闭包就是你调用了一个函数a,这个函数a反悔了一个子函数名b,这个返回的函数b就叫做闭包 代码举例 def a(): test = 'aa' ...

  6. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  7. Python学习基础(三)——装饰器,列表生成器,斐波那契数列

    装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...

  8. Day13有参装饰器,三元表达式,匿名函数

    多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...

  9. python基础知识10-描述器和装饰器

    课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...

随机推荐

  1. 引擎设计跟踪(九.14.3) deferred shading 准备

    目前做的一些准备工作 1.depth prepass for forward shading. 做depth prepass的原因是为了完善渲染流程, 虽然架构上支持多个pass, 但实际上从来没有测 ...

  2. Python爬虫初学者学习笔记(带注释)

    一,安装编程工具并进入编程界面 首先去https://www.continuum.io/downloads/网站下载Anaconda工具并安装;打开cmd,输入jupyter notebook并回车( ...

  3. time模块的用法和转化关系

    Time模块的用法和互相转化关系 UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST(Daylight Savin ...

  4. C语言 基础

    内存的定义 在学习python的时候 了解过内存的管理机制,例如引用计数,垃圾回收,小内存池的概念. 但是并不了解内存究竟是个什么东西?不了解内存的实际存储方式. Mac OS Mojave 处理器 ...

  5. 关闭防火墙,selinux,交互式设置IP的脚本

    脚本内容: #!/bin/bash # ens=$(cat /proc/net/dev | awk '{if($2>0 && NR > 2) print substr($1 ...

  6. html限制文本框只能输入数字和一个小数点

    近期在做一个前台页面,有一个文本框是用来输入充值金额的,就想到了限制用户只能输入纯数字的数据且只能包含一个小数点.下面就是我实现的代码 $(function() { //阻止数字键以外的按键输入 $( ...

  7. Unity 3D中不得不说的yield协程与消息传递

    1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...

  8. [例子] nginx负载均衡搭建及测试

    一.Nginx + Tomcat 负载均衡测试(负载均衡+部分静态图片处理) 环境说明:  nginx+tomcat @ubuntu ok 首先你得有一个Ubuntu或者什么其他的linux. 安装j ...

  9. 微软AD相关操作的免费工具

    https://www.ittsystems.com/best-free-active-directory-tools/

  10. Django框架 连接Oracle -ServerName方式报错

    连接前: 修改后: