python 装饰器问题及解决方式
#统计函数运行时间
import time
#装饰器
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func()
stop_time =time.time()
print("the func time is %s"%(stop_time-start_time)) #函数
@timmer
def test1():
time.sleep(3)
print('in the test1') test1()
上面函数运行会出现报错:
高阶函数+嵌套函数==》装饰器
实现高阶函数a
import time
def bar():
time.sleep(3)
print('in the bar')
#装饰器,
def test1(func):
print(func)
start_time=time.time()
func() #run bar
stop_time = time.time()
print('the func runtime is %s'%(stop_time-start_time)) test1(bar) #改变了函数原本的调用方式
#装饰器中,使用函数作为变量,通过变量也能调用该函数。 func=bar() func() #此处和bar()的执行结果是一样的
刚开始写装饰器时,对函数调用方式有疑惑。上面代码最后的语句:test(bar)改变函数原本调用方式很不理解。
import time
#函数的调用方式没有改变
def bar():
time.sleep(3)
print('in the bar')
#装饰器
def test2(func):
print(func)
return func
print('--->',test2(bar))#t=test2(bar) print(t) 二者实现的效果是一样的
t=test2(bar)
t()#等同于bar() bar=test2(bar)
bar()#等同于 run bar
上面内容:把函数bar传给func,print(func),实质是打印下来bar的内存地址,return func 的返回值就是test2(bar)的运行结果。 print('--->',test2(bar))就是将test2(bar)的运行结果(即return func)的运行结果打印下来
第11行中:test2(bar())和test2(bar)的区别?
前者是将bar的运行结果传给test2,(即字符串类型),不符合高阶函数中返回值是函数名这一原则。
后者将bar的内存地址返回给test2,之后执行。
4.局部作用域和全局作用域的访问顺序
#局部作用域和全局作用域的访问顺序
x=0
def test1():
x=1
print(x)
def test2():
x=2
print(x)
def test3():
x=3
print(x)
test3()
test2()
test1()
print(x)
通过上面实现可以看出:
若将test2()注释掉,则将不能访问进入test3()。函数外层输出的x的结果仍旧是0,因为它是全局变量。
python 装饰器问题及解决方式的更多相关文章
- python装饰器执行顺序
. python 装饰器 1) 2层装饰器 def decorator(func): # TODO def wrapper(*args, **kwargs): # TODO func(*args, * ...
- python 装饰器的缺点以及解决方法
1.python装饰器的缺点 装饰器可以允许我们在不改变函数或犯方法的调用方式的情况下,添加额外的功能; 如下所示,我们要在中的方法之前增加装饰器check_is_admin,用来判断执行类的方法的用 ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- 一篇关于Python装饰器的博文
这是一篇关于python装饰器的博文 在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂.这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需 ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- 利用世界杯,读懂 Python 装饰器
Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
随机推荐
- SVN的安装和启动SVN的安装
SVN的安装和启动SVN的安装 i. windows下安装SVN 首先要先下载SVN服务器,下载地址https://www.visualsvn.com/downloads/ 下载软件VisualSVN ...
- ajax的网上解析
/* 用XMLHTTPRequest来进行ajax异步数据交交互*/ 主要有几个步骤: //1.创建XMLHTTPRequest对象 //最复杂的一步 if (window.XMLHttpReques ...
- 20175208 实验二 《Java面向对象程序设计》实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:张家华 学号:20175208 指导教师:娄嘉鹏 实验日期:2019年4月09日~2019年4月18日 实验序号:实验二 实验 ...
- css3 样式过度器 Transition
transition 简写属性,用于在一个属性中设置四个过渡属性. 1. transition 把鼠标指针放到 div 元素上,其宽度会从 100px 逐渐变为 300px: eg: div{wi ...
- CCF CSP 201412-1 门禁系统
题目链接:http://118.190.20.162/view.page?gpid=T21 问题描述 试题编号: 201412-1 试题名称: 门禁系统 时间限制: 1.0s 内存限制: 256.0M ...
- 安卓 ToolBar 颜色样式设置
设置Toolbar弹出菜单的字体颜色和背景颜色,包括三个点菜单颜色和返回图标的颜色. 布局文件xml <LinearLayout xmlns:android="http://schem ...
- connect设置连接超时
转自:庖丁解牛 /** * connect_timeout - 带超时的connect(方法中已执行connect) * @fd:文件描述符 * @addr:地址结构体指针 * @wait_secon ...
- vue - 列表显示(列互相影响,全选控制,更新数据)
要实现的效果为:全选,且列A列B互相影响,列B勾选则列A一定勾选,列A取消勾选,则相应列B取消勾选 数组 vue中列表渲染有些不是相应式的 var list=[ { a:'aaaa', b:'ddd' ...
- opencv学习之路(37)、运动物体检测(二)
一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...
- Python-王者荣耀自动刷金币+爬取英雄信息+图片
前提:本文主要功能是 1.用python代刷王者荣耀金币 2.爬取英雄信息 3.爬取王者荣耀图片之类的. (全部免费附加源代码) 思路:第一个功能是在基于去年自动刷跳一跳python代码上面弄的,思路 ...