闭包函数的传值方式:

方式1:通过参数传值

def func(x):
print(x)
func(1)

方式2:闭包函数传值

def outter(x):
def inner():
print(x)
return inner
f=outter(1) #调用outter函数传参,f即我return inner
print(f,type(f)) #<function outter.<locals>.inner at 0x035A3540> <class 'function'>
f() #加括号即可以直接调用inner函数,运行体内代码print(x)

装饰器:

装饰指的是为被装饰器对象添加额外的功能

装饰器的实现必须遵循量大原则:

1.不修改被装饰对象的源代码

2.不修改被装饰对象的调试方式

无参装饰器的演变:

方式1:

import time
def index():
time.sleep(3)
print('Welcome to index page') def outter(func): #func=最初始的index
# func=index
def wrapper():
start_time=time.time()
func() #调用最原始的index
stop_time=time.time()
print(stop_time-start_time)
return wrapper
index=outter(index) #新的index=wrapper
index() #wrapper

方式2:当函数有形参时,思考

import time
# def index():
# time.sleep(1)
# print('Welcome to index page')
# return 123 def home(name):
time.sleep(2)
print('Welcome %s to home page'%name)
#==============装饰器
def outter(func): #func=最初始的index
# func=index
def wrapper(name):
start_time=time.time()
res=func(name) #调用最原始的index 同样也调用最原始的home,但是home在传值的时候是有形参name在里面的
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
# index=outter(index) #新的index=wrapper
# index()
home=outter(home) #新的home=wrapper
home('yangzhizong')

方式3:

import time
def index():
time.sleep(1)
print('Welcome to index page') def home(name):
time.sleep(2)
print('Welcome %s to home page'%name)
#==============装饰器
def timmer(func): #func=最初始的index和最初始的home
# func=index
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的index 同样也调用最原始的home,但是home在传值的时候是有形参name在里面的
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
index=timmer(index) #新的index=wrapper
index()
home=timmer(home) #新的home=wrapper
home('yangzhizong')

方式4:最终版

import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper @timmer #index=timmer(index)
def index():
time.sleep(1)
print('Welcome to index page')
@timmer #home=timmer(home)
def home(name):
time.sleep(2)
print('Welcome %s to home page'%name) index()
home('yangzhizong')

装饰器:(固定不变的书写格式)

def outer(func):
def inner(*args,**kwargs):
res=fun(*args,**kwargs)
return res
res inner

python闭包函数、装饰器的更多相关文章

  1. python闭包函数&装饰器

    一.函数引用 函数可以被引用 函数可以被赋值给一个变量 def hogwarts(): print("hogwarts") # hogwarts() # 函数调用 print(ho ...

  2. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  3. python 闭包和装饰器

    python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...

  4. python 复习函数 装饰器

    # 函数 —— 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),* ...

  5. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  6. python闭包与装饰器

    转自小马哥: 闭包和装饰器充分体现了Python语法糖的优雅感觉. 在本文中,我们的实验要完成两个工作,一个是加法,一个是累计调用加法的次数,最普通的Python程序可以这么写: def valida ...

  7. 详解Python闭包,装饰器及类装饰器

    在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...

  8. 高逼格利器之Python闭包与装饰器

    生活在魔都的小明,终于攒够了首付,在魔都郊区买了一套房子:有一天,小明踩了狗屎,中了一注彩票,得到了20w,小明很是欢喜,于是想干脆用这20万来装修房子吧(decoration): 整个装修过程,小明 ...

  9. Python—闭包和装饰器

    闭包 定义:内部函数对外部函数变量的引用,则将该函数与用到的变量称为闭包. 闭包必须满足以下三个条件: 必须有一个内嵌函数. 内嵌函数必须引用外部函数中的变量. 外部函数返回值必须是内嵌函数的引用. ...

  10. Python 简明教程 --- 22,Python 闭包与装饰器

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. 目录 本节我们来介绍闭包与装饰器. 闭包与 ...

随机推荐

  1. C# 向服务器上传文件(客服端winform、服务端web)

    转载 首先写客服端,winform模拟一个post提交: /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summa ...

  2. 棋盘问题——POJ1321

    棋盘问题——深度优先搜索 题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘 ...

  3. js倒计时小插件(兼容大部分浏览器)

    精确到天的倒计时 <script language="JavaScript"> <!-- // (c) Henryk Gajewski var urodz= ne ...

  4. C#数组添加元素

    一.向数组添加元素 在C#中,只能在动态数组ArrayList类中向数组添加元素.因为动态数组是一个可以改变数组长度和元素个数的数据类型. 示例: using System;using System. ...

  5. 强制类型转换(int)、(int&)和(int*)的区别

    我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...

  6. 如何解决U盘装系统后磁盘总容量变小?

    我在用Win32_Disk_Imager工具制作U盘系统盘之后,发现U盘大小变为2M,另外的大小没有被分配,解决办法如下. 打开:http://jingyan.baidu.com/article/59 ...

  7. 转 Keras 保存与加载网络模型

    https://blog.csdn.net/qq_28413479/article/details/77367665

  8. 救援(BFS)

    题目描述: 在你的帮助下,Oliver终于追到小X了,可有一天,坏人把小X抓走了.这正是Oliver英雄救美的时候.所以,Oliver又找到哆啦A梦,借了一个机器,机器显示出一幅方格地图,它告诉Oli ...

  9. CPL学习笔记(二)

    数组 数组(array) 声明通用格式为: typeName arrayName[arraySize]. arrayName指定元素数目,必须为整型常量或const值.(不能是变量) int a[3] ...

  10. mongo 副本集+分片 配置

    服务器规划如下: 副本集名称|服务器IP 192.168.56.111 192.168.56.112 192.168.56.113 shard1 3201 3201 3201 shard2 3202 ...