栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

少儿python基础教程第43课-迭代器和生成器实例详解

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

少儿python基础教程第43课-迭代器和生成器实例详解



今天学习Python中比较难以理解的两个概念:迭代器和生成器。

之前对迭代器的理解可能存在偏差。其实学习也是一个不断迭代的过程,所谓迭代,就是每次重复的做一件事,从而获得一次反馈。学习就是不断重复,并不断用新的反馈结果来覆盖前一次结果的过程。

 

●可迭代对象Iterable:凡是能用for循环迭代的对象就是可迭代对象。

可以使用isinsdance()来判断一个对象是否是iterable。

 

isinstance([],Iterable)
True
isinstance({}, Iterable)
True
isinstance('abc', Iterable)
True 
isinstance((x for x in range(10)), Iterable)
True 
isinstance(100, Iterable)

False

 

●迭代器Iterator:Python的iterator对象表示一个数据流。可以被next()函数不断调用并返回下一个数据的对象称为迭代器。

 

当iterator对象被next()调用不断返回下一个数据,直到没有数据时抛出StopIteration错误,无法返回下一个值。

 

可以把这个数据看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以iterator的计算式惰性的,只有在需要返回下一个数据的时候他才会计算。

iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。


 

可以使用isinsdance()来判断一个对象是否是iterator。

 

isinstance((x for x in range(10)), Iterator)
True

True
isinstance([], Iterator)
False
isinstance({}, Iterator)
False
isinstance('abc', Iterator)
False

 

●iter():用于把可迭代对象生成迭代器对象。

●next():输出迭代器的下一个元素。

 

list[1,2,3,4]

it=iter(list)

print(next(it))

#运行结果1

print(next(it))

#运行结果2

 

●生成器generator:一边循环,一边通过算法计算生成元素值的机制,叫生成器。生成器是一个特殊的程序,是迭代器的一种。

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator

  生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。

  生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器。

 要创建一个generator,有很多种方法,第一种方法很简单,只有把一个列表生成式的[]中括号改为()小括号,就创建一个generator。

总结:生成器都是迭代器对象,即生成器是迭代器的一种,迭代器都是可迭代对象,所以生成器也是可迭代对象。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/806021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号