zoukankan      html  css  js  c++  java
  • python 中的 __getitem__, __iter__ 和__next__

    首先先简单介绍一下这几个内建函数:

    __getitem__:根据传入的int参数,返回一个列表中的元素

    __iter__:返回一个可迭代对象

    __next__:当被迭代时,返回下一个迭代的对象

    查了点资料,来源:知乎 链接:https://www.zhihu.com/question/44015086/answer/119281039 作者:灵剑

      这是个和多态有关的问题,Python中关于迭代有两个概念,第一个是Iterable,第二个是Iterator,协议规定Iterable的__iter__方法会返回一个Iterator, Iterator的__next__方法(Python 2里是next)会返回下一个迭代对象,如果迭代结束则抛出StopIteration异常。
    同时,Iterator自己也是一种Iterable,所以也需要实现Iterable的接口,也就是__iter__,这样在for当中两者都可以使用。
    我的理解是,如果这个对象被for时,会首先调用__iter__方法返回一个iterator,然后再对这个iterator循环调用__next__方法,直到碰到StopIteration时则停止退出
     
    如果for的对象没有__iter__方法,则无法获得一个迭代器,那么就会报错,但是,如果这个类实现了__getitem__方法,会从0开始依次读取相应的下标,直到发生IndexError为止,str类就没有实现了_iter_方法,所以我们可以for一个str对象,让它的每一个字母都打印输出,接下来附一个经典的FIB类增加理解:
     
    class Fib(object):
    def __init__(self):
    self.a = 0
    self.b = 1

    def next(self):
    self.a , self.b = self.b , self.a + self.b
    if self.b > 1000:
      raise StopIteration
    return self.a

    def __iter__(self):
    return self
  • 相关阅读:
    linux查看存储盘
    aix中hd5对应什么设备?
    (转)Python 操作 Windows 粘贴板
    eclipse非主窗口的停靠(正常), 恢复, 最小化, 最大化的切换
    (转)HTML5 本地数据库(SQLite) 示例
    [译] 如何像 Python 高手一样编程?
    scrapy递归下载网站
    eclipse快捷键以及使用技巧大全
    python任意编码转utf8或者unicode
    apache快速配置简易网站
  • 原文地址:https://www.cnblogs.com/Rubick7/p/8303685.html
Copyright © 2011-2022 走看看