Python for循环与getitem的关系详解


Posted in Python onJanuary 02, 2020

这篇文章主要介绍了Python for循环与getitem的关系详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一个类里面如果由__iter__for循环就是找它取,没有的话就会找__getitem__

前面一笔看过没有留心具体的执行情况。

In [169]: class Foo:
   ...:   def __getitem__(self, pos):
   ...:     print(pos)
   ...:     return range(10)[pos]
   ...:
In [172]: for i in f:
   ...:   ...
   ...:   
   ...:                                             
0
1
2
3
4
5
6
7
8
9
10

从代码可以看出,如果没有报错或者设置显式的条件,这个for循环会无线循环。

我现在设置一个显式的设置。

In [173]: class Foo:
   ...:   def __getitem__(self, pos):
   ...:     if pos >5:
   ...:       raise StopIteration
   ...:     print(pos)
   ...:     return range(10)[pos]
   ...:
In [177]: for i in f:
   ...:   ...
   ...:                                             
0
1
2
3
4
5

将错误设置为IndexError也可以执行,但TypeError就不行了。

...:   def __getitem__(self, pos):
   ...:     if pos >5:
   ...:       raise IndexError
   ...:     print(pos)
   ...:     return range(10)[pos]
   ...:                                             
 
In [182]:                                             
 
In [182]: f = Foo()                                        
 
In [183]: for i in f:
   ...:   ...
   ...:                                             
0
1
2
3
4
5

如果用list去运行这个参数会把返回的一个一个元素,装入列表当中:

In [184]: list(f)                                         
0
1
2
3
4
5
Out[184]: [0, 1, 2, 3, 4, 5]

只有__getitem__的类的实例是属于可迭代对象,但用isinstances测试collections.Iterable是不能通过的,书后面介绍可以通过iter函数来测试,如果没报错就说明是可迭代对象,然后生成一个没有__next__属性的迭代器。

In [185]: from collections import Iterable                            
In [186]: isinstance(f, Iterable)                                 
Out[186]: False
 
In [187]: iter(f)                                         
Out[187]: <iterator at 0x114f2be50>
dir(f)                                         
Out[189]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

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

Python 相关文章推荐
Windows系统下安装Python的SSH模块教程
Feb 05 Python
简单的Python的curses库使用教程
Apr 11 Python
使用Python压缩和解压缩zip文件的教程
May 06 Python
python的unittest测试类代码实例
Dec 07 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
Python3处理HTTP请求的实例
May 10 Python
Python中判断输入是否为数字的实现代码
May 26 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
python实现双色球随机选号
Jan 01 #Python
PyTorch实现更新部分网络,其他不更新
Dec 31 #Python
pytorch中的transforms模块实例详解
Dec 31 #Python
Pytorch 实现权重初始化
Dec 31 #Python
pytorch 归一化与反归一化实例
Dec 31 #Python
Pytorch 数据加载与数据预处理方式
Dec 31 #Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 #Python
You might like
长波知识介绍
2021/03/01 无线电
基于mysql的bbs设计(四)
2006/10/09 PHP
php中的登陆login实例代码
2016/06/20 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
陈欧的广告词
2014/03/18 职场文书
暑假学习心得体会
2014/09/02 职场文书
新员工考核评语
2014/12/31 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
关于五一放假的通知
2015/08/18 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers