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下的多进程编程
Apr 28 Python
深入解析Python设计模式编程中建造者模式的使用
Mar 02 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python实现滑雪者小游戏
Feb 22 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
pycharm配置QtDesigner的超详细方法
Jan 25 Python
jupyter notebook指定启动目录的方法
Mar 02 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调用mysql存储过程
2007/02/14 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
js使用递归解析xml
2014/12/12 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python的中异常处理机制
2018/08/30 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
python代码能做成软件吗
2020/07/24 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
知识竞赛主持词
2014/03/26 职场文书
创先争优一句话承诺
2014/05/29 职场文书
道路施工安全责任书
2014/07/24 职场文书
个人委托书范文
2015/01/28 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
Hive HQL支持2种查询语句风格
2022/06/25 数据库