下面的代码返回列表"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布尔值更改为 True。
我假设代码会继续;然后 if 语句将在列表中的NEXT值上进行测试。 然而,这似乎不正确。 如果我的想法是正确的,在上面的例子中,这意味着在完成求和时列表"1"中的第一个值将被忽略,我们最终会得到 3 + 5 = 8而不是1 + 3 + 5 = 9。
我显然不明白一些非常基础的东西
是如何for num in L:
线路作品... 就好像它实际上没有移动到列表中的下一个整数,而是在列表中的第一个整数上重新运行代码。 有人可以解释为什么会这样吗?
尽管列表中的第一个数字是 ODD,但由于
found_even
最初设置为False
,代码应移动到else
语句[.]
你在那里弄错了你的逻辑。not False
为 true,因此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()
函数将takewhile
传递的所有数字相加。
你不需要跟踪你是否找到第一个偶数,只需在找到它时中断并离开 for 循环:
for num in L:
if num % 2 != 0:
total = total + num
else:
break