在Python里有三种器,被称之为三神器,他们分别是:装饰器、迭代器,生成器。
下面就简单的说一下这三神器。
一、装饰器
问:什么是装饰器?
答:在不改变源代码和调用方式的基础之上给函数增加新的功能,就是装饰器
def deco(func): def wrapper(): func() print('新功能') return wrapper def test(): print('thisis') test = deco(test) test()
import time def timer(func): def deco(*args,**kwargs): start_time = time.time() res = func(*args,**kwargs) end_time = time.time() print('cost', end_time-start_time) return res return deco @timer def bar(a, b): time.sleep(2) print('这是bar') print(a) print(b) bar(1,2) 有参装饰器
def default_engine(engine=None): def auth(func): def deco(*args, **kwargs): user = input('user:') password = input('password:') if engine == 'mysql': if user == 'root' and password == 'root': res = func(*args, **kwargs) return res else: print('用户名或密码错误') else: print('没有这个引擎') return deco return auth @default_engine(engine='mysql') def index(): print('welcome to home page') # res = default_engine(engine='mysql') # index = res(index) index() 带参数的装饰器
二、迭代器
问:什么是迭代器?
答:迭代器是一个重复的过程,即每一次重复为一次迭代,并且每一次迭代的结果都是下一次迭代的初始值
问:为什么要有迭代器?什么是迭代对象?什么是迭代器对象?
答:1、为何要有迭代器? 对于字符串,列表,元组,我们可以使用索引的方式迭代取出其包含的元素 但是对于字典,集合,文件等类型是没有索引的,若还想取出内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。 2、为什么叫做可迭代对象? 有.__iter__方法的都叫做可迭代对象 有字符串,元组,列表,集合,字典,文件等 'world'.__iter__ (4,5,6).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ 3、什么叫做迭代器对象? 有.__iter__和.__next__方法的叫做迭代器对象 只有文件 open('a.txt').__iter__() open('a.txt').__next__() 4、总结 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
三、生成器
问:什么是生成器?
答:只有函数里有yield关键字,那么函数名()得到的结果就是生成器。
其实生成器就是迭代器,并不会执行函数内部的代码。
生成器优点:同一时间只能储存一个值,节省内存空间
生成器缺点:只能不断的向后取值,不能向前取值
def test():#全部打出来占用内存空间 for I in range(100): yield i res=test() for k in res: print(k)
def test(): #一个一个打出来不占空间 for i in range(100): yield i res=test() res.__iter__() #不要用底线开头的词,那是一隐藏信息 print(res.__next__()) print(next(res)) print(next(res)) print(next(res))