Python 3.x Raise语句:为什么我的代码块返回一个空列表而不是执行我的";提高;陈述

Python 3.x Raise语句:为什么我的代码块返回一个空列表而不是执行我的";提高;陈述,python-3.x,raise,Python 3.x,Raise,首先,如果我的问题被认为是愚蠢的,或者我的帖子中有任何错误,我表示歉意——这是我的第二篇帖子,我仍然发现在这个平台上很难提出适当的问题 其次,我尝试使用pythondocs网站()上的示例和Stackoverflow()上的另一篇文章来查找“raise”语句背后的逻辑,但我仍然无法理解这个“raise”语句 我试图回答电子书《使用Python进行计算和编程简介》中的以下问题:“实现满足规范的函数”(请参见下面的函数规范) 下面是我解决这个问题的尝试: 我试图理解为什么我的代码块只返回一个空列

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

其次,我尝试使用pythondocs网站()上的示例和Stackoverflow()上的另一篇文章来查找“raise”语句背后的逻辑,但我仍然无法理解这个“raise”语句

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


下面是我解决这个问题的尝试:
我试图理解为什么我的代码块只返回一个空列表,而不是执行我的“raise”语句

如果有人能解释(用外行术语)为什么我的代码块在最后一次函数调用(即findAnEven([1,1,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")
由于
try
块中的任何行都不会引发
ValueError
,因此
except
块中的代码将永远不会执行。如果
L
中没有偶数,则
if
从不
True
返回(偶数)
只返回空的
偶数列表

如果要引发异常而不是返回空列表,请显式执行该操作。 我还冒昧地使您的代码更具python风格和简洁性。 一旦找到第一个偶数,它将返回一个包含它的列表。 如果
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中一系列与错误相关的关键字的一部分(请参阅完整列表)。您应该知道的最重要的关键字是
try
except
、和
raise
。我将在这里解释它们:

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

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

您好,感谢您的回复。正如我在帖子中提到的,我正试图回答以下规范:def Findan偶数(五十) :“”“假设:L是一个整数列表返回:如果L不包含偶数,则L中的第一个偶数将引发ValueError”“。Python电子书中的章节与“异常”相关,而与“引发ValueError”相关的特定练习则与L(应为列表)相关不包含偶数。我试图用迄今为止学到的知识回答电子书中的问题,但发现问题很棘手!嗨,DeepSpace,感谢你的回复,并对迟来的回复表示歉意。我试图理解你在回复之前写的内容。似乎我没有问一个足够具体的问题,但你仍然需要回答设法理解我试图通过您的回答实现的目标——“如果您想引发异常而不是返回空列表,请显式地这样做。”这正是我想要实现的,但失败了,反而产生了一个空列表。感谢您的解释和您的代码示例,我也很欣赏“Pythonic”重构!嗨@victor\uuuu von\uuuuu doom,谢谢你的回复,并为迟交的回复表示歉意。就像Deepspace在你之前的评论一样,我只是试图在回复之前完全理解建议的内容。你的观点真的很有见地,谢谢你的“冒泡”类比,这是思考except子句的一种有趣的方式。
try:
    evenNumbers = []
    for i in L:
        if i % 2 == 0:
            evenNumbers.append(i)
            break
    return(evenNumbers)
except ValueError:
    raise ValueError("ValueError exception thrown")
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")