了解 Python 的迭代属性 for 循环和 if 语句中的"in"运算符



下面的代码返回列表"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只得到010在布尔测试中被认为是一个假值。我还使用sum()函数将takewhile传递的所有数字相加。

你不需要跟踪你是否找到第一个偶数,只需在找到它时中断并离开 for 循环:

for num in L:
if num % 2 != 0:
total = total + num
else:
break

最新更新