在 Python 中对 map() 应用 min()

Applying min() on map() in Python

当我在 map() 上应用 min() 时,我得到以下特定代码的结果:

a = map(int, input().split())

print(min(a))

for i in a:
    print(i)

对于输入: 5 7 10 5 15

我得到的结果是:

5

这是最小值,但不执行for循环

但是如果我写:

a = map(int, input().split())

for i in a:
    print(i)

然后对于相同的输入,它执行 for 循环,我得到结果:

5
7
10
5
15

为什么在 'for' 循环停止 'for' 循环执行之前使用 'min()'?

当您在 python 中使用 map 函数时,它 returns 生成器。

然后当您使用 min 函数调用它时,它会遍历该生成器并使生成器在内部指向可迭代对象的末尾。

然后你尝试在那个生成器上重复,但它已经失去了它的初始“索引”并指向可迭代对象的末尾

在 Python 2 中,map() 返回了一个 list,在那个环境中,您期望的行为会已经发生了。

然而,在Python3中,map()returns一个map对象,它是一个迭代器.

当您将迭代器传递给诸如 min() 之类的函数时,它将被消耗 - 即任何后续从中获取数据的尝试都将失败(没有任何错误,但好像迭代器已经自然耗尽了)。

要在 OP 的代码中获得所需的行为,只需执行以下操作:

a = list(map(int, input().split()))

您传递给 min() is the result of a map() 的内容,它是一个生成器。它的值在 for 循环有机会使用它们之前被 min() 函数使用。

如果您使用生成器并将其值再次放入列表中,您可以根据需要迭代任意多次。

a = list(map(int, input().split()))

print(min(a))

for i in a:
    print(i)
a = map(int, input().split())

这个命令returns一个迭代器对象。此外,为了在内部处理任何迭代器,next 被许多内部函数使用。一旦没有 next 输出或没有 next 对象,它就会退出(有关更多信息,请参见 __next__ 实现)。

在情况1中,min函数使用了这个属性并遍历了这个迭代器并返回了最小值,其中next指向none ,所以 for 循环在那里不起作用。

虽然情况 2.next 对象仍然指向 map 对象的第一个元素,因此可以对该对象进行 运行 迭代,这就是为什么在那里循环工作。