(5) python 迭代器和生成器

开发者 2024-9-21 23:01:48 54 0 来自 中国
(一)迭代器

迭代器是一种对象,该对象包罗值的可计数数字。
迭代器是可迭代的对象,这意味着您可以遍历全部值。
从技能上讲,在 Python 中,迭代器是实现迭代器协议的对象,它包罗方法 iter() 和 next()。
列表、元组、字典和聚集都是可迭代的对象。它们是可迭代的容器,您可以从中获取迭代器(Iterator)。
全部这些对象都有用于获取迭代器的 iter() 方法:
也可以使用for循环,循环遍历可迭代对象。
当迭代器已经将可迭代对象内里的数据都读取完了,你再使用next方法就会报错StopIteration。
假如一个对象实现了__iter__方法,那么它就是一个可迭代对象。
假如一个对象实现了__iter__和__next__方法,那么它就是一个迭代器。
list1 = [1,2,3,4,5]str1 = "abcdefg"it1 = iter(list1)it2 = iter(str1)print(next(it1)) # 1print(next(it2)) # afor i in it1:    print(i) # 2 3 4 5print(next(it1)) # StopIteration:# 自界说迭代器class MyNumber:    def __init__(self,start=0, value=0, step=1) -> None:        if start > value:            raise Exception("开始值不能大于竣事值!")        self.value = value         self.step = step        self.start = start    def __iter__(self):        self.index  =  self.start        self.x = None        return self # 必须要返回迭代器对象本身    def __next__(self):        if self.index < self.value:            self.x = self.index            self.index += self.step            return self.x        else:            # print("竣事了")            raise StopIterationfor i in MyNumber(-5,5,2): # 创建了一个类似range类的MyNumber类    print(i)# 等同于for i in range(-5,5,2): # 左闭右开[-5, 5)    print(i)以是根据上面的代码我们可以得出for循环的工作流程。

  • 调用该对象的iter方法获取迭代器
  • 调用next方法,获取迭代值
  • 捕获StopIteration异常,竣事循环
  • 实验for循环里的代码
生成器

实在生成器也是一种迭代器,但是它是一种特殊的迭代器。他的功能是,我们每调用一次就会返回一个值,这个值是调用的时间生成的,并不是提前预备好的。
(1)二者区别

1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是本身生成元素的。也就是前者是从有到有的复制,而后者则是从无到有的生成。以 list 容器为例,在使用该容器迭代一组数据时,必须事先将全部数据存储到容器中,才华开始迭代;而生成器却差别,它可以实如今迭代的同时生成元素。
2.在用法上生成器只须要简单函数写法,共同yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。
(2)怎样界说一个生成器

不但云云,生成器的创建方式也比迭代器简单很多,大要分为以下 2 步:

  • 界说一个以 yield 关键字标识返回值的函数;
  • 调用刚刚创建的函数,即可创建一个生成器;
下面的代码分别使用生成器实现range和zip的功能。
def generators(start=0, value=0, step=0):    if start > value:        raise Exception("开始值不能大于竣事值!")    while start < value:        yield start        start = start+stepfor i in generators(-5,5,2):    print(i)list1 = ["a","b","c"]list2 = [1,2,3,4]def my_zip(*lists):    min_len = min([len(l) for l in lists])    index=0    while min_len:        yield tuple([x[index] for x in lists])        index+=1        min_len-=1dict1 = {}for x,y in my_zip(list1,list2):    dict1[x] = yprint(dict1) # {'a': 1, 'b': 2, 'c': 3}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 11:08, Processed in 0.147887 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表