【问题标题】:Are containers always iterable?容器总是可迭代的吗?
【发布时间】:2019-11-21 04:50:12
【问题描述】:

根据这张图,是否存在容器不可迭代的情况?

【问题讨论】:

  • 从技术上讲,您可以自己实现一个不可迭代的容器......还是您指的是内置的抽象基类?
  • @Error-SyntacticalRemorse,内置?
  • 您可以自己创建一个容器类,但通常您从一个强制某些抽象方法的类如collections.abc.ImmutableObject(或类似的东西)继承。基本上,如果你从一个强制迭代的 ABC 继承,那么它肯定是可迭代的,但你不能总是假设第三方容器是可迭代的。
  • 要迭代的东西只有一个要求,它需要定义__iter__方法

标签: python containers iterable


【解决方案1】:

取决于你所说的总是是什么意思。根据collections.abc

  • 容器是实现__contains__方法的对象
  • 可迭代对象是实现__iter__(或__getitem__,作为后备)的对象

所以,理论上,不,您可以实现一个不可迭代的容器。但是,所有标准的 Python 容器(以及大多数由库实现的容器)也是可迭代的。

【讨论】:

    【解决方案2】:

    容器所做的只是为您提供if x in yif x not in y 语法。

    您可以像 Range(min: float, max: float) 那样实现 __contains__ 为范围内的任何数字返回 True,这将允许您编写 if 3.14 not in provided_range 等。这是不可迭代的。

    该图有点误导,暗示{list, set, dict} comprehension 是生产容器的唯一有趣事物。

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2018-02-06
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多