【Python3_进阶系列_009】Python3-迭代器

一、迭代器

迭代器对象是支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

可迭代对象:对象只要包含__iter__方法,就可以成为可迭代对象,就可以通过iter函数返回迭代器。

迭代器:对象同时包含__iter__和__next__方法,就是一个迭代器。可以通过next()获取值,也可以直接obj.__next__()获取值

例子1:购物车迭代器实现

class ShoppingCart(object):

    def __init__(self):
        self.index = 0
        self.good = [1, 3, 5, 6]

    def __iter__(self):
        return self

    def next(self):
        return self.__next__()

    def __next__(self):
        if self.index < len(self.good):
            data = self.good[self.index]
            self.index += 1
            return data
        else:
            raise StopIteration
if __name__ == '__main__':
    cart = ShoppingCart()
    print(cart.next())
    print(cart.next())
    print(cart.next())

输出:
1
3
5

例子2:可迭代对象的获取(序列类型都是可迭代的,都包含__iter__方法)

>>>l1 = [1,2,3,4]
>>>l2 = l1.__iter__()   ##对象调用__iter__()方法会返回一个新的iterable对象(可迭代的对象),next()方法传入可迭代对象是返回值
>>>next(l2)
1
>>>next(l2)
2
>>>next(l2)
.....
next(l2)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration

l1 = [1,2,3]
l2 = l1.__iter__()
dir(l1)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
dir(l2)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

type(l1)
<class 'list'>
type(l2)
<class 'list_iterator'>

可以看出:我们经常说序列是可迭代的(iterable)实际就是因为序列类型包含了(__iter__)方法,这个方法返回的是一个迭代器(同时包含:__iter__和__next__方法)。可以看到l2的类型是一个list迭代器

 

转载于:https://www.cnblogs.com/forfreewill/articles/9407101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值