迭代器,迭代对象,生成器
python3中用生成器 产生 斐波那切数列
1 #生成器 2 def fib(): 3 per,cun=0,1 4 while 1: 5 yield cun 6 per,cun=cun,cun+per 7 f=fib() 8 #range中指定斐波那契数列的范围 9 retu_list=list(next(f) for i in range(1,10))
1为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
2、什么是可迭代对象?
可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__
3 什么是迭代器对象?
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__()
迭代器的优缺点
#优点: - 提供一种统一的、不依赖于索引的迭代方式 - 惰性计算,节省内存 #缺点: - 无法获取长度(只有在next完毕才知道到底有几个值) - 一次性的,只能往后走,不能往前退
生成器
只要函数的内部与yied关键字,那么 函数名() 的结果不会执行该函数,会得到生成器
1 def func(): 2 print('====>first') 3 yield 1 4 print('====>second') 5 yield 2 6 print('====>third') 7 yield 3 8 print('====>end') 9 10 g=func() 11 print(g) #<generator object func at 0x0000000002184360>
生成器就是迭代器
1 g.__iter__ 2 g.__next__ 3 #2、所以生成器就是迭代器,因此可以这么取值 4 res=next(g) 5 print(res)
生成器 例子
1 def myrange(start,end,step): 2 while start<end: 3 yield start 4 start+=step 5 myobj=myrange(1,20,2) 6 print(next(myobj))
生成器 表达式形式
1 #yield关键字的另外一种使用形式:表达式形式的yield 2 def eater(name): 3 print('%s 准备开始吃饭啦' %name) 4 food_list=[] 5 while True: 6 food=yield food_list 7 print('%s 吃了 %s' % (name,food)) 8 food_list.append(food) 9 10 g=eater('egon') 11 g.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g) 12 g.send('蒸羊羔') 13 g.send('蒸鹿茸') 14 g.send('蒸熊掌') 15 g.send('烧素鸭') 16 g.close() 17 g.send('烧素鹅') 18 g.send('烧鹿尾')
yield总结
#1、把函数做成迭代器 #2、对比return,可以返回多次值,可以挂起/保存函数的运行状态