迭代器,生成器,装饰器
可迭代对象(Iterable)
表面来看就是可以作用于for循环的对象或者能通过索引进行访问的对象,实质上Iterable对象要求实现了_ _ iter_ _特殊方法或如果还能通过索引进行访问,要求对象实现了 _ _ getitem _ _ 特殊方法
迭代器(Iterator)
表面来看就是可以被next内置函数调用,并不断返回下一个数据,当没有下一个数据时抛出StopIteration异常,实质上Iterator对象要求实现了_ _ next_ _ 和 _ _iter _ _特殊方法
迭代器对象必定是可迭代对象,但可迭代对象不一定是迭代器
str, bytes, tuple, list, dict, set它们是可迭代对象,但并不是迭代器,可以通过调用内置函数iter将它们转换为迭代器
range对象也是可迭代对象,但不是迭代器对象
for 语句内部运行原理
首先调用in关键字后面的对象的 _ _iter _ _方法,这个方法必须返回一个Iterator,然后调用该Iterator的next方法并将该方法的返回值赋给for关键字后面的变量,执行一次循环体,再调用该Iterator的next方法,重复进行这个操作直到next方法抛出StopIteration异常为止,循环结束
生成器(Generator)
惰性计算序列,分为两种实现方式:
1.生成器表达式(Generator Expression),适合构造简单的生成器
2.使用yield关键字的函数对象(Generator Function),适合构造复杂的生成器
生成器必定是迭代器,所以生成器也是可迭代对象
列表和元组都是将所有数据都准备好放在内存空间中,当数据量很大时将消耗大量内存空间,并且还不能表示无限数量的数据,而生成器并没有存放所有数据,存放的只是产生数据的算法代码,在我们需要获得一个数据时,它会执行算法代码产生一个数据返回给我们,所以生成器适合表示通过一定算法可以推导出来的大量数据,甚至是无限个数据
生成器的生成原理:需要就造,很大程度上节约了内存的消耗
生成器推导式与列表推导式的区别,生成器推导式用小括号括起来,列表推导式用中括号括起来,列表推导式内存的消耗非常大
语句到yield就会暂停,只有再次调用next才会继续执行
装饰器(Decorator)
通常作用就是在不改变函数内部实现的情况下为函数增加一些额外的功能
掌握下面几种情况的装饰器的语法规则:
1.被装饰函数无参,无返回值;
2.被装饰函数有参,无返回值
3.被装饰函数有参,有返回值
4.装饰器带有参数
5.通用装饰器的写法