Python中的数字数组计算受print语句的影响。

4

I wrote two set of codes

Set 1:

numArray = map(int, input('input content:').split())
print('numArray is', list(numArray))

sum_integer = 0
for number in numArray:
    sum_integer += number*number

print('sum is:', sum_integer)

第二组:

numArray = map(int, input('input content:').split())

sum_integer = 0
for number in numArray:
    sum_integer += number*number

print('sum is:', sum_integer)

你可以看到这是通过输入一组数字,然后计算每个数字的平方和来创建的。 Set 1 和 Set 2 的区别仅在于一个 print() 行。
假设我为两个集合都输入了:4 7 2 8 5 对于 Set 1: 我得到:
numArray is [4, 7, 2, 8, 5]
sum is: 0

对于第二个集合: 我得到:
sum is 158

一行print()语句如何改变计算逻辑?


是因为 list(numArray) 改变了 numArray,所以它不再存在了吗? - jxie0755
2个回答

3

map 函数返回一个迭代器。如果你在它上面调用 list 函数,就会消耗掉它,因此后续代码无法使用该迭代器。如果你想多次重复使用这个数字序列(例如先打印再求和),可以将其保存为列表:

numArray = list(map(int, input('input content:').split()))

我明白了。谢谢! - jxie0755
我很感兴趣。你能再解释一下吗?我不太明白consuming it这部分是什么意思? - Miraj50
1
@Miraj50 迭代器就像生成器,它不一定是内存中的“空间”。因此,如果你将迭代器转换为列表,你会修改指向原始迭代器的指针,以至于后面不能再使用它。 - Joe Iddon
2
这就像读取文件。一旦到达结尾,除非重置文件,否则再读取也不会获取任何数据。一旦由map()返回的迭代器到达其数据的末尾,对它的更多调用将得不到任何东西。因此,在print()语句中通过list()处理迭代器后,就没有更多可读的内容了。所以,OP需要保存数据以供以后使用,或者在准备好使用它之前不要首次读取数据。 - Tom Barron
@TomBarron,您的解释让我想起了Facebook上的The practical Dev页面。“像我五岁一样解释”? :) 。谢谢。也感谢@Joe Iddon。 - Miraj50
我不使用 map(),而是先创建一个字符串列表,然后在 for 循环中添加 number = int(number)。这样可以避免使用迭代器,也能达到同样的效果。 - jxie0755

2

你的问题在@Mureinik的答案中已经得到了很好的回答,但是如果有人感兴趣,你可以用一行sum来完成这个操作:

sum_integer = sum(n ** 2 for n in numArray)

你实际上可以用一行代码完成整个 code

sum_integer = sum(int(n) ** 2 for n in input('input content:'))

这很棒,谢谢!就像你提到的,这个问题现在有了答案,但我从你的输入中学到了更多! - jxie0755

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接