博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python小知识点(3)--装饰器
阅读量:6571 次
发布时间:2019-06-24

本文共 2960 字,大约阅读时间需要 9 分钟。

(1)装饰器含参数,被装饰函数不含(含)参数

实例代码如下:

 

import time# 装饰器函数def wrapper(func):    def done(*args,**kwargs):        start_time = time.time()        func(*args,**kwargs)        stop_time = time.time()        print('the func run time is %s' % (stop_time - start_time))    return done# 被装饰函数1@wrapperdef test1():    time.sleep(1)    print("in the test1")# 被装饰函数2@wrapperdef test2(name):    #1.test2===>wrapper(test2)   2.test2(name)==dome(name)    time.sleep(2)    print("in the test2,the arg is %s"%name)# 调用test1()test2("Hello World")

 

(2)装饰器含有参数,被装饰函数含(不含)参数

 

import timeuser,passwd = 'admin','admin'def auth(auth_type):    print("auth func:",auth_type)    def outer_wrapper(func):        def wrapper(*args, **kwargs):            print("wrapper func args:", *args, **kwargs)            if auth_type == "local":                username = input("Username:").strip()                password = input("Password:").strip()                if user == username and passwd == password:                    print("\033[32;1mUser has passed authentication\033[0m")                    res = func(*args, **kwargs)  # from home                    print("---after authenticaion ")                    return res                else:                    exit("\033[31;1mInvalid username or password\033[0m")            elif auth_type == "ldap":                print("ldap链接")        return wrapper    return outer_wrapper@auth(auth_type="local") # home = wrapper()def home():    print("welcome to home  page")    return "from home"@auth(auth_type="ldap")def bbs():    print("welcome to bbs  page"print(home()) #wrapper()bbs()

 

总结:

1)装饰器实质为函数内嵌,返回函数地址。

2)装饰器带参数与不带参数相比装饰器带参数的多了一层函数定义用于接收装饰器中传递的参数,其余基本相同。

3)先验证装饰器中的参数,在验证普通函数的参数

小知识:

列表生产式:[i for i in range(5)]---->[0,1,2,3,4,5]

生成器与迭代器:

第一种方式通过括号的方式生成

生成器:()---i for i in range(5))  ==>generator

这种一边循环一边计算的机制,称为生成器:generator

生成器只有在调用时才会生成相应的数据,只记录当前位置。

只有一个__next__()方法

第二种方式通过yield生成

在函数中使用yield即可将一个函数变为一个生成器

迭代器:

直接作用于for循环的数据类型:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yieldgenerator function

直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象

from collections import Iterable

 

 isinstance([], Iterable)=========true

 

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

 

可以使用isinstance()判断一个对象是否是Iterator对象:

>>> from collections import Iterator

>>> isinstance((x for x in range(10)), Iterator)

======>True

 

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

 

例如:iter([])<====迭代器

PythonIterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结:

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

 

 

 

posted on
2018-08-05 12:24 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/wfaceboss/p/9425128.html

你可能感兴趣的文章
SpringBoot集成Mybatis
查看>>
ProtectData
查看>>
Python——数据存储:XML操作
查看>>
计算直线的交点数
查看>>
国内php的blog程序推荐
查看>>
【设计模式】雷锋依然在人间 --- 工厂方法模式
查看>>
C++11 锁 lock
查看>>
oracle之 ORA-12557: TNS: 协议适配器不可加载
查看>>
mysql 索引
查看>>
2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解
查看>>
BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
存储过程和SQL语句比较及存储过程在C#中调用方法
查看>>
JpGraph的介绍和使用
查看>>
C#开发移动应用系列(1.环境搭建)
查看>>
hihocoder 1014 Trie树
查看>>
64位ubuntu13.10安装32位库
查看>>
轻松搭建docker应用的mesos集群
查看>>
物联网实验4 alljoyn物联网实验之手机局域网控制设备
查看>>
new Integer(1)和Integer.valueOf(1)的区别
查看>>