python3怎么理解生成器和迭代器?

判断一个对象是否是迭代对象

from collections import  Iterble
 isinstance([], Iterble)
  • 可迭代对象的本质是, 提供一个中间人,遍历的时候, 需要数据的时候, 获取这个对象的迭代器, 然后通过迭代器依次获取对象中的数据.
    • 具备了一个__iter__ 方法的对象就是一个可迭代对象
    • 通过iter方法获得可迭代对象的迭代器, 然后对迭代器使用next() 方法, 获取下一个数据
>>> li = [11, 22, 33, 44, 55]
>>> li_iter = iter(li)
>>> next(li_iter)
11
>>> next(li_iter)
22
>>> next(li_iter)
33
>>> next(li_iter)
44
>>> next(li_iter)
55
>>> next(li_iter)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

迭代器:

  • 判断一个对象是否是迭代器, isinstance(iter[], Iterator)
  • 一个实现__iter__() , __next () 方法的对象就是迭代器,
class MyList(object):
    """自定义的一个可迭代对象"""
    def __init__(self):
        self.items = []

    def add(self, val):
        self.items.append(val)

    def __iter__(self):
        myiterator = MyIterator(self)
        return myiterator


class MyIterator(object):
    """自定义的供上面可迭代对象使用的一个迭代器"""
    def __init__(self, mylist):
        self.mylist = mylist
        # current用来记录当前访问到的位置
        self.current = 0

    def __next__(self):
        if self.current < len(self.mylist.items):
            item = self.mylist.items[self.current]
            self.current += 1
            return item
        else:
            raise StopIteration

    def __iter__(self):
        return self


if __name__ == '__main__':
    mylist = MyList()
    mylist.add(1)
    mylist.add(2)
    mylist.add(3)
    mylist.add(4)
    mylist.add(5)
    for num in mylist:
        print(num)
  • for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,
    然后对获取到的迭代器不断调用**next()**方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

迭代器的作用:

  • 迭代器最核心的功能是通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的
    * 可以节省内存和存储空间

生成器(generator):

生成器是一种给特殊的迭代器, 保存当前运行的状态
实现生成器的两种方法
  • 第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )
In [15]: L = [ x*2 for x in range(5)]
In [16]: L
Out[16]: [0, 2, 4, 6, 8]
In [17]: G = ( x*2 for x in range(5))
In [18]: G
Out[18]: <generator object <genexpr> at 0x7f626c132db0>
  • 第二种方法 yeild , __ next __ 函数中使用yeild关键字
    , 可以使用yeild 关键字实现
    使用了yield的函数就是生成器,
  • yield关键字有两点作用:
    • 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
    • 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
    • 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)send() 方法也能唤醒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值