迭代器有两个基本的方法: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.为序列和非序列提供了一个统一的迭代取值的方式。
2.不管迭代器对象有多大,同一时刻只有一行数据存在。
缺点也有两点:
1.在取得时候我们并不知道这个迭代器的长度。
2.取值是一次性的,过去的就让它过去,永远无法回来, 除非我们在定义一个新的迭代器对象。
 
posted on 2022-10-29 20:50  topass123  阅读(16)  评论(0编辑  收藏  举报