• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python for循环与getitem的关系详解

python 搞代码 4年前 (2022-01-08) 20次浏览 已收录 0个评论

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

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

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

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

 In [169]: class Foo: ...:   def __getitem__(self, pos): ...:     print(pos) ...:     return range(10)[pos] ...:  <br />
 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] ...: <br />
 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]: 
 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 fo来源[email protected]搞@^&代*@码网r循环与getitem的关系详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python for循环与getitem的关系详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址