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

原则:

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. iOS Simulator 模拟器 与 Android Emulator 仿真器:为什么叫不同的英文名字?(待补充)

    iOS Simulator 模拟器 与 Android Emulator 仿真器:为什么叫不同的英文名字?(待补充)

  2. c# BackgroundWorker初试

    /* * Created by SharpDevelop. * User: Administrator * Date: 2017/7/31 * Time: 16:18 * * To change th ...

  3. sum(case when ct.tradeTotal >= 0 then 1 else 0 end)的意思

    String hql = "select new com.ks.admin.report.dto.ReportMonthWithDrawalDto(" + "count( ...

  4. oracle 删除用户

    -- 查询用户各进程相对应的 sid.serial#. -- 注意: username 必须大写 SELECT sid,serial#,username FROM v$session WHERE us ...

  5. 基于嵌入式linux路由转发功能的实现

    环境 arm7开发板, uclinux系统,kernel version: linux-2.4.x arm芯片的单网卡双网口设备,eth0 WAN口 ipaddr 192.168.9.61 eth0: ...

  6. Spark环境准备

    Ubuntu: 1.下载spark-2.2.1-bin-hadoop2.7.tgz,解压即可使用. 2.下载jdk-8u151-linux-x64.tar.gz,解压. 3.执行spark-2.2.1 ...

  7. 在windows下安装、配置、运行PostgreSQL【转】

    安装PostgreSQL 在Windows下的安装就位无脑安装,选择好安装路径就好了,我的安装目录为D:\PostgreSQL\10,需要注意一下几点: 安装过程中需要一个数据库的目录,我的为D:\P ...

  8. note 12 集合Set

    集合Set +无序不重复元素(键)集 +和字典类似,但是无"值" 创建 x = set() x = {key1,key2,...} 添加和删除 x.add('body') x.re ...

  9. 通过 Composer 安装 Laravel 安装器

    composer global require "laravel/installer" linux下确保 $HOME/.composer/vendor/bin 在系统路径中(Mac ...

  10. gevent-websocket初识

    初试 from flask import Flask, request from geventwebsocket.handler import WebSocketHandler from gevent ...