您的位置:首页 > 编程语言 > Python开发

Python高级函数之生成器和迭代器

2019-01-04 22:53 555 查看
版权声明:文章开头说明文章链接即可 https://blog.csdn.net/qq_39112646/article/details/85803381

目录

一:生成器

1.1 定义

1.2 创建

1.3 输出

1.4 捕捉生成器的return返回值

二:迭代器

2.1可迭代对象 Iterable

2.2 定义

2.3 解释

2.4 转换

三:总结

一:生成器

1.1 定义

使用传统的方法,创建包含100w个元素的列表,会占用极大的存储空间,而且利用效率不高。那么,一种良好的解决思路是,在循

环的过程中不断推算出后续的元素,那么就不必要创建完整的列表,从而节省大量的存储空间。

这种一边循环一边计算的机制,称为生成器:generator

1.2 创建

第一种:

列表生成式: a=[i+1 for i in range(10)]   创建一个列表

把上面的[] 变成()我们就创建了一个generator  g=(i+1 for i in range(10))

第二种:

在普通函数中加入 yield,以斐波拉数列的函数生成为例解释

[code]def f(x):
n,a,b=0,0,1
while n<x:
yield b
a,b=b,a+b
n=n+1
return None
date=f(10)

print(next(date))
print('are you ok')
print(next(date))

###
1
are you ok
1

变成generator函数,在每次调用next()的时候执行,遇到yield返回,再次执行时从上次返回的yield语句返回

1.3 输出

generator中保存的是算法,每次调用next(g)变回计算出下一个元素,直到计算到没有,抛出StopIteration错误

实际中:我们使用for循环计算并打印每一个元素,因为generator也是一种可迭代对象

[code]g=(x+1 for x in rang(10))
for n in g:
print(n)

1.4 捕捉生成器的return返回值

返回值包含在StopIteration的value中,使用错误处理来获得其返回值

[code]while True:
try:
x=next(date)
print(x,end=' ')
except StopIteration as e:
print('\ngenerator return value',e.value)
break

二:迭代器

2.1可迭代对象 Iterable

直接可以作用于for循环的数据类型有如下几种:

一:集合数据类型,如list,tuple,dict,set,str等

二:generator,包含生成器和带yield的generator function

以上两种数据类型我们统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是不是Iterable对象

[code]from collections import Iterable

print(isinstance('sssss',Iterable))
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance((x for x in range(10))),Iterable)
#
返回值都是True

2.2 定义

可以被next()函数调用并且不断返回下一个值的对象统称为迭代器:Iterator

生成器都是Iterator对象,但是list tuple dict set是可迭代对象,但不是迭代器

2.3 解释

Iterator表示的是一个数据流,可以被next()不断调用并不断返回下一个数据,知道没哟的时候抛出错误。

这个数据流是一个有序序列,但是我们不能提前知道有序序列的长度,只能不断通过next()计算出下一个数据

Iterator的计算是惰性的,只有需要下一个数据才会进行计算

毫不夸张的说,Iterator可以表示一个无线大的数据流,例如全体自然数,但是list却不能

2.4 转换

可以通过 iter()方法讲一个Iterable转换为Iterator

例如: 返回值是True

[code]list1=[1,2,3,4,56]
Ite1=iter(list1)
print(isinstance(Ite1,Iterator))

三:总结

[code]for x in [1,2,3,4,5]
......

for循环的本质:三部曲

第一:调用iter()方法返回一个迭代器

第二:不断调用next()方法

第三:处理StopIteration异常

 

凡是作用于for循环的对象都是Iterable类型

凡是可以作用next()都是Iterator对象,表示一个惰性的计算序列

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: