1、装饰器和迭代器的概念。

  装饰器本质是一个函数,是为其他函数添加附加功能。

原则:不修改原函数源代码

     不修改原函数的调用方式

2、装饰器的简单应用

  

# Author : xiajinqi
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
func()
stop_time =time.time()
print("执行时间为 %s" %(stop_time - start_time))
return wrapper @timmer
def loggin():
time.sleep(1)
print("hello world") loggin()

3、理解装饰器的知识需要储备 :

函数即为变量、高阶函数 、嵌套函数

4、 函数在内存中定义。深入理解函数即为变量的概念.

  

需要区分定义和调用是两步进行的。必须要先定义再调用

def foo():
print("foo")
bar()
def bar():
print("bar") foo() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py
foo
bar Process finished with exit code 0 # Author : xiajinqi def foo():
print("foo")
bar() #foo 执行时候bar还没有定义所以执行会报错
foo()
def bar():
print("bar")
foo()
bar() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py
foo
Traceback (most recent call last):
File "E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py", line 6, in <module>
foo()
File "E:/Users/xiajinqi/PycharmProjects/Atm/bin/test2.py", line 5, in foo
bar()
NameError: name 'bar' is not defined Process finished with exit code 1

5、函数即变量和高阶函数,高阶函数,将一个函数作为变量参数传递给另外一函数,返回值中包含函数。(可以实现装饰器的第一步,把改变代码添加功能,但是会改变调用方式还不是一个真正的装饰器)

#高阶函数
# Author : xiajinqi
import time
def foo():
time.sleep(1)
print("foo")
return 0 def test(func):
start_time = time.time()
func()
end_time = time.time()
print("tims is %s" %(end_time -start_time )) test(foo) #相当于给foo加了一个附加功能 但是还是不符合装饰器规则。改变了调用规则 #高阶函数 传递 test(foo)
# Author : xiajinqi
import time
def foo():
time.sleep(1)
print("foo")
return 0 def test(func):
print(func)
func()
return func foo=test(foo) # 在赋值时候,foo 作为地址传递给test函数,此处相当于同时调用了两个函数test和foo(test内部调用foo),所以会比foo更多的功能
foo() # 这时候的foo已经是新的foo了。

6、嵌套函数,在一个函数体内调用另外一个函数 

#高阶函数  传递 test(foo)
# Author : xiajinqi
def test():
print('test')
def bar() :
print('bar')
return bar #bar()内部调用 # 外部调用
bar=test()
bar()

7、函数的作用域

# 全局变量和局部变量
def test1():
print("test1")
def test2():
print("test2")
def test3():
print("test3")
test3() test1() #test2由于没有调用,所以test3也不会调用

8、装饰器的实现

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器
def deco(func):
start_time = time.time()
return func
end_time = time.time()
print("运行时间 %s" %(end_time-start_time)) def timeer(func):
def deco():
start_time = time.time()
func()
end_time = time.time()
print("运行时间 %s" % (end_time - start_time))
return deco @timeer
def test1():
time.sleep(1)
print("test1") @timeer
def test2():
time.sleep(1)
print("test2")
@timeer
def test3():
time.sleep(1)
print("test3") #test1=timeer(test1) #思考timemer存在的含义 timmer调用什么也没有做,传递func给deco
#test1() #相当于执行deco,但是如果直接调用deco 就会改变调用方式。因此需用timmer可以达到 test2()

  

9 、高级装饰器:

 

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器 def timeer(func):
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs) # 不定参数传递
end_time = time.time()
print("运行时间 %s" % (end_time - start_time))
return deco @timeer
def test1():
time.sleep(1)
print("test1") @timeer
def test2(name):
time.sleep(1)
print("test2 %s" %(name))
@timeer
def test3():
time.sleep(1)
print("test3") #test1=timeer(test1) #思考timemer存在的含义 timmer调用什么也没有做,传递func给deco
#test1() #相当于执行deco,但是如果直接调用deco 就会改变调用方式。因此需用timmer可以达到 test1()
test2("xiajinqi")

10、装饰器高潮,模拟网站登录,三个页面,其中两个需要加上验证功能

# Author : xiajinqi

# 装饰器,三个函数,要求实现统计三个函数的运行时间,在函数运行的时候,会自动统计函数的运行时间,要求不修源代码
import time #装饰器 def auth(func):
def deco(*args,**kwargs):
print("func")
username = input("name:")
passwd = input("passwd:")
if username == 'xiajinqi' and passwd == '':
func(*args,**kwargs)
else :
print("认识失败")
return deco def index():
print("index of xiajinqi") @auth
def home(name):
print("index of home %s" %(name)) @auth
def bbs():
print("index of xiajinqi") index()
home("xiajinqi")
bbs()

python 装饰器和软件目录规范一的更多相关文章

  1. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  2. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  3. Python基础4 迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  4. Python之迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  5. Python_Day5_迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 列表生成 >>> a = [i+1 ...

  6. py基础4--迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1. 列表生成式,迭代器&生成器 列表生成式 我现在有个需求, ...

  7. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  8. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  9. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

随机推荐

  1. Sql Server关于日期查询时,如果表中日期到具体某个时间

    1.如果查询日期参数为'2017/02/21',而数据库表中的字段为'2017/02/21 12:34:16.963',则需要格式化一下日期才能查询出来,如下 select * from table ...

  2. 自动化测试基础篇--Selenium框架设计(POM)

    一.自动化测试框架 感谢木棉花的漂泊分享,内容转自链接:http://www.cnblogs.com/fengyiru6369/p/8053035.html 1.什么是自动化测试框架 简单来说,自动化 ...

  3. Linux动态链接库.so文件的创建与使用

    1. 介绍         使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个"程序函数库"简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可 ...

  4. 7 Dockerfile指令详解 && VOLUME 指令

    格式为: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 之前我们说过,容器运行时应该尽量 ...

  5. 4星|《助推(实践版)》:英国政府用AB测试检验政策效果的经验

    助推:小行动如何推动大变革(实践版)(诺贝尔经济学奖得主理查德•塞勒的助推实践) 作者作为学者说服英国政府实施助推策略的经过,提到一些具体主推策略. 所谓的助推,很像IT业流行的AB测试,对政策的执行 ...

  6. August 18th 2017 Week 33rd Friday

    If you shed tears when you miss the sun, you also miss the stars. 如果你因为错过太阳而哭泣,你也将会错过繁星. If you have ...

  7. codeforces 809C Find a car

    codeforces 809C Find a car 题意 有个\(1e9*1e9\)的矩阵,行 \(x\) 从上到下递增,列 \(y\) 从左到右递增.每个格子有一个正值.\((x, y)\) 的值 ...

  8. 关于Struts2通配符无效的说明

    在struts2.3之前的版本,正常的配置就可以了,但在struts2.3版本之后,使用通配符调用方法时,内部会验证是否允许访问该方法. 1.struts2.5 为了增加安全性,在 struts.xm ...

  9. 【[SDOI2011]拦截导弹】

    这道题是真的蛇皮 方案数要开\(double\)真的蛇皮 首先\(dp\)是非常容易看出来的 设\(dp[i]\)表示以\(i\)结尾的最长子序列 显然转移方程为 \[dp[i]=max(dp[j]+ ...

  10. [HNOI2006]马步距离

    嘟嘟嘟 这题首先直接bfs可定过不了,因此可以先贪心缩小两个点的距离,直到达到某一个较小的范围(我用的是30),再bfs暴力求解. 首先我们求出这两个点的相对距离x, y,这样就相当于从(x, y) ...