有没有更深层的含义,为什么Python的sorted
被记录为采用可迭代(可能是无限的)而不是集合(已调整大小)?
例如,它将永远运行:
# DO NOT RUN
import itertools
for item in sorted(itertools.count()):
print(item)
我知道他们希望允许sorted
处理集合的可迭代对象,而不是集合本身,但是并没有根本的区别(也许反映在collections.abc
中)在保证引发StopIteration
的可迭代对象和可能是无限的可迭代对象之间?
答案 0 :(得分:4)
之所以这样记录是因为它没有利用__len__
来工作,尽管您是对的,因为它应该要求有限的Iterable
才有意义。请注意,与Iterable
相反,__len__
可以是有限的,但不支持Collection
。 Python并未在 finite 和 indefinite Iterable
之间进行明确区分。
考虑以下玩具示例:
x = iter(range(10, 0, -1))
len(x)
# TypeError: object of type 'range_iterator' has no len()
# BUT
y = sorted(x)
print(y)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:3)
它被记录为可迭代,因为它需要可迭代。它不仅限于收藏。只要是有限的,就可以用map
对sorted
迭代器进行排序。
当然,可迭代项必须是有限的,但这不是类型区别。同一可迭代类的不同实例可以是有限的或无限的。例如,某些生成器是有限的,而某些生成器是无限的。您无法为“有限可迭代”定义ABC。
文档可以更明确地说明有限性要求,也可以更明确地说明其他要求,例如<
是对输入元素或{{1 }}返回值。