以下代码返回列表中的值的总和" A"存在之前列表中的第一个偶数值。
示例:
如果列表A = [1,3,5,4],结果将返回1 + 3 + 5 = 9
如果列表A = [1,2,5,4],结果将返回1
def for_version(L):
found_even = False
total = 0
for num in L:
if num % 2 != 0 and not found_even:
total = total + num
else:
found_even = True
return total
A = [1,3,5,9]
for_version(A)
我不明白,在第一次迭代之后,我们不会丢失列表中的第一个整数。换句话说,这就是我想象代码是如何工作的。
从列表中的第一个值开始" A"并准备一次一个地移动所有值:
for num in L:
检查if语句的第一次迭代:
if num % 2 != 0 and not found_even:
虽然列表中的第一个数字是ODD,但由于found_even
最初设置为False
,因此代码应移至else
语句:
else:
found_even = True
我想现在if语句已经在列表的第一个值上完成了,所有发生的事情都是将found_even bool更改为True。
我认为代码会继续前进;然后将在列表中的 NEXT 值上测试if语句。然而,这似乎是不正确的。如果我的想法是对的,在上面的例子中,它将意味着列表中的第一个值" 1"在完成求和时会被忽略,我们最终得到3 + 5 = 8 NOT 1 + 3 + 5 = 9.
我显然不明白一些关于如何
的基础知识for num in L:
行正常工作......事实上,就好像它没有移动到列表中的下一个整数并重新运行列表中第一个整数的代码。有人可以解释一下这是为什么。
答案 0 :(得分:5)
虽然列表中的第一个数字是ODD,但由于
found_even
最初设置为False
,因此代码应移至else
语句[。]
你的逻辑错误了。 not False
为真,因此if
语句测试测试为true,else
套件不执行。
您可以自己测试一下:
>>> num = 1 # odd
>>> found_even = False
>>> num % 2
1
>>> num % 2 != 0
True
>>> not found_even
True
>>> num % 2 != 0 and not found_even
True
代码本身过于复杂;早点回来。没有必要迭代,或使用标志; return
结束函数和迭代:
def for_version(L):
total = 0
for num in L:
if num % 2 == 0:
return total
total += num
或者,使用break
来停止循环,然后返回。
Python标准库在itertools
库中有一个非常有用的工具,名为itertools.takewhile()
;它将为您提供可迭代的所有元素,直到给定的测试失败。然后它就停止迭代:
from itertools import takewhile
sum(takewhile(lambda x: x % 2, A))
我在那里删除了!= 0
测试; % 2
只会产生0
或1
,而0
在布尔测试中被视为假值。我还使用sum()
function来汇总takewhile
确实传递的所有数字。
答案 1 :(得分:0)
如果你发现了第一个偶数,你不需要跟踪,只要在你找到它时就中断并离开for循环:
for num in L:
if num % 2 != 0:
total = total + num
else:
break