python代码中的一些奇怪的东西,map()函数[duplicate]

vwkv1x7d  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(72)
    • 此问题在此处已有答案**:

Why can't I iterate twice over the same iterator? How can I "reset" the iterator or reuse the data?(5个答案)
2年前关闭。

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

for i in arr:
    print(i)

print(list(arr)[1])

当我运行这段代码并将输入作为,
它给出如下输出,

1
2
3
4
5
Traceback (most recent call last):
  File "/home/muyustan/PycharmProjects/openCV/split.py", line 6, in <module>
    print(list(arr)[1])
IndexError: list index out of range

然后,

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

# for i in arr:
#     print(i)

print(list(arr)[1])

在注解掉for循环并运行程序和提供相同的输入之后,它在终端给出如下输出:

2

为什么要使用for循环进行更改?

hi3rlvi2

hi3rlvi21#

Map函数不返回列表,而是返回迭代器。

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

一个迭代器只能循环一次。当你写

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

不做任何操作,你需要调用arr上的next()方法来获得下一个元素,For循环可以完成这个操作。

q5lcpyga

q5lcpyga2#

如果在异常行之前打印arr,您将看到:

c:\srv\tmp> py3 weirdmap.py
1 2 3 4 5
<map object at 0x03611770>
2

map-object是一个迭代器(你可以只迭代一次)。
你可以通过使用列表解析来修复你的代码:

arr = [int(v) for v in input().split()]

或者在对迭代器执行任何操作之前将其转换为列表:

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

要了解最后一行的内容,请考虑以下重写:

mapobj = map(int, input().split())
arr = list(mapobj)
print(arr[2])         # <=== return the 3rd element
print(mapobj[2])      # <=== TypeError: 'map' object is not subscriptable

将最后一行更改为

print(list(mapobj)[2])   # <=== IndexError: list index out of range

因为arr = list(mapobj)用完了迭代器。

相关问题