首页 > 编程语言 >python中iterable和iterator

python中iterable和iterator

时间:2022-11-03 16:11:23浏览次数:40  
标签:__ node iterator python self iter next node1 iterable

iterable:可迭代对象

可以一个一个的返回它的成员,比如list,str,tuple,dict,file objects
它可以在for loop种使用,for loop in后面接的必须是一个可迭代对象

iterator:迭代器

是一个表示数据流的对象,可以使用next函数不断的从这个对象里面获取新的数据


前者是一个数据的保存者,一个容器,它可以完全没有状态,可以不知道迭代器数到哪里了,需要有能力产生迭代器,必须要有__iter__或者__getitem___,保证它可以在iter()函数作用下返回一个itetator.而迭代器必须要有__next__方法,保证它被next()作用时返回下一个可迭代对象里面的值的结果

lst = [1,3,5]
for i in lst
	print(i)
##for in 可迭代对象
##做了一个从可迭代对象拿到迭代器的操作等价于
lst = [1,3,5]
it = iter(lst)
for i in it:###还是会对it做一个iter()操作
    print(i)

iter()和next()做了一件什么事情?

_iter_和_next_是两种魔术方法,当我们对一个实例化对象使用内置函数时(这个实例化对象中我们自定义了与这个内置函数对应的魔法方法),相当于我们对这个内置函数进行了重写再使用。
而python中是有内置iter()和next()两个函数的,在对该类实例化对象使用iter()内置函数时,iter()调用我们重写的__iter
()而不是其原本的,返回self。同样的,使用next()内置函数时也即调用我们重写的__next
()而不是原来的
魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数。
我们在调用python类中的某个方法时,通常会看到某些特殊的方法,它们总被双下划线所包围,像这种格式:"__ 方法名__",这些方法很强大,充满魔力,可以让你实现很多功能。如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。

应用

class NodeIter:
    def __init__(self,node):
        self.curr_node = node

    def __next__(self):
        if self.curr_node is None:
            raise StopIteration
        node,self.curr_node = self.curr_node,self.curr_node.next
        return node

class Node:
    def __init__(self,name):
        self.name = name
        self.next = None
    def __iter__(self):
        return  NodeIter(self)

node1 = Node("node1")
node2 = Node("node2")
node3 = Node("node3")
node1.next = node2
node2.next = node3


for node in node1:
    print(node.name)

image-20221103154836506
第一步首先Node类的iter方法执行NodeIter.init(node1)初始化得到NodeIter(node1),且curr_node=node1
第二步开始执行NodeIter的next方法
image-20221103155018754
根据程序返回node1作为for循环的node变量作为输出,同时讲curr_node变为node2
image-20221103155158048
第三步print之后继续执行NodeIter的next方法:此时该self为
image-20221103155311578
重复上述步骤知道抛出错误
输出结果

node1
node2
node3

以上代码迭代器中没有iter方法,导致如果是下面的情况无法运行(讲可迭代对象执行过一次iter方法之后放在in后面),所以一般加入一个iter在迭代器中直接返回本身即可。

class NodeIter:
    def __init__(self,node):
        self.curr_node = node

    def __next__(self):
        if self.curr_node is None:
            raise StopIteration
        node,self.curr_node = self.curr_node,self.curr_node.next
        return node
    def __iter__(self):
        return self
class Node:
    def __init__(self,name):
        self.name = name
        self.next = None
    def __iter__(self):
        return  NodeIter(self)

node1 = Node("node1")
node2 = Node("node2")
node3 = Node("node3")
node1.next = node2
node2.next = node3
it = iter(node1)
first = next(it)
for node in it:
    print(node.name)

执行完it=it(node1)的变量
image-20221103155843003
下一句
image-20221103155933122
for in先执行NodeIter的iter方法,返回本身,之后再next方法,返回node2作为node变量,再重复直到抛出错误。
输出结果为

node2
node3

标签:__,node,iterator,python,self,iter,next,node1,iterable
From: https://www.cnblogs.com/zhuxinglong-zxl/p/16853898.html

相关文章

  • python 中print函数实现输出不换行
     001、[root@pc1test3]#python2##python2Python2.7.5(default,Jun282022,15:30:04)[GCC4.8.520150623(RedHat4.8.5-44)]onlinux2Type"help......
  • python 创建 dll 到 c++ 调用
    1.如果想要在c++中debug模式调试模式运行,windows下的话,需要安装时安装debug库2.安装cython3.编写pyx文件,例如demo.pyx:#cython:language_level=3cdefpub......
  • 【Web开发】Python实现Web图表功能(pyecharts入门学习)
    <fontcolor=purpleface=华文行楷size="5">"柳丝榆荚自芳菲,不管桃飘与李飞;"1、简介APythonEchartsPlottingLibrary.ApacheEcharts是一个由百度开源的数据可视化......
  • Python json模块
    一、JSON介绍JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写。二、常用方法方法描述json.loads()将JSON字符串转化为Python......
  • Python实验报告——第10章 文件及目录操作
    实验报告【实验目的】 1.掌握Python自带的函数进行基本文件操作。2.掌握Python内置的os模块及其子模块os.path进行目录相关的操作。【实验条件】1.PC机或者远程编......
  • 【Python_pytest】出错:PytestAssertRewriteWarning: Module already imported so cann
    pytest测试时pytest_check模块错误错误信息:PytestAssertRewriteWarning:Modulealreadyimportedsocannotberewritten:pytest_checkself._mark_plugins_for_......
  • Python定义变量的方法
    什么是变量我们只要与生活中的数学做类型就可以清楚的了解什么是变量 在Python中,变量的概念基本上和初中代数的方程变量是一致的。例如,对于方程式y=x*x,x就是变量。当......
  • 第七章Python实训
    test7-1    test7-2   test7-3    test7-4    test7-5   ......
  • [面试]-- python常见面试问题
    1、哪些对象是可迭代的?怎样实现迭代协议?答:(1)实现了迭代协议的对象都可以迭代,如元组、列表、字典表等    (2)对象中包含内置的next()和__next__()函数,如果迭代对象......
  • python第六周
    deffunction_tips():'''功能:每天输出一条励志文字'''importdatetime#定义一个列表mot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我......