无法从列表中返回第一个偶数

时间:2016-10-21 19:27:42

标签: python python-3.x

所以我理解将偶数放在一个新的列表中但是当前面有一些奇数时我似乎只能调用-1?对于一个空字符串,当它应该返回-1

时,我会收到“没有”
def first_even(items):
    """ (list of int) -> int

    Return the first even number from items. Return -1 if items     contains no even numbers.

    >>> first_even([1, 9, 3, 77, 13, 5, 8])
    8
    >>> first_even([7, 1])
    -1
    """
    even = []
    for num in items:
        if num % 2 == 0:
            even.append(num)
        else:
            return -1
    return even[0]

3 个答案:

答案 0 :(得分:2)

def first_even(items):
    """ (list of int) -> int

    Return the first even number from items. Return -1 if items     contains no even numbers.

    >>> first_even([1, 9, 3, 77, 13, 5, 8])
    8
    >>> first_even([7, 1])
    -1
    """
    for num in items:
        if num % 2 == 0:
            return num
    return -1

答案 1 :(得分:1)

else块将针对第一个奇数执行,这将终止for并丢弃所有先前的附加。相反,您希望在找到偶数后立即返回偶数(您不需要列表),然后移动else以与for对齐或在{{1}之外}:

for

Python def first_even(items): for num in items: if num % 2 == 0: return num else: return -1 # or put the default value to return here 块参考:

How can I make sense of the `else` clause of Python loops?

答案 2 :(得分:1)

正如其他人所说,你的else案例导致提前终止,而使用list则毫无意义。您可以解决所有这些问题,查看极简主义修复的其他答案,但还有另一种选择:让Python内置函数为您完成更多工作。

The next function将返回迭代器中的第一个项,并使用第二个参数,如果迭代器为空,则返回第二个参数。所以给它一个generator expression懒惰地产生输入中的所有偶数,它将拉出第一个并返回它。如果未找到,则默认情况下将为您返回-1

def first_even(items):
    # x & 1 == 0 is roughly equivalent and might be slightly faster
    return next((x for x in items if x % 2 == 0), -1)

对于病理类型,这可能会稍快一点,但对于那些不熟悉内部和外部Python内部的人来说,它不那么直观;我不推荐它:

from itertools import filterfalse  # ifilterfalse on Py2

def first_even(items):
    # (1).__rand__ is roughly equivalent, and may be faster
    return next(filterfalse((2).__rmod__, items), -1)