在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函数,打印数据。

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

最新文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式
  2. Eclipse代码注释模板
  3. 方便的一站式svn/git服务器软件(linux)
  4. XAF学习笔记1
  5. C++基础(纯虚函数与抽象类)
  6. UIAutomator 编译
  7. js控制iframe跳转
  8. M面经Prepare: Find integer Average of 2 integers.
  9. Cordova调用Activity
  10. sublime 修改Xdebug插件快捷键
  11. linq分组查询
  12. 使用线程新建WPF窗体(公用进度条窗体)
  13. mysql用户权限分配及主从同步复制
  14. mysql的数据类型int、bigint、smallint 和 tinyint取值范围
  15. [oracle]Oracle角色管理
  16. 201521123094 《Java程序设计》第1周学习总结
  17. my dream
  18. Docker的介绍及安装
  19. VS2017离线版的SSDT安装包(包括SSIS)
  20. QT 应用程序测试

热门文章

  1. 反射调用DLL
  2. php的trie_filter扩展安装敏感词查找
  3. HTML5智能表单
  4. JS解决在提交form表单时某个值不存在 alter弹窗点确定不刷新界面
  5. pwnable.kr-input-witeup
  6. php hook编程机制
  7. 使用Spring Cache缓存出现的小失误
  8. CVTE C/C++开发工程师笔试题(一)
  9. 开发模型之V模型
  10. 解决Tomcat文件上传超时问题.