2015-09-25 50 views
5

以下示例非常简单。我想执行map()带有可以引发Exception的函数。这将是更清晰地用一个例子:python映射异常继续映射执行

number_list = range(-2,8) 

def one_divide_by(n): 
    return 1/n 

try: 
    for number, divide in zip(number_list, map(one_divide_by, number_list)): 
     print("%d : %f" % (number, divide)) 
except ZeroDivisionError: 
    # Execution is stopped. I want to continue mapping 
    pass 

当我执行这个代码,我得到:

-2 : -0.500000 
-1 : -1.000000 

这是由于我的列表中的0。我不想删除这个0(因为实际情况下,我不知道如果我会得到例外)。 你知道如何在之后继续映射吗?

+0

,如果你知道什么代替值 '无限' 然后用'尝试:回1/N;除了ZeroDivisionError:return yourvalue' – Pynchia

回答

3

你可以捕获该异常在你的函数(而不是在for循环)并返回None(或者不管你选择),如果ZeroDivisionError提高:

def one_divide_by(n): 
    try: 
     return 1/n 
    except ZeroDivisionError: 
     return None 

,如果您选择return None你需要适应你的格式字符串; None无法使用%f进行格式化。

其他值,你可以返回(这将是与你的字符串格式兼容)的(取决于你的分子的符号或float('-inf'))或float('nan')float('inf') - “INF inity这”或“ñ OT n umber“。

here你会发现一些使用float('inf')的注意事项。

+1

我认为返回float('nan')'可能是最好的选择。但我想应该提到你需要使用[math.isnan()](https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan)来测试'nan'。 –

+0

谢谢!有用 – jedema

2

您可以在功能内移动try/except块。示例 -

def one_divide_by(n): 
    try: 
     return 1/n 
    except ZeroDivisionError: 
     return 0 #or some other default value. 

,然后正常/调用该方法,没有一个尝试except块 -

for number, divide in zip(number_list, map(one_divide_by, number_list)): 
    print("%d : %f" % (number, divide))