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

时间:2017-08-17 19:55:56

标签: python

以下代码返回列表中的值的总和" 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:

行正常工作......事实上,就好像它没有移动到列表中的下一个整数并重新运行列表中第一个整数的代码。有人可以解释一下这是为什么。

2 个答案:

答案 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只会产生01,而0在布尔测试中被视为假值。我还使用sum() function来汇总takewhile确实传递的所有数字。

答案 1 :(得分:0)

如果你发现了第一个偶数,你不需要跟踪,只要在你找到它时就中断并离开for循环:

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