Raise 语句:为什么我的代码块 return 是一个空列表而不是执行我的 "raise" 语句?
Raise statements: Why does my block of code return an empty list instead of executing my "raise" statement?
首先,如果我的问题被认为是愚蠢的或者我的 post 中有任何错误,我深表歉意 - 这是我的第二个 post,但我仍然觉得很难提问在这个平台上适当的问题。
其次,我尝试使用 Python 文档网站 (https://docs.python.org/3/tutorial/errors.html) and another post on Whosebug () 中的示例来查找“raise”语句背后的逻辑,但我仍然无法理解这个“提出”声明。
我正在尝试回答电子书 Introduction to computation and programming using 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,1]) # RETURNS: [] - THIS SHOULD EXECUTE RAISE STATEMENT, NOT RETURN AN EMPTY LIST
我想了解为什么我的代码块只返回一个空列表,而不是执行我的“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")
except
块中的代码将永远不会执行,因为 try
块中的任何行都不能引发 ValueError
。如果 L
中没有偶数,if
永远不会 True
而 return(evenNumbers)
只是 return 空的 evenNumbers
列表。
如果您想引发异常而不是 returning 一个空列表,请明确执行。
我还冒昧地使您的代码更加 pythonic 和简洁。
一旦找到第一个偶数,它将 return 一个包含它的列表。
如果从未命中 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 中一系列错误相关关键字的一部分(请参阅完整列表 here)。您应该知道的最重要的是 try
、except
和 raise
。我将在这里逐一解释:
try
始终与 except
配对,就像您在此处所做的那样。发生的情况是 "in scope" 对于 try
的任何内容都将像任何普通代码块一样执行。但是,如果发生了一些不好的事情(即你的代码做出了错误的假设或某些东西中断了)并且引发了 ValueError
,脚本会 not 立即终止或停止执行 - 相反,它将错误“冒泡”到下面的 except
子句,并允许您处理它,就像您在此处所做的那样。 但是,只有在执行 try
子句 时 ValueError
被实际触发时,except 子句中的内容才会被执行。如果 try
子句中的代码执行没有任何问题,那么 except
子句的代码 永远不会执行 - 它被完全跳过。
- 一旦问题冒泡到
except
子句,你可以让它打印一些东西或做任何你想做的事,然后使用 raise
关键字强制它停止执行,这在您的错误处理程序中人为地创建一个错误(即 except
子句)。
在您的示例中,ValueError
永远不会在任何地方引发(因为您的代码不会中断),因此永远不会调用 except
子句的代码!我认为您将“错误”与 False
混为一谈。在您的示例中,findAnEven([1,1,1,1])
完美执行 - 它 returns 是一个空列表,因为您传递的列表中确实没有偶数。没有偶数不是错误 - 这只是关于您输入的列表的事实。
首先,如果我的问题被认为是愚蠢的或者我的 post 中有任何错误,我深表歉意 - 这是我的第二个 post,但我仍然觉得很难提问在这个平台上适当的问题。
其次,我尝试使用 Python 文档网站 (https://docs.python.org/3/tutorial/errors.html) and another post on Whosebug (
我正在尝试回答电子书 Introduction to computation and programming using 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,1]) # RETURNS: [] - THIS SHOULD EXECUTE RAISE STATEMENT, NOT RETURN AN EMPTY LIST
我想了解为什么我的代码块只返回一个空列表,而不是执行我的“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")
except
块中的代码将永远不会执行,因为 try
块中的任何行都不能引发 ValueError
。如果 L
中没有偶数,if
永远不会 True
而 return(evenNumbers)
只是 return 空的 evenNumbers
列表。
如果您想引发异常而不是 returning 一个空列表,请明确执行。
我还冒昧地使您的代码更加 pythonic 和简洁。
一旦找到第一个偶数,它将 return 一个包含它的列表。
如果从未命中 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 中一系列错误相关关键字的一部分(请参阅完整列表 here)。您应该知道的最重要的是 try
、except
和 raise
。我将在这里逐一解释:
try
始终与except
配对,就像您在此处所做的那样。发生的情况是 "in scope" 对于try
的任何内容都将像任何普通代码块一样执行。但是,如果发生了一些不好的事情(即你的代码做出了错误的假设或某些东西中断了)并且引发了ValueError
,脚本会 not 立即终止或停止执行 - 相反,它将错误“冒泡”到下面的except
子句,并允许您处理它,就像您在此处所做的那样。 但是,只有在执行try
子句 时ValueError
被实际触发时,except 子句中的内容才会被执行。如果try
子句中的代码执行没有任何问题,那么except
子句的代码 永远不会执行 - 它被完全跳过。- 一旦问题冒泡到
except
子句,你可以让它打印一些东西或做任何你想做的事,然后使用raise
关键字强制它停止执行,这在您的错误处理程序中人为地创建一个错误(即except
子句)。
在您的示例中,ValueError
永远不会在任何地方引发(因为您的代码不会中断),因此永远不会调用 except
子句的代码!我认为您将“错误”与 False
混为一谈。在您的示例中,findAnEven([1,1,1,1])
完美执行 - 它 returns 是一个空列表,因为您传递的列表中确实没有偶数。没有偶数不是错误 - 这只是关于您输入的列表的事实。