理解迭代器和可迭代对象

前言:

之前在迭代器、可迭代对象这一部分一直有些混淆,结合一些资料,表达我对这些概念的理解,未必都对,但是适合刚开始入手的朋友们从零开始理解



开门见山首先介绍可迭代对象和迭代器的通俗理解

  迭代器就是能被next()调用得到下一次迭代值的对象,迭代器不直接保存迭代的序列值,而保存得到下一次迭代值的算法

  可迭代对象就是能被iter()方法调用得到迭代对象的对象,只有可迭代对象才可用于for循环

for循环的底层实现原理:

  以下是一个for循环的格式

  for i in 可迭代对象:
    循环体

  实质是调用内建方法iter()得到迭代器对象,然后通过每次调用next(迭代器)得到i的迭代值

  例如以下的代码:

for i in x:
    print(i)

  完全可以改写为:

iterator = iter(x)
while True:
    i = next(iterator)
    print(i)

从严格或者底层原理来说

  迭代器或迭代器对象:实现了__next__()魔法方法的(类所实例化的)对象,该方法返回迭代器下一个值

  可迭代对象:实现了__iter__()魔法方法的(类所实例化的)对象,该方法返回一个迭代器对象

  

实际上,next和iter是对__next__和__iter__的进一步封装或者说next和iter在执行的时候又分别调用了内部的__next__和__iter__从而实现迭代器和可迭代对象的特性和功能

综上,我们可以理解for循环、可迭代对象、迭代器三者的联系:

  for循环只能对可迭代对象进行,可迭代对象又需要迭代器的实现

由此,我们可以自定义实现迭代器和迭代器对象,从而实现自定义的for循环效果 



示例:

通过迭代器和可迭代对象实现菲波那切数列

分别定义迭代器和可迭代对象所属的类:

class Feb:  ‘‘‘定义可迭代对象所属类‘‘‘
    def __init__(self,num): #num表示该数列的长度
      self.a = 1
      self.b = 2     self.current=self.a     self.num = num
    def __iter__(self):
        return FebIterator(self)
class FebIterator(self):  ‘‘‘定义迭代器类‘‘‘
    def __init__(self,source):
        self.source = source
    def __next__(self):          if(self.num-1>=0):       self.num = self.num-1
        self.current = self.a
        self.a = self.b
        self.b = self.b+self.current   #以上两步赋值操作可省略中间变量直接写为self.a,self.b = self.b,self.a+self,b        return self.curent      else: raise StopIteration

通过调用这两个类的实例化对象,可以实现循环打印斐波那契数列

feb = Feb()
for i in feb:
    print(i)

实际上,为了简化和方便,完全可以在一个类中同时实现__iter__()和__next__()方法,也即该类实例化的对象既是一个可迭代对象也是迭代器,代码如下:

class Feb:
    def __init__():
        self.a = 1
        self.b = 2     sele.current = self.a
    def __iter__(self):
        return self
    def __next__():     if(self.num-1>=0):
       self.num = self.num-1
        self.current = self.a
        self.a = self.b
        self.b = self.b+self.current   #以上两步赋值操作可省略中间变量直接写为self.a,self.b = self.b,self.a+self,b        return self.curent      else: raise StopIteration

其使用方法和之前没有区别,反而更加简便,前提是对迭代器和可迭代对象有清晰的理解和认识,否则会对二者概念产生混淆

原文地址:https://www.cnblogs.com/burningcarbon/p/11567872.html

时间: 2024-10-07 04:21:55

理解迭代器和可迭代对象的相关文章

迭代器_可迭代对象_生成器

[可迭代对象]保存的是已经生成好的数据,占用大量的空间有__iter__方法 就是可迭代对象(Iterable) [迭代器]保存的是生成数据的方法,占用极小的空间,需要时才返回数据既有__iter__,也有__next__ 就是迭代器(Iterator) [生成器]是一个[特殊]的迭代器,保存生成数据的方法(标志就是def中的[yiled],有了yield的def就不是函数(function) 生成器的send(参数) 可以在唤醒时返回参数(需要变量接收), 可迭代对象(iterable):能用

学习7: 列表生成式,生成器,迭代器,可迭代对象

1) 列表生成式,即创建列表的方式 列表生成式,这里是中括号[] >>> [x*x for x in range(0,10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ

Python全栈开发之---迭代器、可迭代对象、生成器

1.什么叫迭代 现在,我们已经获得了一个新线索,有一个叫做"可迭代的"概念. 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代.那么如果"可迭代",就应该可以被for循环了. 这个我们知道呀,字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? 1 from collections import Iterable 2 3 l = [1,2,3,4] 4 t = (1,2,3,4) 5 d =

迭代器 and 可迭代对象

可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的generator function. 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了. 可以被next()函数调用并不断返回下一个值的对象称为迭代器

Python生成器、迭代器、可迭代对象

把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.generator 可以直接作用于for循环的对象统称为:可迭代对象(Iterable) from collections import Iterable print(isinstance([],Iterable)) print(isinstance({},Iterable)) print(isinstanc

python的生成器与迭代器和可迭代对象

来简单的说下python中的生成器和可迭代对象以及迭代器的问题.只是简单地记录一下并不涉及太深入的内容. 首先来说一下什么是生成器,先看下面的代码: 1 #_*_ coding:utf-8 _*_ 2 3 result = (x for x in range(10)) 4 5 ''' 6 下面print的打印结果 7 <generator object <genexpr> at 0x0000026FA092B360> 8 ''' 9 print(result)  上面的这种代码其实

迭代器和可迭代对象

from collections.abc import Iterator class Company(object): def __init__(self, employee_list): self.employee = employee_list def __iter__(self): # 一般情况下都是这个样做 return MyIterator(self.employee) # def __getitem__(self, item): # return self.employee[item

迭代器 生成器, 可迭代对象以及应用场景

可迭代对象: 实现了迭代器协议的对象就是可迭代对象(实现方式是,实现iter方法) 迭代器 迭代器对象就是实现了iter() 和 next()方法的对象.其中iter()返回迭代器本身,而next()返回容器的下一个元素,在结尾处引发StopInteration异常. 迭代器有两个方法: iter() 和 next() it = iter(iterable) # 将一个可迭代对象转换为迭代器 next(it) # 获取下一个迭代器中的下一个值 `注意` list dic tuple string

迭代器、可迭代对象、迭代器对象、生成器、生成器表达式和相关的面试题

迭代器: 迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭代,它只是单纯的重复 可迭代对象 python中一切皆对象,对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象. 可迭代的对象:Python内置str.list.tuple.dict.set.file都是可迭代对象. 迭代器对象 只有字符串和列表都是依赖索引取值的,而其他的可迭代