在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、总结
迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
View Code
三、生成器
问:什么是生成器?
答:只有函数里有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))
yield示例