zoukankan      html  css  js  c++  java
  • python 迭代器

      这里只讨论一个特殊的方法——__iter__,这个方法是迭代器规则的基础

      迭代器规则

      迭代的意思就是重复做一些事很多次——就像在循环中做的那样。到现在为止只是在for循环中对序列和字典进行迭代,但实际上也能对其他的对象进行迭代:实现__iter__方法的对象。

      __iter__方法返回一个迭代器,所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。

      注意:迭代器规则在Python3.0中有一些变化。在新的规则中,迭代器对象应该实现__next__方法,而不是next。而新的内建函数next可以用于访问这个方法。换句话说,next(it)等同于3.0之前版本中的 it.next()

      迭代规则的关键是什么?为什么不使用列表?因为列表的杀伤力太大。如果有可以一个接一个地计算值的函数,那么在使用时可能是计算一个值时获取一个值——而不是通过列表一次性获取所有值。如果有很多值,列表就会占用太多的内存。但还有其他理由:使用迭代器更通用、更简单、更优雅。下面看看一个不用列表的例子。

      这里的“列表”是一个斐波那契数列。使用迭代器如下:

     1 In [37]: class Fibs:
    2 ....: def __init__(self):
    3 ....: self.a = 0
    4 ....: self.b = 1
    5 ....: def next(self):
    6 ....: self.a, self.b = self.b, self.a+self.b
    7 ....: return self.a
    8 ....: def __iter__(self):
    9 ....: return self
    10 ....:

      注意,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身。在很多情况下,__iter__会放到其他的会在for循环中使用的对象中。这样一来,程序就能返回所需的迭代器。此外,推荐使迭代器实现它自己的__iter__方法,然后就能直接在for循环中使用迭代其本身了。

      注意:正式的说法是,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

     1 In [38]: fibs = Fibs()
    2
    3 In [39]: for i in fibs:
    4 ....: if i < 100:
    5 ....: print i
    6 ....:
    7 1
    8 1
    9 2
    10 3
    11 5
    12 8
    13 13
    14 21
    15 34
    16 55
    17 89




  • 相关阅读:
    Java 多线程概述
    Java 线程的创建和启动
    状态模式
    Spring 依赖注入
    Spring IOC
    在JavaEE中使用Mybatis框架
    Active Reports 补空白行
    SpreadForWin 清空Sheet
    日期格式转换
    Select Case 的实现
  • 原文地址:https://www.cnblogs.com/skyhacker/p/2336382.html
Copyright © 2011-2022 走看看