解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列
本节内容
1.迭代器协议与for循环
2.三元表达式
3.解压序列
4.列表解析
5.生成器
迭代器协议与for循环
1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项,要么引起异常报错(因为迭代到头了,只能往后走不能倒退)
2.可迭代对象:实现了迭代器协议的对象(其实python中所有对象都不是可迭代对象,如何实现:对象内部定义一个__iter__方法)
3.协议就是一种约定,可迭代对象实现了迭代器协议,python内部工具(如for循环,sum,max等)使用迭代器协议访问对象。
i = [11,22,33,44] a = i.__iter__() #将i变成可迭代对象 print(a.__next__()) #11 print(a.__next__()) #22 print(a.__next__()) #33 print(a.__next__()) #44
那么for 循环是怎么做的呢?
for循环做了两件事,第一件事就是把传入for循环对象使用__iter__方法,使其变成可迭代对象,之后每次使用都引用了__next__方法
第二件事就是:next到头,也就是迭代到头了会报错嘛,而for循环就自动为我们处理了报错
for a in i: print(a)
注意:while循环的工作机制并不是迭代循环,而是索引循环,所以不能循环字典、集合、文件等迭代对象,使用for循环,还能节省内存因为遍历一个扔一个
三元表达式
l = ['鸡蛋%s' %i for i in range(10) if i>5 ] print(l)
三元表达式其实就是简略式编程
name = 'ecohboy' a = '帅哥'if name == 'ecohboy' else 'sb' print(a)
if 左边为若真的操作,中间是判断语句,右边为否则操作 但只适用于简单逻辑。
列表解析
l = ['鸡蛋%s' %i for i in range(10) if i>5 ] print(l)
解压序列
l = [1,2,3,4,5,6,7] a,*b,c = l print(a,b,c)
解压序列就是一一对应取值,但用这种方法可以不通过索引也可以取到开头与结尾的值
生成器
生成器可以理解为一个数据类型,但他自动实现了迭代器协议(不用调用__iter__方法)所以生成器就是可迭代对象
1.生成器函数配合yeild(返回值)使用:
def test(): yield 1 yield 2 yield 3 yield 4 g = test() print(g) print(g.__next__()) #1 print(g.__next__()) #2 print(g.__next__()) #3 print(g.__next__()) #4
2.生成器表达式
laomuji = ('鸡蛋%s' %i for i in range(10)) print(laomuji.__next__()) #鸡蛋0 print(laomuji.__next__()) #鸡蛋1 print(laomuji.__next__()) print(laomuji.__next__())
生成器表达式实际就是把列表解析【】改成()