龙阴居士

博客园 首页 新随笔 联系 订阅 管理

在Python的基础知识当中,对于类实现可迭代功能有了一种新的方式,而这种方式则有别于我们学.NET等其他高级语言。

在Python当中,目前常用的有两种方式来实现这种迭代器的返回:__iter__ 方式和 __getitem__方式,而这两种方式的区别也很简单明了:

1. __iter__方式返回的是一种可供for这样迭代访问的对象;

2. __getitem__ 方式返回的是可以使用下标方式来对数组、元组访问的对象。

举例说明:

class FibArray:
  def __init__(self):
    self._1, self._2 = 0, 1   

  def __iter__(self):
    return self

  def __next__(self):
  #在执行第一次迭代的时候,先调用一次__next__返回第一个数据。
  #所以,虽然在下面FibArray()是一个类的实例,但是其也是根据类的行为返回一个迭代对象
    self._1, self._2 = self._2, self._1 + self._2
    if self._1 > 100:
      raise StopIteration()
    return self._1

for i in FibArray():
  print(i)

  

输出为:

在此实例当中,有一个对于初学者来说非常难以理解的一点: for i in FibArray(),就对于学过C#和Java语言的同学来说,类名后面跟一个括号这样是一个类的实例化,也就是一个对象,为何能用在这呢?

其实我们可以这样简单的理解就可以了:在for这个语句当中,for是用来迭代的,其访问的对象应该是一个类的迭代器。在FibArray被实例化的时候,根据上下文及内部定义的函数,自动的返回了一个迭代器对象参于到for运算当中。

def __iter__(self):   这句标明了这是一个可迭代的类。def __next__(self):则为迭代去准备数据。

实际当程序执行到for语句时执行的步骤为:

1. FibArray.__init__ 构造函数;

2. FibArray.__iter__ 标志函数,处理迭代器的初步工作;

3. FibArray.__next__ 函数,准备数据返回;

4. print函数;

5. FibArray.__next__ 函数,准备数据返回;

.......

而__getitem__ 则简单的多,而且一般情况下也是一次性的返回到对象当中。如下所示:

class Fib:
    def __getitem__(self, n):
        a, b = 1, 1
        for i in range(n):
            a, b = b, a + b
        return a

f = Fib()
print(f[5])

程序的运行步骤为:

1. 运行至print函数;

2. 调用Fib类的__getitem__函数,并一次性完成数据的处理,返回数据;

3. 传递给print函数,打印数据。

 

在理解了其不同的工作原理之后,我们才能对症下药,在不同的场合下面应用不同的场景与方法。

 

posted on 2017-11-22 21:34  李伟  阅读(164)  评论(0编辑  收藏  举报