Python 为什么首先要将iterable对象转换为迭代器?
我在Python standardlib的Python 为什么首先要将iterable对象转换为迭代器?,python,iterator,Python,Iterator,我在Python standardlib的heapq.nlargest()中看到了如下代码: if n == 1: it = iter(iterable) sentinel = object() if key is None: result = max(it, default=sentinel) else: result = max(it, default=sentinel, key=key) return [] if re
heapq.nlargest()中看到了如下代码:
if n == 1:
it = iter(iterable)
sentinel = object()
if key is None:
result = max(it, default=sentinel)
else:
result = max(it, default=sentinel, key=key)
return [] if result is sentinel else [result]
它首先通过iter()
将iterable
转换为It
,然后通过max()
函数传递参数It
从It
获取最大值
为什么不直接使用iterable对象呢?我没有意识到有什么好处吗?在显示的代码中,it=iter(iterable)
没有好处,应该删除该行max
在第一个参数上调用iter()
(或C等价物),使原始调用完全冗余
在某些情况下,它是有用的,例如迭代器只在几个步骤中使用了一部分。在一个精心设计的示例中,您可能需要第一个值,然后是3之后的所有值。这演示了如何使用next
获取一个值,一个for
循环消耗更多的值,最后传递给另一个函数/类消耗剩余的值。请注意,如果没有值,next
将引发StopIteration
,但即使迭代器已耗尽,其他两个也可以正常工作
iterable = [1,2,3,4,5]
it = iter(iterable)
first = next(it)
for x in it:
if x == 3:
break
final = list(it)
print(first, final)
在显示的代码中,
it=iter(iterable)
没有任何好处,应该删除该行max
在第一个参数上调用iter()
(或C等价物),使原始调用完全冗余
在某些情况下,它是有用的,例如迭代器只在几个步骤中使用了一部分。在一个精心设计的示例中,您可能需要第一个值,然后是3之后的所有值。这演示了如何使用next
获取一个值,一个for
循环消耗更多的值,最后传递给另一个函数/类消耗剩余的值。请注意,如果没有值,next
将引发StopIteration
,但即使迭代器已耗尽,其他两个也可以正常工作
iterable = [1,2,3,4,5]
it = iter(iterable)
first = next(it)
for x in it:
if x == 3:
break
final = list(it)
print(first, final)
在当前代码中,没有优势。只要将
iterable
直接传递到max
中,就可以安全地删除该行
我认为这只是早期实现的残余,它使用了islice
:
# Short-cut for n==1 is to use max() when len(iterable)>0
if n == 1:
it = iter(iterable)
head = list(islice(it, 1))
if not head:
return []
if key is None:
return [max(chain(head, it))]
return [max(chain(head, it), key=key)]
这是我的。在以后的优化中没有删除显式迭代器,尽管它可能是,即
对于一个很好的例子来说,首先将iterable转换为可消费迭代器是有用的,请看一下当前代码中的问题,没有任何优势。只要将
iterable
直接传递到max
中,就可以安全地删除该行
我认为这只是早期实现的残余,它使用了islice
:
# Short-cut for n==1 is to use max() when len(iterable)>0
if n == 1:
it = iter(iterable)
head = list(islice(it, 1))
if not head:
return []
if key is None:
return [max(chain(head, it))]
return [max(chain(head, it), key=key)]
这是我的。在以后的优化中没有删除显式迭代器,尽管它可能是,即
对于一个很好的例子来说,首先将iterable转换为可消费迭代器是有用的,请看下面的问题