北京网站排名seo,义乌外贸网站建设公司,网站开发后端培训,怎么做网站动图文章目录 前言一、迭代器介绍及作用1.可迭代对象2. 迭代器 二、常用函数和迭代器1.常用函数2.迭代器 三、总结结束语 #x1f482; 个人主页:风间琉璃#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主#x1f4ac; 如果文章对你有帮助、欢迎关注… 文章目录 前言一、迭代器介绍及作用1.可迭代对象2. 迭代器 二、常用函数和迭代器1.常用函数2.迭代器 三、总结结束语 个人主页:风间琉璃 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言
Python有三大器迭代器、生成器、装饰器。这里给大家先介绍迭代器相关的知识。 一、迭代器介绍及作用
1.可迭代对象
在介绍迭代器之前介绍一下迭代和可迭代对象的概念
迭代通常从一个对象中依次取出数据这个过程叫做遍历也称为**迭代(**重复执行某一段代码块并将每一次迭代得到的结果作为下一次迭代的初始值)。
可迭代对象是指该对象可以被用于for循环例如集合列表元组字典字符串迭代器等。直接作用于for循环的对象统称为可迭代对象(Iterable) 那么在代码层面如何定义一个可迭代对象呢 在python中如果一个对象实现了__iter__方法则该对象可以称之为可迭代对象。例如可以查看list,set等其内部均实现了__iter__方法实现方式和对象的初始化方法一样。
class MyIterable:def __init__(self):passdef __iter__(self):return self
如果一个对象未实现__iter__方法对其使用for则会抛出TypeError: ‘xxx’ object is not iterable。
MyIterable实现了__iter__方法则MyIterable就是一个可迭代对象。可以通过如下方式判断一个对象是不是可迭代对象
# 导入collections.abc模块中的Iterable对象
import collections.abcclass MyIterable:def __init__(self):passdef __iter__(self):return selfobj MyIterable()# 判断str是否可迭代
a isinstance(obj, collections.abc.Iterable)
# 打印迭代结果
print(a)2. 迭代器
迭代器对可迭代对象进行迭代的方式或容器并且需要记录当前迭代进行到的位置。
Python迭代器可以被定义为 ⋆ \star ⋆ 在python中如果一个对象同时实现了__iter__和__next__(获取下一个值)方法 ⋆ \star ⋆ 可以通过内置函数next(iterator)或实例对象的__next__()方法来获取当前迭代的值 ⋆ \star ⋆ 迭代器一定是可迭代对象可迭代对象不一定是迭代器。 ⋆ \star ⋆ 如果可迭代对象遍历完后继续调用next()则会抛出StopIteration异常。
注意第三点一个对象要同时实现__iter__和__next__才 可以称为迭代器只有实现__iter__方法的称为可迭代对象。可通过如下方式判断一个对象是不是迭代器
# 导入collections.abc模块中的Iterable对象
import collections.abcclass MyIterable:def __init__(self):passdef __iter__(self):return selfobj MyIterable()# 判断str是否可迭代
a isinstance(obj, collections.abc.Iterable) # True
b isinstance(obj, collections.abc.Iterator) # False
# 打印迭代结果
print(a)
print(b)从这里可以看到obj是可迭代对象但不是迭代器。常见数据类型Iterable和Iterator分类 你可能会问为什么list、dict、str等数据类型不是Iterator
这是因为Python的Iterator对象表示的是一个数据流Iterator对象可以被next()函数调用并不断返回下一个数据直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列但我们却不能提前知道序列的长度只能不断通过next()函数实现按需计算下一个数据所以Iterator的计算是惰性的只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流例如全体自然数。而使用list是永远不可能存储全体自然数的。
下面是一个简单的Python迭代器示例
# 导入collections.abc模块中的Iterable对象
import collections.abcclass MyIterable:def __init__(self, mylist):self.mylist mylist # 列表self.index 0 # 索引def __iter__(self):return selfdef __next__(self):if self.index len(self.mylist):value self.mylist[self.index]self.index 1return valueelse:raise StopIterationmylist [1, 2, 3, 4, 5]
iterableobj MyIterable(mylist) # 迭代器(可迭代对象)# a isinstance(iterableobj, collections.abc.Iterable) # True
# b isinstance(iterableobj, collections.abc.Iterator) # False在这个示例中我们创建了一个称为MyIterable的类它包含了一个列表和一个索引值。该类还实现了__iter__()和__next__()方法。因此iterableobj是一个迭代器(可迭代对象)。
__iter__()方法返回该对象本身因此可以直接对该对象使用for…in…语句进行迭代。 __next__()方法则根据当前索引值来获取列表中的下一个元素如果已经到达列表末尾则抛出StopIteration异常。因此有两种方法打印输出。
(1)使用for循环打印输出
for item in iterableobj:print(item)(2)使用next函数
while True:try:# 获得下一个值:x next(iterableobj)print(x)except StopIteration:# 遇到StopIteration就退出循环break注意不要两种方式一起用一起使用的话只会打印输出一次可能是由于底层都是调用的迭代器吧迭代器会记录当前迭代的位置使用其中一种方式后迭代器计数器已经到末尾了当第二次使用的时自然啥也不会输出。
二、常用函数和迭代器
1.常用函数
2.迭代器
三、总结
优点迭代器对象表示的是一个数据流可以在需要时才去调用next来获取一个值因而本身在内存中始终只保留一个值对于内存占用小可以存放无限数据流。由于其他容器需要一次将所有元素都存放进内存如列表、集合、字典…等
缺点无法获取存放的元素长度除非取完计数。同时取值不灵活只能向后取值next()永远返回的是下一个值无法取出指定值(如字典的key,或列表的下标)而且迭代器对象的生命周期是一次性的元素被迭代完则生命周期结束。 Python 的迭代器提供稳定和灵活的代码。迭代器和可迭代对象的区别 ⋆ \star ⋆ Iterable 是一个可以迭代的对象。它在传递给iter()方法时生成一个迭代器。 ⋆ \star ⋆ Iterator 是一个对象用于使用 __next__() 方法对可迭代对象进行迭代。迭代器有 __next__() 方法它返回对象的下一项。
请注意每个迭代器也是一个可迭代的但不是每个可迭代的都是一个迭代器。
例如列表是可迭代的但列表不是迭代器。可以使用函数 iter() 从可迭代对象创建迭代器。 为了实现这一点对象的类需要一个方法 __iter__它返回一个迭代器或者一个具有从 0 开始的顺序索引的 __getitem__ 方法。但其本质也是实现了 __iter__ 方法。
结束语
感谢阅读吾之文章今已至此次旅程之终站 。
吾望斯文献能供尔以宝贵之信息与知识也 。
学习者之途若藏于天际之星辰吾等皆当努力熠熠生辉持续前行。
然而如若斯文献有益于尔何不以三连为礼点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 。