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

原则:

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. MongoDB连接

    1. import pymongo client = pymongo.MongoClient(host='localhost',port=27017) 2. client=MongoClient('m ...

  2. JavaMap的一些常用方法

    package exam; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...

  3. WMware Vsphere取消某虚机的漂移

    由于一些业务特性,有一些虚机不应该完全受集群DSR控制.下面记录一下如何更改某一虚机的漂移属性. 1.环境 VMware Vsphere web client 6.5 2.点击需要配置虚机所在的集群, ...

  4. composer.json

    {    "require": {        "doctrine/doctrine-orm-module": "0.*",        ...

  5. 多线程之BlockingQueue中 take、offer、put、add的一些比较

    一.概述: BlockingQueue作为线程容器,可以为线程同步提供有力的保障.   二.BlockingQueue定义的常用方法 1.BlockingQueue定义的常用方法如下:   抛出异常 ...

  6. shibie

    var mStream: TMemoryStream; vcode: ..] of AnsiChar; buffer: array of AnsiChar; begin mStream := TMem ...

  7. java练习-判断字符串是否都是数字

    方法1: package everyDayPratise; public class IsAllNumber { public static boolean method1(String s) { i ...

  8. android okHttp 无线程Post请求

    1.导入okhttp-2.7.5.jar和okio-1.11.0.jar包 2.Post无线程请求 public void getDataPost(){ String s = "{\&quo ...

  9. JRockit检测Tomcat内存溢出JAVA内存泄漏问题

    http://blog.csdn.net/liyanhui1001/article/details/8240473 公司的一个Java应用系统上线以来,基本每1天OutOfMemoryError: P ...

  10. php中cookie和session的总结

    cookie: 设置cookie:  setcookie("name","zhang","time()+3600"); 参数一:属性名 参数 ...