【问题标题】:How do I avoid returning None type when an empty list is passed as an argument?当一个空列表作为参数传递时,如何避免返回 None 类型?
【发布时间】:2015-06-16 22:28:08
【问题描述】:
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([5, 8, 3, 2])
    8
    >>> first_even([7, 1])
    -1
    """
    counter = 0
    for item in items:
        counter = counter + 1
        if item % 2 == 0:
            return item
        elif counter == len(items):
            return -1

详情详情详情详情详情

【问题讨论】:

  • “详情详情详情详情详情”?您是否期待“代码代码答案解释代码”的答案?

标签: python list python-3.x for-loop


【解决方案1】:

在这种情况下,您也可以返回-1

counter = 0
for item in items:
    counter = counter + 1
    if item % 2 == 0:
        return item
    elif counter == len(items):
        return -1
return -1

items 为空时,for 循环根本不会返回,它会直接转到最后一行return -1

【讨论】:

  • 啊,好的,非常感谢!这是因为空列表不符合任何 if 语句吗?
  • 不,当items 为空时,for item in items: 行无关。所以整个 for 循环被跳过,它会运行最后一行。
【解决方案2】:

我建议采用不同的方法:在找不到偶数时引发异常。这是一个实现:

def first_even(items):
    """Returns the first even integer in an iterable producing ints.

    Raises
    ------
    ValueError
        If the iterable contains no even integers, or is in fact
        empty.
    """
    for item in items:
        if item % 2 == 0:
            return item
    else:
        raise ValueError('The list contains no even items.')

为什么要引发异常?如果您使用返回值 -1 来表示错误,那么在某些情况下使用您的函数会变得很棘手。例如,假设我想检查列表中的第一个偶数是否为负:

if first_even([3, -4, 5, 8]) < 0:
    print('The first even integer is negative!')

这适用于那个输入,但是呢:

if first_even([1, 3, 5]) < 0:
    print('The first even integer is negative!')

这无论如何都会打印消息!

【讨论】:

  • 是的,我通常会在出现错误的情况下打印一条消息,但是为了完成任务,我需要返回 -1 哈哈。不过谢谢!感谢您花时间提出这个建议。
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 2018-05-14
  • 2014-03-11
  • 1970-01-01
  • 2020-06-26
  • 2016-02-11
  • 1970-01-01
  • 2018-12-20
相关资源
最近更新 更多