python进阶之自定义可迭代的类


Posted in Python onAugust 20, 2019

自定义可迭代的类

列表可以获取列表的长度,然后使用变量i对列表索引进行循环,也可以获取集合的所有元素,且容易理解。没错,使用列表的代码是容易理解,也很好操作,但这是要付出代价的。列表之所以可以用索引来快速定位其中的任何一个元素,是因为列表是一下子将所有的数据都装载在内存中,而且是一块连续的内存空间。当数据量比较小时,实现比较容易;当数据量非常大时,会非常消耗内存资源。而迭代就不同,迭代是读取多少元素,就将多少元素装载到内存中,不读取就不装载。这有点像处理XML的两种方式:DOM和SAX。DOM是一下子将所有的XML数据都装载到内存中,所以可以快速定位任何一个元素,但代价是消耗内存;而SAX是顺序读取XML文档,没读到的XML文档内容是不会装载到内存中的,所以SAX比较节省内存,但只能从前向后的顺序读取XML文档的内容。

如果在一个类中定义__iter__方法,那么这个类的实例就是一个迭代器。 __iter__方法需要返回一个迭代器,所以就返回对象本身即可(也就是self)。当对象每迭代一次时,就会调用迭代器中的另外一个特殊成员方法__next__ 。该方法需要返回当前迭代的结果。下面先看一个简单的例子,在这个例子中,通过自定义迭代器对由星号*组成的直三角形的每一行进行迭代,然后通过for循环进行迭代,输出一定行数的直角三角形。

# 可无限迭代直角三角形的行
class righttriangle:
  def __init__(self):
    # 定义一个变量n,表示当前的行数
    self.n = 1
  def __next__(self):
    # 通过字符串的乘法获取直接三角形每一行的字符串,每一行字符串的长度是2 * n -1
    result = '*' * (2 * self.n - 1)
    # 行数加1
    self.n += 1
    return result
  # 该方法必须返回一个迭代器
  def __iter__(self):
    return self

rt = righttriangle()
# 对迭代器进行迭代
for e in rt:
  # 限制输出行的长度不能大于20,否则将会无限输出行
  if len(e) > 20:
    break
  print(e)

输出结果:

*
***
*****
*******
*********
***********
*************
***************
*****************
*******************

[例10.10] 现在来看一个更有意思的例子,在这个例子中定义了一个迭代器类(Fibonacci),用于无限制迭代斐波那契数列。

# 可以无限制迭代斐波那契数列
class Fibonacci:
  # 在构造方法中定义两个变量a和b,用来表示斐波那契数列的最开始的两个值
  def __init__(self):
    self.a = 0
    self.b = 1
  def __next__(self):
    # self.a就是当前要迭代的值
    result = self.a
    # 计算斐波那契数列的下一个值,并将a变成原来的b,将b变成下一个值
    self.a, self.b = self.b, self.a + self.b
    # 返回当前迭代的值
    return result
  # 该方法必须返回一个迭代器
  def __iter__(self):
    return self

fibs = Fibonacci()
# 对斐波那契数列进行迭代
for fib in fibs:
  print(fib,end = ' ')
  # 迭代的值不能超过500
  if fib > 500:
    break

输出结果:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现简单的TCP代理服务器
Oct 08 Python
python3实现名片管理系统
Nov 29 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
pycharm 安装JPype的教程
Aug 08 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
通过自学python能找到工作吗
Jun 21 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
python中super()函数的理解与基本使用
Aug 30 Python
Python pyecharts绘制条形图详解
Apr 02 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 #Python
django中使用POST方法获取POST数据
Aug 20 #Python
python实现猜拳小游戏
Apr 05 #Python
django 自定义filter 判断if var in list的例子
Aug 20 #Python
python并发编程多进程 模拟抢票实现过程
Aug 20 #Python
python3的数据类型及数据类型转换实例详解
Aug 20 #Python
Python列表的切片实例讲解
Aug 20 #Python
You might like
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
日期 时间js控件
2009/05/07 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python写入文件自动换行问题的方法
2019/07/05 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
阳光体育活动方案
2014/02/16 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
公司新年寄语
2014/04/04 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python