迭代器(iterator)
从本质上来说,迭代是重复反馈过程的活动,其目的是接近所需要的目标和结果,每一次重复称为一次迭代,每一次迭代得到的结果称为下一次迭代的初始值。
定义
- 具有iter()和next()方法就是迭代器
模拟一下for循环的实现
lst=[1,2,3,4,5]
l=lst.__iter__()#将可迭代对象转为迭代器
while True:
try:
print(l.__next__())
except StopIteration:
break
迭代器:
优点:节省内存,惰性机制(典型以时间换空间)
缺点:一次性的(用完就没有了),不能逆行(不能后退)
生成器(generator)
- 本质是一个迭代器,区别刻意理解为一个是Python自带的,一个是自己写的
- 两种实现方式一种是函数形式,一种是生成器推导式形式,函数中把return换为yield,推导式则是为()形式
- 如果具有send方法救援判定为是生成器
坑:#这样会导致每次都重新创建新的生成器,从第一个yield遍历
def func():
yield 1
yield 2
func() # 生成一个生成器
print(func().__next__()) # 这样会一直重新创建生成器,不断输出1
print(func().__next__())
解决方法:这样创建一次,就可以了
g=func()
print(next(g))
print(next(g))
总结:
在函数中将return改写成yield就是一个生成器
yield 和 return 的区别
相同点:
1.都是返回内容
2.都可以返回对个,但是return写多个只会执行一个
不同点:
1.return 终止函数 yield是暂停生成器
2.yield能够记录当前执行位置
一个__next__() 对应一个yield
生成器可以使用for循环获取值
yield from – 将可迭代对象元素逐个返回
在函数的内部 yield 能将for循环和while循环进行临时暂停
yield返回是迭代器对象
yield from返回的是迭代器对象中每一个元素