本文主要探讨下列三种方法:

object.__iter__(self)

此方法在需要为容器创建迭代器时被调用。此方法应该返回一个新的迭代器对象,它能够逐个迭代容器中的所有对象。对于映射,它应该逐个迭代容器中的键。

迭代器对象也需要实现此方法;它们需要返回对象自身。

object.__reversed__(self)

此方法(如果存在)会被 reversed内置函数调用以实现逆向迭代。它应当返回一个新的以逆序逐个迭代容器内所有对象的迭代器对象。

object.__next__(self)

从容器中返回下一项。 如果已经没有项可返回,则会引发 StopIteration 异常。

iter 与 next

例子

class MyNumbers:

def __init__(self):

pass

def __iter__(self):

self.a=0

return self

def __next__(self):

x=self.a+1

if self.a>=5:

raise StopIteration

self.a+=1

return x

myclass = MyNumbers()

myiter = iter(myclass)

for x in myiter:

print(x)

运行结果

1

2

3

4

5

reversed与next

代码如下:

class MyNumbers:

def __init__(self):

pass

def __reversed__(self):

self.a=0

return self

def __next__(self):

x=5-self.a

if self.a>=5:

raise StopIteration

self.a+=1

return x

myclass = MyNumbers()

myrv=reversed(myclass)

print(next(myrv))

print(next(myrv))

print(next(myrv))

print(next(myrv))

print(next(myrv))

# 以下代码不能运行,会报错

# TypeError: 'MyNumbers' object is not iterable

# for i in myrv:

# print(i)

返回结果

5

4

3

2

1

为什么用 for in 的方法会报错呢?

主要因为in后面要跟迭代器,而该类没有实现迭代器的方法,即iter。当直接使用next() 方法时,会调用类中的函数next,所以不会报错 。当然,你也可以在reversed函数中,生成所需要的迭代器并返回,这样就可以使用for in这种遍历方法 。

iter、reversed和next

class MyNumbers:

def __init__(self):

self.flag=True

pass

def __iter__(self):

self.a=0

return self

def __reversed__(self):

self.a=0

self.flag=not self.flag

return self

def __next__(self):

if self.flag:

x=self.a+1

if self.a>=5:

raise StopIteration

else:

x=5-self.a

if self.a>=5:

raise StopIteration

self.a+=1

return x

myclass = MyNumbers()

myiter = iter(myclass)

print('iter-next')

for x in myiter:

print(x)

print('reversed-next')

myrv=reversed(myclass)

print(next(myrv))

print(next(myrv))

print(next(myrv))

print(next(myrv))

print(next(myrv))

print('reversed-reversed')

myrv=reversed(myclass)

for i in myrv:

print(i)

运行结果

iter-next

1

2

3

4

5

reversed-next

5

4

3

2

1

reversed-reversed

1

2

3

4

5

本例中直接实现了iter和reversed 两种方法。主要设置一个标志位,通过reversed改变标志位来设置是正序输出还是反序输出,通过多次调用reversed可以进行反转。

在执行for in前执行reversed的时候实现调用顺序是reversed->iter->next->next->...

python中reversed函数_Python 的iter、reversed、next内置函数探讨相关推荐

  1. python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...

    python重要的几个内置函数用法 python内置函数什么用忘不掉的是回忆,继续的是生活,错过的,就当是路过吧.来来往往身边出现很多人,总有一个位置,一直没有变.看看温暖的阳光,偶尔还是会想一想. ...

  2. python拟合三元函数_python基础教程之常用内置函数、三元运算、递归

    目录 常用内置函数 abs/round/sum eval/exec enumerate max/min sorted zip map filter 补充:reduce lambda 初识递归 再谈递归 ...

  3. python len函数_Python 初学者必备的常用内置函数

    Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间.目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很常见,这里 ...

  4. inrange函数_Python 初学者必备的常用内置函数

    本文纲要 Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间.目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很 ...

  5. python字典经典例题_python 字典(Dictionary)的一些内置函数和经典例题

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 修改字典 向字典添加新 ...

  6. python用psf函数_python学习之-类的内置函数

    内置方法:__str__(该方法必须返回字符串类型),在对像被打印时自动触发,然后将该方法的返回值当做打印结果输出) class People: def __init__(self,name,age) ...

  7. python求最小值不能使用min和sotred_python基础——内置函数

    python基础--内置函数  一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highl ...

  8. python 倒叙 数组_Python函数合集:68个内置函数请收好!

    内置函数就是python给你提供的, 拿来直接用的函数,比如print.,input等.截止到python版本3.6.2 python一共提供了68个内置函数. #68个内置函数 # abs() di ...

  9. python我想对你说_python学习第12天----内置函数

    1.内置函数 python解释器提供的,直接可以使用的函数,如print,input等 1)作业域相关 ①globals() 以字典的类型返回全部局部变量 ②locals()   以字典的类型返回当前 ...

  10. python lambda 逻辑_Python之lambda表达式和内置函数

    lambda表达式其实就是简化的函数表达式. 它只用于处理简单逻辑, 它会自动return数据 通常定义一个函数,按照以下形式:def func(arg): return arg +1 result ...

最新文章

  1. labview曲线上两点画延长线_教你用直尺画各种几何图形
  2. OFBiz + Opentaps 目录管理 四. 产品(四)礼券
  3. CentOS TinyProxy http(s)上网代理及置代理上网的方法
  4. 【POJ 3276】【开关问题】Face The Right Way【暑期 No.4】
  5. LCD1602芯片的使用——简单易懂
  6. caxa发生文件读写异常_CAXA电子图板出错解决方法
  7. FPGA基础入门【14】开发板VGA视频输出控制
  8. rtl8188linux内核配置,Embeded linux之RTL8188EU/RTL8188ETV使用
  9. eps提取高程点在哪里_只需一个命令,就能提取CAD图纸所有高程点坐标,感觉学费白交了...
  10. Typescript泛型与implements子句
  11. Linux 交换分区
  12. 写一个strncpy(char *dest, const char *src, size_t cpy_lent) 的函数
  13. 树莓派 人体感应器HC-SR501的应用
  14. 打印机故障处理【以MP 3054sp 打印机为例】
  15. 木瓜移动:从KOL到内容营销,出海品牌如何争夺流量新战场
  16. 校园网络的规划与实施(思科)
  17. Python实现模拟按键刷搜狗拼音输入法字数
  18. 3DMark 2005 Build 120
  19. 电源特性测试测试哪些方面?电源特性自动测试系统NSAT-8000介绍
  20. 【线下沙龙】如何用项目管理的思维经营自己的生活

热门文章

  1. python分布式心跳程序选型及实现
  2. 数组状态将在iOS 12 Safari中缓存。这是一个错误或功能吗?
  3. 云原生的C语言代码?
  4. 【EDA实验一】Quartus II 软件和 DE2-115 开发板 使用入门实验
  5. 喜忧参半的AI,“裸奔”之下的隐私焦虑 1
  6. [洛谷 OJ]P1015 回文数
  7. Binding表达式虽然同是mode two way写的位置不同效果不同
  8. nvm 查看所有可以下载node的版本
  9. [转] 数学英语词汇
  10. ElasticSearch实战踩坑记录