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实现的数据结构与算法之快速排序详解
Apr 22 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Python中函数参数匹配模型详解
Jun 09 Python
python logging模块的使用总结
Jul 09 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
解决Django no such table: django_session的问题
Apr 07 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
Python页面加载的等待方式总结
Feb 28 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php+mysql分页代码详解
2008/03/27 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
python海龟绘图实例教程
2014/07/24 Python
用Python实现一个简单的线程池
2015/04/07 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python PIL库图片灰化处理
2020/04/07 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Pycharm安装python库的方法
2020/11/24 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
数控技术应用个人求职信范文
2014/02/03 职场文书
员工拓展培训方案
2014/02/15 职场文书
学员自我鉴定
2014/03/19 职场文书
询价采购方案
2014/06/09 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
员工工作表现自我评价
2015/03/06 职场文书
基石观后感
2015/06/12 职场文书
《落花生》教学反思
2016/02/16 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记