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 相关文章推荐
Python标准库之sqlite3使用实例
Nov 25 Python
简单介绍Ruby中的CGI编程
Apr 10 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
Python logging设置和logger解析
Aug 28 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
python实现字符串和数字拼接
Mar 02 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
python with语句的原理与用法详解
Mar 30 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
python 如何设置守护进程
Oct 29 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
PHP数字格式化
2006/12/06 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
python实现根据图标提取分类应用程序实例
2014/09/28 Python
python requests.post带head和body的实例
2019/01/02 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
Python count函数使用方法实例解析
2020/03/23 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
毕业生的自我鉴定
2013/10/29 职场文书
就业推荐表自我鉴定
2013/10/29 职场文书
总经理司机岗位职责
2014/02/06 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android