迭代器有两个基本的方法:iter() 和 next()。迭代对象iter() 生成器本身就含有iter和next的内置方法,它本身就是迭代器,那么怎么定义一个生成器呢?
那就需要用到yield关键字了,yiled有以下作用
1.yield可以暂停函数的运行,不像return,可以让函数处于运行状态且不执行代码。
2.yield可以返回值,类似于return,其值就是生成器对象
迭代器
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象 print (next(it))
生成器
# next()的效果和.__next__()是一样的。
# 当生成器遇到next()的调用开始运行,遇到yield停止执行代码,返回生成器对象, 等待下次next。
def func():
print(11111)
yield 11111
#x=yield 111
#print(x)
print(22222)
yield 22222
func() # 此刻这个调用方式已经不好使了 a = func()
# 先弄一个生成器出来 b = next(a)
# 开始执行代码打印1111,在yield处暂停执行,返回11111
#a.sned(None),如果想func里面打印或者做其他处理的话,可以使用send方法
#等同于next(g) 第一步必须向生成器传一个空值启动生成器。(必须传)
#b = a.send(5) # 将5给变量值x,然后开始运行,直到下一个yield,
#然后返回yield之后的值 c = next(a)
# 继续执行2222,在yield暂停执行,返回22222 d = next(a)
# 函数体代码执行完毕,没有返回值,抛出StopIteration异常结束。
迭代器的优缺点
1.为序列和非序列提供了一个统一的迭代取值的方式。标签:迭代,生成器,iter,next,yield,print From: https://www.cnblogs.com/topass123/p/16839833.html
2.不管迭代器对象有多大,同一时刻只有一行数据存在。
缺点也有两点:
1.在取得时候我们并不知道这个迭代器的长度。
2.取值是一次性的,过去的就让它过去,永远无法回来, 除非我们在定义一个新的迭代器对象。