1.迭代器协议
对象提供一个.next()方法,执行next方法要么返回程序的下一项,要么得到一个异常程序,而且这个迭代只能向后进行(不合适的比喻:只能爸爸生儿子,不能儿子生爸爸)
1.1 可迭代对象
之前对于list、tuple、dict等可迭代的定义都是错误的
可迭代对象是指:满足迭代器协议的对象
2.for循环的机制
在之前的认知中,for循环后面跟着的就是可迭代对象,其实对于list、dict这些来说,for循环所做的事情,是在它们后面添加了一个__iter__()方法
s1=[1,2,3,4,] for i in s1: #其实内部的做法就是,s1.__iter__(),将list s1转换为可迭代对象,使其遵循迭代器协议,然后可以执行next方法
使用iter方法之后,列表就变成了一个支持迭代器协议的可迭代对象,可以使用next方法
s1=[1,2,3,4] for i in s1: print(i) print(s1.__iter__().__next__()) --- #使用next方法之后,进行遍历,不断的使用next方法,直到得到一个异常,迭代器结束。
3.为什么使用迭代器
迭代器的好处:迭代器每进行一次next,才将数据放入内存进行计算。如果是list的话,一次要讲大量内存进入内存,数据比较多的话容易造成死机
比如:
计算列表中list(range(1000000))的和,需要一次性将这些数据放入内存,
如果是迭代器的话,每次使用一个数据,第一次1+2,第二次3+3,一次类推,可能减少内存的使用。
4.三元运算
三元运算可以看做是更简便化的列表,个人觉得类似于lambda,方便书写,减少代码数量
s1=['sb' if 5 >4 else 'xuzheng'] print(s1)
4.1 列表解析
下面进行分析,正常情况下:
s1=[] for i in range(1000): s1.append(i) print(s1)
列表解析:
s1=[i for i in range(1000)] print(s1)
判断和for循环进行拼接
s1=[i for i in range(1000) if i > 5] print(s1)
这是目前对迭代器和三元运算的理解,明天准备生成器的主要介绍。