2015-09-25 8 views
5

次の例は非常に簡単です。 map()をExceptionを発生させる関数で実行したい。これは一例でより明確になります。私はこのコードを実行するとpython map exception continueマッピング実行

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 

は私が取得:それは私のリストで0によるだ

-2 : -0.500000 
-1 : -1.000000 

。私はこの0を削除したくありません(実際には例外が出るかどうか最初に知ることができないためです)。 例外の後にのマッピングを続ける方法を知っていますか?

+0

あなたがの代わりにどのような価値を知っている場合は、 '無限' を試す '使用:リターン1/N; ZeroDivisionErrorを除く:return yourvalue' – Pynchia

答えて

3

あなたは(forループの代わりに)あなたの関数で例外をキャッチし、ZeroDivisionErrorが発生した場合には(あなたが選択するか、または何でも)Noneを返すことができます:あなたはreturn Noneに選択した場合

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

は、あなたが適応する必要がありますあなたのフォーマット文字列。 None%fでフォーマットできません。

他の値は、あなたが返すことができます(それはあなたの文字列フォーマットと互換性がある)float('inf')またはfloat('nan')(またはfloat('-inf')はあなたの分母の符号に応じて)されている - 「INF inity」または「N OT n umber "。

herefloat('inf')を使用する場合の警告があります。

+1

ここではおそらく 'float( 'nan')を返すのが最良の選択肢だと思います。しかし、私は[math.isnan()](https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan)を使用して'ナノ 'をテストする。 –

+0

ありがとう!できます – jedema

2

ブロック内のtry/exceptブロックを移動することができます。例 -

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

そして、try/exceptブロックせず、通常はこれを呼び出す -

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