Python迭代器和可迭代对象??

迭代器,迭代器能使用next()方法
在这里插入图片描述
可迭代对象与迭代器

刚开始我认为这两者是等同的,但后来发现并不是这样;下面直接抛出结论:

1)可迭代对象包含迭代器。
2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。

你也许会问,结论3与结论2是不是有一点矛盾?既然一个对象拥有了next方法就是迭代器,那为什么迭代器必须同时实现两方法呢?

因为结论1,迭代器也是可迭代对象,因此迭代器必须也实现__iter__方法。

介绍一下上面涉及到的两个方法:

1)iter()

该方法返回的是当前对象的迭代器类的实例。因为可迭代对象与迭代器都要实现这个方法,因此有以下两种写法。

写法一:用于可迭代对象类的写法,返回该可迭代对象的迭代器类的实例。

写法二:用于迭代器类的写法,直接返回self(即自己本身),表示自身即是自己的迭代器。

也许有点晕,没关系,下面会给出两写法的例子,我们结合具体例子看。

2)next()
返回迭代的每一步,实现该方法时注意要最后超出边界要抛出StopIteration异常。

1 迭代器

定义(表面理解)

表面来看,只要可以用 for...in...进行遍历的对象就是可迭代对象    

自定义可迭代对象(本质)

语法层面,如果一个对象实现了__iter__方法,那么这个对象就是可迭代对象

判断是否是可迭代对象(Iterable)

通过调用Python内置的isinstance来判断是否是Iterable的实例

from collections import Iterable           #需要导入Iterable模块,必须执行from collections import Iterable

print(isinstance([],Iterable))
<True	

print(isinstance('',Iterable))
<True

print( isinstance({},Iterable))
<True

class MyList(object):
   def __init__(self):
     self.list = []
    def add(self,item):
self.list.append(item)

mylist = MyList()
print(isinstance(mylist,Iterable))
<False

通过上面例子可以看出,Python中的内置类型dict,list,str的对象都是可迭代的,我们自定义了一个类MyList,由于这个类没有实现iter方法,所以这个类的实例不是可迭代对象
:用 Iterable中isinstance方法判断一个对象是否可以迭代时,要先导入from collections import Iterable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值