Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么首先要将iterable对象转换为迭代器?_Python_Iterator - Fatal编程技术网

Python 为什么首先要将iterable对象转换为迭代器?

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

我在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 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转换为可消费迭代器是有用的,请看下面的问题