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的id()函数解密过程
Dec 25 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
django静态文件加载的方法
May 20 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
python opencv读mp4视频的实例
Dec 07 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
详解Python牛顿插值法
May 11 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
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Django--权限Permissions的例子
2019/08/28 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
项目经理岗位职责
2013/11/11 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
承诺书怎么写
2014/03/26 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
会计求职信范文
2014/05/24 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
2016年寒假生活小结
2015/10/10 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
Redis数据同步之redis shake的实现方法
2022/04/21 Redis