day14

                                                                                                        今日所学内容

带参装饰器

在装饰器中有一种情况是,我们需要传一个参数,同这个参数,在装饰器中实现新的功能

最初的装饰器是不能瞒足的,因为最初的这个装饰器传的参数是给原函数和新的函数传参的功能

所以瞒足不了需求.所以就有了一个新的装饰器,那就是带参装饰器

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("传入的参数")  ----> 解释就是调用这个函数,并且返回一个装饰器,并且还把需要的参数传入到了函数中去

可迭代对象 和迭代对象

可迭代对象是拥有__iter__()方法返回一个迭代对象使用__next__()方法来取值

迭代的对象是只有__next__()这个方法,也通过这个方法来获取值

大部分容器都是可迭代的,但是还有其他一些对象也可以迭代,例如,文件对象以及管道对象等等,

容器一般来说存储的元素是有限的,同样的,可迭代对象也可以用来表示一个包含有限元素的数据结构。

需要注意的是迭代器调用__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)  # 会自动处理异常停止
原文地址:https://www.cnblogs.com/WBaiC1/p/10790664.html