首页 > 其他分享 >魔法方法之__iter__(self) && __next__(self)

魔法方法之__iter__(self) && __next__(self)

时间:2023-07-17 23:12:56浏览次数:41  
标签:__ 迭代 self iter next my

__iter__

__iter__(self) 是一个特殊方法,用于返回一个迭代器对象,使得自定义的类可以支持迭代操作。

最佳实践:

  • 在自定义类中实现 __iter__() 方法时,应该返回一个迭代器对象,通常是自身的实例。
  • 迭代器对象应该实现 __next__() 方法,用于返回容器中的下一个元素,并在没有更多元素可供迭代时引发 StopIteration 异常。
 1 class MyIterable:
 2     def __init__(self):
 3         self.data = ['A', 'B', 'C']
 4 
 5     def __getitem__(self, index):
 6         print(f"__getitem__,index={index}")
 7         return self.data[index]
 8 
 9     def __iter__(self):
10         print("__iter__() is called")
11         return iter(self.data)
12 
13 
14 my_iterable = MyIterable()
15 
16 # 使用 for 循环迭代对象
17 for item in my_iterable:
18     print(item)  # 输出:A  B  C
19 
20 # 调用 iter() 函数获取迭代器对象
21 my_iterator = iter(my_iterable)
22 print(next(my_iterator))  # 输出:A
23 print(next(my_iterator))  # 输出:B
24 print(next(my_iterator))  # 输出:C

__next__

__next__() 是一个特殊方法,用于定义迭代器对象的行为。它在迭代器对象中被调用,用于返回容器中的下一个元素。下面是关于 __next__() 方法的详解、最佳实践、示例以及可能遇到的一些坑:

  • 详解:

    • __next__() 方法应该返回容器中的下一个元素,并在没有更多元素可供迭代时引发 StopIteration 异常。
    • 如果没有显式地引发 StopIteration 异常,那么迭代器将永远不会停止并进入无限循环状态。
    • 在每次调用 __next__() 方法时,迭代器应该更新自身的状态以追踪迭代位置。
  • 最佳实践:

    • 在 __iter__() 方法中返回迭代器对象时,迭代器对象本身应该实现 __next__() 方法。
    • 迭代器对象的 __next__() 方法应该返回容器中的下一个元素,并更新状态。
 1 class MyIterable:
 2     def __init__(self):
 3         self.data = ['A', 'B', 'C']
 4         self.index = 0
 5 
 6     def __iter__(self):
 7         print("__iter__() is called")
 8         return self
 9 
10     def __next__(self):
11         print(f"__next__() is called,index={self.index}")
12         if self.index >= len(self.data):
13             raise StopIteration
14         value = self.data[self.index]
15         self.index += 1
16 
17         return value
18 
19 my_iterable = MyIterable()
20 for item in my_iterable:
21     print(item)  # 输出:A B C
22 
23 #  只能迭代1次:TypeError: iter() returned non-iterator of type 'MyIterable'
24 for item in my_iterable:
25     print(item)  # 输出:A B C
26 
27 
28 # 因为上面已经迭代 index已经3,如果进行调用,使用next方法就会抛StopIteration异常。
29 # my_iterator = iter(my_iterable)
30 # print(next(my_iterator))  # 输出:A
31 # print(next(my_iterator))  # 输出:B
32 # print(next(my_iterator))  # 输出:C

 

标签:__,迭代,self,iter,next,my
From: https://www.cnblogs.com/allenxx/p/17561564.html

相关文章

  • 2023.7.17
    昨天晚上睡得还可以,找我朋友深夜聊了一下今早走路去驾校感觉有点累到,但是所幸考科目二的时候踩住了离合,还不错科目二一把过啦!今天下午也在努力学习呢,明天准备休息一天!每天都要加油啦! ......
  • 题解 P9437『XYGOI round1』一棵树
    换根DP。本蒟蒻最初没想到换根,把自己写自闭了...定义\(f_u\)为子树\(u\)中的每个结点走到\(u\)的贡献和,\(l_u\)为大于\(a_u\)的最小的\(10\)的幂次方数,\(sum_u\)为\(\sum\limits_{v\inson(u)}{f_v}\)。转移方程为:\(f_u=l_u\cdot\sum\limits_{v\inson(u)}{f_v}+......
  • windows 安装telnet(含疑难杂症解决)
    一、常规安装办法常规遇到telnet不是内部或外部命令,表明telnet还未安装,安装即可。操作步骤:Win+R打开控制面板:输入control-程序和功能-启用或关闭Windows功能-勾选Telnet客户端一般以上步骤可以打开telnet二、还是无法使用......
  • CF1775
    A1&A2.GardenerandtheCapybaras(hardversion)超级诈骗题。直接\(O(n^3)\)枚举肯定不行。我们考虑两种情况:B最小:直接看最小的字符是否在区间\((1,len)\)中,如果在则构造成功。B最大:因为B没法做到最小,所以说明\((1,len)\)里全是b,为了让B的字典序最大,显然......
  • ABC284
    [ABC284D]HappyNewYear2023暴力肯定不行,尝试简单讨论一下。如果\(q>\sqrtn\),那么\(p^2<\sqrtn\),\(p<\sqrt[4]{n}\),枚举p就行。如果\(p^2>\sqrtn\),那么\(p<\sqrtn\),因为\(q<\sqrtn\),所以\(\min(p,q)\le\sqrt[3]{n}\),也可......
  • ARC153
    [ARC153A]AABCDDEFE第一眼看上去让人以为是数位DP,但看一眼样例2就知道直接枚举就行了。六层循环暴力枚举。复杂度\(O(10^6)\)。[ARC153B]GridRotations有思维含量的一题。我们横纵坐标分开考虑,对于每一个矩形,每次操作会使其内部元素的横坐标上下对调。纵坐标也同理,......
  • Proj. CMI Paper Reading: Distributed System Fuzzing
    Abstract背景:当前分布式系统分析一般都是黑盒工具,难以探索程序状态工具:MALLORY任务:greyboxfuzzingtestingdistributedsystem方法:timeline-driventesting,timelineabstraction步骤:动态构建描述系统行为的Lamporttimelines将这些timelines抽象化为happens-beforesu......
  • python: logHelper
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:https://docs.python.org/3/library/logging.html#描述:https://www.programcreek.com/python/example/136/logging.basicConfig#https://github.com/amilstead/python-logging-examples#Author......
  • 在树莓派启动分区创建配置文件,使其加入无线网络
    在树莓派的启动分区创建一个名为“wpa_supplicant.conf”配置文件,在文件中输入以下内容:country=CNctrl_interface=DIR=/var/run/wpa_supplicantGROUP=netdevupdate_config=1network={ssid="xxx"psk="xxx"priority=5}ssid:指定要连接的无线网络psk:网络......
  • Pytorch自定义数据集模型完整训练流程
    2、导入各种需要用到的包importtorch  //用于导入名为"torch"的模块。torch 是一个广泛使用的库,用于构建和训练神经网络。它提供了丰富的功能和工具,包括张量操作、自动求导、优化算法等,使得深度学习任务更加简单和高效。可以使用torch.Tensor类来创建张量,使用torch.nn.Modul......