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

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

Python基础知识当中容易混淆的几个知识点的更多相关文章

  1. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  2. python基础知识(二)

    以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍

  3. python 基础知识(一)

    python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  4. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. python 爬虫与数据可视化--python基础知识

    摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...

  7. python基础知识小结-运维笔记

    接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...

  8. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

  9. Python基础知识(Basic knowledge)

    Python基础知识(Basic knowledge) 1.认识Python&基础环境搭建 2.Python基础(上) 3.Python基础(中) 4.Python基础(下) 5.Python ...

随机推荐

  1. 搭建vue脚手架

    1.Node.js安装 1.1下载安装 在node.js 官网下载, 根据自己电脑系统安装,一直点下一步即可 1.2测试安装是否成功 Windows+R打开cmd窗口,输入node -v回车出现版本号 ...

  2. laravel view not found

    在windows开发的laravel项目,部署到Linux服务器找不到视图,代码格式可能是这样的 return view('news\list'); 原因是在Linux下不能识别反斜杠路径,解决办法是 ...

  3. airTest 应用到项目并优化

    之前已经介绍了airTest的原理,该文主要指引大家能够将airTest框架应用到具体的测试项目当中去. 首先要考虑的是: 1. 你是用airTest 去做什么自动化 (android, ios, w ...

  4. shell的 ls命令

    Linux下shell 的 ls 命令 ls -d 显示当前目录的上层目录,不显示子目录 ls -a 显示当前目录下的所有子目录,包括隐藏的文件 ls -l 显示当前目录下所有文件的所有信息(除隐藏文 ...

  5. vue的搭建项目

    请求的封装,先在src下面创建一个utils的文件夹,文件夹里面有ajax.js loading.js index.js to 1 请求的封装 ajax文件 需要引入的文件在后面 /* * [page ...

  6. ELT(数据仓库技术) 学习

    ETL工具比较: https://blog.csdn.net/wjandy0211/article/details/78611801 ETL之kettle使用总结:(批量.含常量)csv入库: htt ...

  7. python 获取流文件 大小

    buffer_file_content=u"流文件内容" file_size = len(buffer_file_content)/ #kb

  8. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

  9. 使用串口安装centos操作系统

    https://linuxconfig.org/how-to-force-text-mode-installation-of-redhat-linux https://www.centos.org/f ...

  10. 新手必备的Linux知识

    测试人员为什么学习linux? 对于软件测试人员来说,我们测试的任何产品都是基于操作系统.比如我们每天都在使用的QQ软件,它有windows.ios.Android.Mac OS等版本,需要把QQ安装 ...