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中常用操作字符串的函数与方法总结
Feb 04 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
python实现二叉查找树实例代码
Feb 08 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
python实现简单图片物体标注工具
Mar 18 Python
Python3字符串encode与decode的讲解
Apr 02 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python数据分析:关键字提取方式
Feb 24 Python
python boto和boto3操作bucket的示例
Oct 30 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中的integer类型使用分析
2010/07/27 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
页面使用密码保护代码
2013/04/10 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
python环境下安装opencv库的方法
2020/03/05 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
python数据抓取3种方法总结
2021/02/07 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
几个Linux面试题笔试题
2016/08/01 面试题
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
初中生操行评语大全
2014/04/24 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript