今日所学内容
带参装饰器
在装饰器中有一种情况是,我们需要传一个参数,同这个参数,在装饰器中实现新的功能
最初的装饰器是不能瞒足的,因为最初的这个装饰器传的参数是给原函数和新的函数传参的功能
所以瞒足不了需求.所以就有了一个新的装饰器,那就是带参装饰器
def wrap(info): def outer(func): # info = 0 def inner(*args, **kwargs): print('新:拓展的新功能,可能也需要外界的参数%s' % info) res = func(*args, **kwargs) return res return inner return outer @wrap('外部参数') def fn(): pass
这里的@wrap("传入的参数") ----> 解释就是调用这个函数,并且返回一个装饰器,并且还把需要的参数传入到了函数中去
需要注意的是迭代器调用__next__()这个方法获取值的时候是一行一行获取的,所以就会存在一种情况,就是
总会又一次获取结束,这个时候,就会报错,
像上面的情况 ,我们就通过报异常来处理,如果没有值可取了,就报异常
ls = [3, 1, 2, 3, 5] iterator = ls.__iter__() while True: try: print(iterator.__next__()) except StopIteration: # print('取空了') break
然而在for中我们就优化了这种,因为在for中当取值抛异常,自动处理StopIteration异常结束取值循环
# 给可迭代器对象及迭代器对象添加迭代索引
s = 'abc'
for v in enumerate(s):
print(v) # (0 'a') | (1 'b') | (2 'c')
生成器:自定义的迭代器对象
就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化
总结:有yield关键字的函数,函数名() 不是调用函数,而是生成得到 生成器对象,生成器对象就是迭代器对象,可以通过 __next__() 进行取值
def jiecheng_num(num): ji = 1 for i in range(1, num + 1): ji *= i yield ji # ... obj = jiecheng_num(3) print(obj.__next__()) print(obj.__next__()) print(obj.__next__()) print(obj.__next__()) # 有异常了 for v in jiecheng_num(5): print(v) # 会自动处理异常停止