`
luozhaoyu
  • 浏览: 346683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python类中的__iter__, __next__与built-in的iter()函数举例

阅读更多
适才发现之前在pydev中使用的语法检查器是python3.2,而解释器是python2.7……罪过罪过,从此篇之后,不出意外都是使用python3.x版本解释器

本文主要举例介绍python的built-in函数iter,以及类中的两个函数__iter__,__next__。其中作为iterator的对象是类,而不是容器(因为容器或generator作为iterator对象很简单,这里不多说了)

iter函数有两种用法,一种是传一个参数,一种是传两个参数。返回的结果都是返回一个iterator对象。
先说传两个参数的,比如有
i1 = iter(itr, 'c')

这个意思是说,返回itr的iterator,而且在之后的迭代之中,迭代出来'c'就立马停止。对这个itr有什么要求呢?这个itr在这里必须是callable的,即要实现__call__函数

再说传一个参数,有
i2 = iter(itr)
这里itr必须实现__iter__函数,这个函数的返回值必须返回一个iterator对象

看例子:
class Itr(object):
    def __init__(self):
        self.result = ['a', 'b', 'c', 'd']
        self.i = iter(self.result)
        
        
    def __call__(self):
        res = next(self.i)
        print("__call__ called, which would return ", res)
        return res


    def __iter__(self):
        print("__iter__ called")
        return iter(self.result)

    
itr = Itr()
# i1必须是callable的,否则无法返回callable-iterator
i1 = iter(itr, 'c')
print("i1 = ", i1)
# i2只需要类实现__iter__函数即可返回
i2 = iter(itr)
print("i2 = ", i2)

for i in i1:
    print(i)

for i in i2:
    print(i)

输出结果是:
i1 =  <callable_iterator object at 0x1349710>
__iter__ called
i2 =  <list_iterator object at 0x133a090>
__call__ called, which would return  a
a
__call__ called, which would return  b
b
__call__ called, which would return  c
a
b
c
d

可以看到传入两个参数的i1的类型是一个callable_iterator,它每次在调用的时候,都会调用__cal__函数,并且最后到c就停止了。
而i2就简单的多,itr把自己类中一个容器的迭代器返回就可以了。

有朋友可能不满意,对上面的例子只是为了介绍iter()函数传两个参数的功能而写,如果真正想写一个iterator的类,需要使用__next__函数。这个函数每次返回一个值就可以实现迭代了。
class Next(object):
    def __init__(self, data = 1):
        self.data = data
        
        
    def __iter__(self):
        return self
    
    
    def __next__(self):
        print("__next__ called")
        if self.data > 5:
            raise StopIteration
        else:
            self.data += 1
            return self.data
for i in Next(3):
    print(i)

输出结果是:
__next__ called
4
__next__ called
5
__next__ called
6
__next__ called

很简单把。唯一需要注意下的就是__next__中必须控制iterator的结束条件,不然就死循环了。
分享到:
评论
2 楼 rushwoo 2015-09-13  
这样就可以了:
   def next(self):
        print("__next__ called")
        if self.data > 5:
            raise StopIteration
        else:
            self.data += 1
            return self.data
       
是不是和版本有关系
1 楼 rushwoo 2015-09-13  
报错啊:
    for i in Next(3):
TypeError: iter() returned non-iterator of type 'Next'

相关推荐

    Python库 | mdf_iter-0.0.2-cp38-cp38-win32.whl

    标题中的“Python库 | mdf_iter-0.0.2-cp38-cp38-win32.whl”指的是一个特定版本的Python库——mdf_iter,版本号为0.0.2,专为Python 3.8(cp38)编译,并且适用于Windows 32位操作系统。这个库的安装文件格式是`....

    MOG-python.zip_MOG-python_mog_高斯模型_高斯模型 Python_高斯混合 python

    标签中的关键词包括“mog-python”,“mog”,“高斯模型”,“高斯模型_python”以及“高斯混合_python”,这些标签强调了MOG算法与Python语言的关联,以及高斯模型在其中的重要作用。 压缩包内的文件名如“iter_...

    使用高斯过程进行全局优化的Python实现。_Python_下载.zip

    在机器学习领域,全局优化是寻找复杂函数最优解的关键任务,尤其在参数调优、模型选择等场景中显得尤为重要。高斯过程(Gaussian Process,GP)是一种非参数概率模型,它提供了一种强大的框架来处理不确定性,并进行...

    res10_300x300_ssd_iter_140000_fp16.caffemodel 训练模型

    标题中的"res10_300x300_ssd_iter_140000_fp16.caffemodel"是指一个经过训练的深度学习模型,用于目标检测任务,特别是人脸检测。这个模型是基于Caffe框架实现的,Caffe是一种广泛使用的深度学习库,以其高效和速度...

    前端开源库-array-iter-next-crnt

    "array-iter-next-crnt"就是一个这样的库,专门针对数组操作,特别是迭代和跟踪当前项。这个库的核心功能是实现了一个迭代器,可以逐个获取数组中的元素,并在迭代过程中保持对当前项的记录。 在JavaScript中,`...

    PSO_python_pso算法_pso-python_粒子群算法python_

    for _ in range(max_iter): # 更新速度和位置 # ... (根据速度更新公式进行计算) # 检查并更新个人和全局最好位置 # ... # 打印当前全局最好位置的函数值 # ... return gbest, pbests ``` 这里的`...

    对python中的iter()函数与next()函数详解

    在Python编程语言中,`iter()`函数和`next()`函数是处理迭代操作的关键工具,尤其在遍历序列、集合和其他可迭代对象时。本文将详细解释这两个函数的工作原理及其在Python编程中的应用。 首先,`iter()`函数是用于将...

    res10_300x300_ssd_iter_140000_fp16.caffemodel、opencv_face_detector_uint8.pb

    在本篇中,我们将深入探讨这些模型的背景、用途以及与OpenCV的关系。 **Caffe模型:res10_300x300_ssd_iter_140000_fp16.caffemodel** `Caffe` 是一个广泛使用的深度学习框架,以其高效、速度和灵活性而闻名。这个...

    res10_300x300_ssd_iter_140000_fp16.7z

    标题“res10_300x300_ssd_iter_140000_fp16.7z”指的是一个人脸识别模型,该模型基于Caffe深度学习框架,并且经过了140,000次迭代的训练。模型的分辨率是300x300像素,表明它被设计用于处理这类尺寸的输入图像。"fp...

    python_XML-6-17.rar_python 文件_python xml_python读写xml_python读写xm

    本篇文章将详细探讨如何使用Python与XML文件进行交互。 首先,我们需要导入`xml.etree.ElementTree`模块,它是Python的标准库之一,提供了XML处理的API。这个模块包含了两个主要的类:`ElementTree`和`Element`。`...

    VGG_VOC0712_SSD_300x300_iter_120000.caffemodel

    VGG_VOC0712_SSD_300x300_iter_120000.caffemodel,caffe-SSD下已经训练好的VGG模型文件,希望对大家有所帮助。

    VGG_VOC0712_SSD_300x300_iter_120000.ckpt.zip

    在这个场景中,"VGG_VOC0712_SSD_300x300_iter_120000.ckpt.zip" 是一个包含了SSD模型训练成果的压缩文件,特别提到了SSD300,意味着该模型采用了300x300的输入尺寸。 SSD的主要创新在于它结合了预测固定大小边界框...

    python中使用k-means聚类.zip_k-means聚类算法_python_python 用kmeans_聚类_聚类 P

    在Python编程环境中,K-Means聚类是一种广泛使用的无监督机器学习算法,用于将数据集划分成不同的簇。这个算法基于一个简单的概念:通过迭代调整数据点的分类,使得同一簇内的数据点尽可能接近,而不同簇之间的数据...

    openpose官方模型库:pose_iter_xxxxxx.caffemodel

    pose_iter_584000.caffemodel) coco(pose_deploy_linevec.prototxt; pose_iter_440000.caffemodel) mpi(pose_deploy_linevec.prototxt; pose_deploy_linevec_faster_4_stages.prototxt; pose_iter_160000.caffe...

    res10_300x300_ssd_iter_140000.caffemodel与deploy.prototxt

    标题中的"res10_300x300_ssd_iter_140000.caffemodel"和"deploy.prototxt"是两个关键文件,它们在计算机视觉领域,特别是深度学习模型的训练和应用中扮演着重要角色。这两个文件通常与Caffe框架有关,一个深度学习...

    Shannon_Python香农编码_python_shannon_香农编码_

    使用`collections.Counter`类统计输入文本中各字符的出现次数。 ```python from collections import Counter def count_chars(text): return Counter(text) ``` 2. 构建哈夫曼树: 可以用两个队列`min_heap`...

    rpcaADMM-master_python_rpca_admm_源码

    在这个示例代码中,`admm_rpca`函数接受输入矩阵X、松弛参数rho和最大迭代次数max_iter。函数内部,我们首先初始化L和S为零矩阵,然后通过ADMM的三个步骤进行迭代更新。在每次迭代中,我们使用随机化奇异值分解...

    faceparsing_79999_iter.pth

    faceparsing_79999_iter.pth,人脸分割faceparsing的预训练模型,PyTorch版本。

    Python库 | tsne_mp-0.1.10-cp36-cp36m-macosx_10_9_x86_64.whl

    标签“python 开发语言 Python库”表明这是与Python编程语言相关的开发资源,`tsne_mp`库是Python社区中的一员,可以帮助开发者处理数据降维和可视化的问题。 综上所述,`tsne_mp`是一个优化过的Python库,专为并行...

Global site tag (gtag.js) - Google Analytics