微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Raise 语句:为什么我的代码块返回一个空列表而不是执行我的“raise”语句?

如何解决Raise 语句:为什么我的代码块返回一个空列表而不是执行我的“raise”语句?

首先,如果我的问题很愚蠢或者我的帖子中有任何错误,我深表歉意 - 这是我的第二篇文章,我仍然发现如何在这个平台上提出适当的问题很困难。

其次,我尝试使用 Python Docs 网站 (https://docs.python.org/3/tutorial/errors.html) 和 Stackoverflow 上的另一篇文章 (Raise statement) 中的示例查找“raise”语句背后的逻辑,但我仍然无法把我的头放在这个“提高”声明上。

我试图回答电子书使用 Python 进行计算和编程简介 中的以下问题:“实现满足规范的函数。” (见下面的功能规范)。

def findAnEven(L):
    """
    ASSUMES: L is a list of integers 
    RETURNS: the first even number in L
    Raises ValueError if L does not contain an even number
    """

下面是我试图解决这个问题:
def findAnEven(L):
    """
    ASSUMES: L is a list of integers
    RETURNS: the first even number in L
    Raises ValueError if L does not contain an even number
    """
    try:
        evennumbers = []
        for i in L:
            if i % 2 == 0:
                evennumbers.append(i)
                break
        return(evennumbers)
    except ValueError:
        raise ValueError("ValueError exception thrown")
findAnEven([1,2,3,4]) # RETURNS: [2]
findAnEven([1,1,1]) # RETURNS: [] - THIS SHOULD EXECUTE RAISE STATEMENT,NOT RETURN AN EMPTY LIST            

我想了解为什么我的代码块只返回一个空列表,而不是执行我的“raise”语句?

如果有人能解释(用外行的话)为什么我的代码块会向最后一个函数调用返回一个空列表(即 findAnEven([1,1]) 而不是执行我的“raise”语句,我将不胜感激 - 再次为这个愚蠢的问题道歉!

解决方法

try:
    evenNumbers = []
    for i in L:
        if i % 2 == 0:
            evenNumbers.append(i)
            break
    return(evenNumbers)
except ValueError:
    raise ValueError("ValueError exception thrown")

except 块中的代码永远不会被执行,因为 try 块中的任何行都不会引发 ValueError。如果 L 中没有偶数,则 if 永远不会是 Truereturn(evenNumbers) 只会返回空的 evenNumbers 列表。

如果您想引发异常而不是返回空列表,请明确地进行。 我还冒昧地使您的代码更加 Pythonic 和简洁。 一旦找到第一个偶数,它将返回一个包含它的列表。 如果从未命中 return 语句,则意味着未找到偶数,因此我们提出 ValueError 并带有明确的消息。

def find_an_even(L):
    """
    ASSUMES: L is a list of integers
    RETURNS: the first even number in L
    Raises ValueError if L does not contain an even number
    """
    
    for n in L:
        if n % 2 == 0:
            return [n]
            # or just 'return n' if you want to return the number not within a list
    raise ValueError("No even numbers in L")
,

首先,没有愚蠢的问题!每个人都按照自己的节奏学习。

Python 的 raise 是 Python 中一系列 Error 相关关键字的一部分(请参阅完整列表 here)。您应该知道的最重要的是 tryexceptraise。我将在这里逐一解释:

  • try 始终与 except 配对,就像您在此处所做的那样。发生的情况是,try 的任何“作用域内” 都将像任何普通代码块一样执行。但是,如果发生了不好的事情(即您的代码做出了错误的假设或某些事情中断了)并且引发​​了 ValueError,则该脚本不会立即终止或停止执行 - 相反,它“冒泡”将该错误添加到紧邻下面的 except 子句中,并允许您处理它,就像您在此处所做的一样。 但是,只有在执行ValueError 子句时try 被实际提出时,except 子句中的内容才会被执行。如果 try 子句中的代码执行没有任何问题,那么 except 子句的代码永远不会执行 - 它会被完全跳过。
  • 一旦问题冒泡到 except 子句,您可以让它打印一些东西或做任何您想做的事情,然后使用 raise 关键字强制它实际停止执行,该关键字人为地创建错误处理程序中的错误(即 except 子句)。

在您的示例中,ValueError 永远不会在任何地方引发(因为您的代码不会中断),因此永远不会调用 except 子句的代码!我认为您将“错误”与 False 混为一谈。在您的示例中, findAnEven([1,1,1]) 执行完美 - 它返回一个空列表,因为您传递的列表中确实没有偶数。没有偶数的事实不是错误 - 这只是关于您输入的列表的事实。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?