python进阶之自定义可迭代的类
作者:python进阶之路 发布时间:2022-09-20 10:18:48
标签:python,迭代,类
自定义可迭代的类
列表可以获取列表的长度,然后使用变量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
来源:https://blog.csdn.net/weixin_45086637/article/details/92798483


猜你喜欢
- 版本一conda install xxx:这种方式安装的库都会放在/Users/orion-orion/miniforge3/pkgs目录下
- 1. composer 安装 PDF组件composer require setasign/fpdicomposer require set
- 自动上次ymPrompt组件发布,自己就曾发现在IE8下遮罩的半透明滤镜有时无效的问题,后来也有网友提出过这个问题,但自己一直也没有太多关注
- go简单代码反汇编用简单的代码用以分析go的调用约定及多返回值的返回方式。package mainfunc vals(c, d int) (
- 读写文件首先看一个例子:f = open('thefile.txt','w') #以写方式打开,
- 需求描述制作一个H5页面,打开之后可以录音,并将录音文件提交至后台微信录音最长时长为1min微信官方文档--音频接口代码如下 /
- 一、模板图像处理(1)灰度图、二值图转化template = cv2.imread('C:/Users/bwy/Desktop/nu
- python 3.3 下载固定链接文件并保存。import urllib.requestprint ("downloading w
- 本文实例讲述了Python实现按中文排序的方法。分享给大家供大家参考,具体如下:安装中文库sudo apt-get updatesudo a
- 1、myisamchk 使用 myisamchk 必须暂时停止 MySQL 服务器。例如,我们要检修 discuz 数据库。执行以下操作:
- 在之前得文章中我们说过,如果使用delete对数据库中得表进行删除,那么只是把记录删除掉,并且id的值还会保持上次的状态。即删除之前如果有四
- 首先.还是看效果.实现对文本域textarea中文字字数的限制。然后.米了...看文件.里面写的很清楚了.下面这个是单独的效果..提示用al
- 此程序主要是针对某个目录下的全部文件进行筛选,会删除重复的文件。原理很简单,会计算每个文件的哈希,将哈希存入一个字典,文件名对应哈希。imp
- 本文实例讲述了python实现同时给多个变量赋值的方法。分享给大家供大家参考。具体分析如下:python中可以同时给多个变量赋值,下面列举了
- 我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。
- 引言使用python接口来运行caffe程序,主要的原因是python非常容易可视化。所以不推荐大家在命令行下面运行python程序。如果非
- 语法结构: 1. Cast 语法结构:CAST ( expression AS data_type [ ( length ) ] ) 2.
- memoryview() 函数返回给定参数的内存查看对象(Momory view)。语法memoryview 语法:memoryview(o
- 因需要在mysql的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的mysql函数,可以有效的从字符串中提取出数字
- 前言如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。starting the server失败,通常是因为上次安装的该软