python中的__iter__ __reversed__ __next__
__reversed__ 返回集合的倒叙迭代器,如果没有实现这个方法,reversed()会去使用__getitem__和__len__来实现
介绍__next__和 __iter__方法需要了解下可迭代对象(iterable)和迭代器(iterator):
标准的迭代器都有两个方法__next__和__iter__:
__next__ 返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常
__iter__ 返回self
什么是可迭代对象:
如果对象实现了__iter__方法,那么对象就是可迭代的。python中的序列都可以迭代。如果没有实现__iter__,实现了__getitem__ 方法,而且参数是从零开始的索引,这种对象也可以迭代。
迭代器和可迭代对象的关系:
python从可迭代对象中获取迭代器(可迭代对象---iter()--->迭代器---next()--->值)
In [9]: a=(1,2,3)
In [10]: type(a)
Out[10]: tuple
In [11]: b=iter(a)
In [12]: type(b)
Out[12]: tuple_iterator
In [13]: a=[1,2,3]
In [14]: type(a)
Out[14]: list
In [15]: b=iter(a)
In [16]: type(b)
Out[16]: list_iterator
In [20]: while True:
...: try:
...: print(next(b))
...: except StopIteration:
...: break
...:
1
2
3
也可以使用for来做,上面的异常python已经内部自动处理:
In [3]: for i in b:
...: print(i)
...:
1
2
3
例子:定义一个可迭代对象和迭代器
from random import choice
class TmptestIterator:
def __iter__(self):
return self
def __next__(self):
tmp=choice([i for i in range(10)])
if tmp == 5:
raise StopIteration
return tmp class TemTest:
def __iter__(self):
return TmptestIterator()
a=TemTest()
print(TmptestIterator,TemTest)
for i in a:
print (i) <class '__main__.TmptestIterator'> <class '__main__.TemTest'>
6
1
1
2
2
2
1
3
参考:https://docs.python.org/3/library/stdtypes.html#container.__iter__()
python中的__iter__ __reversed__ __next__的更多相关文章
- 《python解释器源码剖析》第7章--python中的set对象
7.0 序 集合和字典一样,都是性能非常高效的数据结构,性能高效的原因就在于底层使用了哈希表.因此集合和字典的原理本质上是一样的,都是把值映射成索引,通过索引去查找. 7.1 PySetObject ...
- python中那些双下划线开头得函数和变量--转载
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...
- python python中那些双下划线开头的那些函数都是干啥用用的
1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...
- python中那些双下划线开头得函数和变量
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...
- python中的迭代器与生成器
迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...
- Python中的生成器与yield
对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...
- python中使用zip函数出现<zip object at 0x02A9E418>
在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zip方 ...
- 12.python中的列表
先看列表是如何创建的: a = ['scolia', 123] b = list('scolia',123) 同样有两种创建方式,但一般用第一种. 列表和元祖最大的不同就是列表是可以修改的. 老规矩, ...
- python中__dict__和dir()
转自:http://www.cnblogs.com/ifantastic/p/3768415.html 首先需要知道的是,dir() 是 Python 提供的一个 API 函数,dir() 函数会自动 ...
随机推荐
- pytorch 对变长序列的处理
一开始写这篇随笔的时候还没有了解到 Dateloader有一个 collate_fn 的参数,通过定义一个collate_fn 函数,其实很多batch补齐到当前batch最长的操作可以放在colla ...
- [咸恩静][Real Love]
歌词来源:http://music.163.com/#/song?id=484056972 作曲 : Andrew 崔/Brian Cho/220 [作曲 : Andrew 崔/Brian Cho/2 ...
- Vue.js 相关知识(路由)
1. 简介 路由,工作原理与路由器相似(路由器将网线总线的IP分发到每一台设备上),Vue中的路由根据用户在网页中的点击,将其引导到对应的页面. 2. 使用步骤 安装vue-router或者直接引入v ...
- PAT甲题题解-1068. Find More Coins (30)-dp,01背包
一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...
- Javascript中Base64编码解码的使用实例
Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...
- Sprint第二个计划
一.现状 现在是冲刺的第二个阶段了,我们的进度还是一样,没有太大的进展.所以这一个阶段应该加紧进度,好好学习别的组,弥补我们组的不足.一开始我们是打算用原来的初级APP,然后再补充一些新的内容.可是现 ...
- Beta 冲刺 五
团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 昨天的困难 数据交换比较复杂 ...
- 【转载】Activiti delete process definition by key
http://blog.csdn.net/zwk626542417/article/details/46602419 @RequestMapping(value = "deleteProce ...
- 八大排序算法的python实现
# -*- coding: utf-8 -*- # 冒泡排序 def bubble_sort(nums): i = 1 exchanged = True while i < len(nums) ...
- Python网络编程:IO多路复用
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...