一、迭送器
1.1可迭代协议(iteradle)
可迭代协议可以被迭代要满足的要求就叫做可迭代协议
可迭代协议的定义:内部实现了__iter__方法,可以实现_iter_的内置方法的都是可迭代对象
可以被for循环的对象都是可迭代的对象
迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
1.2迭代器(iterator)
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法
优点: - 提供一种统一的、不依赖于索引的迭代方式 - 惰性计算,节省内存
缺点: - 无法获取长度(只有在next完毕才知道到底有几个值) - 一次性的,只能往后走,不能往前退,执行到最后一个元素后,会报错
二、生成器(Generator)
生成器定义
1.生成器函数:常规函数定义,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
3.本质:生成器的本质为迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
4.特点:惰性运算,开发者自定义
生成器的优点
1.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用
2.提高代码可读性
生成器表达式
1 g=('%s' %i for i in range(10)) 2 for i in g: 3 print(i)
yield from
1 def gen1(): 2 for c in 'AB': 3 yield c 4 for i in range(3): 5 yield i 6 7 print(list(gen1())) 8 9 def gen2(): 10 yield from 'AB' 11 yield from range(3) 12 13 print(list(gen2())) 14 # 两个函数执行的结果是一样的
send
1 def generator(): 2 print(123) 3 content = yield 1 4 print('=======',content) 5 print(456) 6 yield 2 7 8 g = generator() 9 ret = g.__next__() 10 print('***',ret) 11 ret = g.send('hello') #send的效果和next一样 12 print('***',ret) 13 14 #send 获取下一个值的效果和next基本一致 15 #只是在获取下一个值的时候,给上一yield的位置传递一个数据 16 #使用send的注意事项 17 # 第一次使用生成器的时候 是用next获取下一个值 18 # 最后一个yield不能接受外部的值
三、推导式
1 #列表推导式 2 g=[i for i in range(10)] 3 print(g) 4 #与生成器表达式的区别为:生成器用(),列表用[]
遍历之后挨个处理:[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
筛选功能:[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]
例子:所有能被3整除的数
1 ret = [i for i in range(30) if i%3 == 0] #完整的列表推导式 2 print(ret)