【问题标题】:Unable to return the first even number from a list [duplicate]无法从列表中返回第一个偶数 [重复]
【发布时间】:2017-03-04 05:01:00
【问题描述】:

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

时,我会收到 'nothing'
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]

【问题讨论】:

  • return -1 放在循环之外,return num 而不是追加

标签: python python-3.x


【解决方案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)

【讨论】:

  • 或者if not x % 2会稍微快一点
  • @PadraicCunningham:是的。我的直觉实际上是写not x % 2,但我尽量避免在 SO 答案中使用它,因为0 的测试更直接地描述了数学测试,每次测试的性能差异大约为 5-10 ns。 :-)
  • 我讨厌打字,所以这是我的借口;)你也可以not x & 1 :)
【解决方案2】:

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

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

Python 参考for/else 块:

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

【讨论】:

  • 错了!在同一缩进级别上,如果没有“if”,则不能有“else”
  • @user4421975 哈哈哈,我敢打赌你是 Python 新手。见stackoverflow.com/a/37643358/3125566
  • else 其实是多余的。添加它的唯一一点是如果return numbreak,你不能从一个函数返回两次
  • @PadraicCunningham 但是return numbreak 做的事情几乎相同,只是它将控制权返回给调用者。当if 未执行时,看起来更像是从else 分支返回。
  • @MosesKoledoye,我不太确定我是否遵循,删除 else 并将 return 放在循环之外的行为完全相同。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2016-01-15
    • 2022-08-12
    • 2018-02-10
    • 1970-01-01
    • 2021-07-07
    • 2020-10-28
    • 2016-01-07
    相关资源
    最近更新 更多