迭代器,迭代对象,生成器

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,可以返回多次值,可以挂起/保存函数的运行状态


posted @ 2018-06-04 14:23  hexintong  阅读(164)  评论(0编辑  收藏  举报