2015-09-25 13 views
5

L'esempio seguente è molto semplice. Voglio eseguire map() con una funzione che può generare eccezioni. Sarà più chiaro con un esempio:python map exception continua l'esecuzione del mapping

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 

Quando eseguo questo codice ottengo:

-2 : -0.500000 
-1 : -1.000000 

E 'a causa della 0 nella mia lista. Non voglio rimuovere questo 0 (perché in realtà non posso sapere prima se otterrò Exception). Sapete come continuare a mappare dopo l'eccezione?

+0

se si sa quale valore di sostituire per 'infinita' quindi utilizzare 'provare: ritorno 1/n; tranne ZeroDivisionError: restituisci il tuo valore ' – Pynchia

risposta

3

si potrebbe intercettare l'eccezione nella funzione (invece che nel ciclo for) e ritorno None (o qualsiasi altra cosa si sceglie) se ZeroDivisionError è sollevata:

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

se si sceglie di return None è necessario adattarsi la tua stringa di formato; None non può essere formattato con %f.

altri valori si potrebbe tornare (e che sarebbe compatibile con il formattazione di stringhe) sono float('inf') (o float('-inf') a seconda del segno del numeratore) o float('nan') - "inf inity" o "n ot unn umber ".

here troverete alcuni dei caveat dell'utilizzo di float('inf').

+1

Penso che restituire' float ('nan') 'sia probabilmente l'opzione migliore qui. Ma suppongo che si debba menzionare che è necessario usare [math.isnan()] (https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan) per prova 'nan'. –

+0

Grazie! Funziona – jedema

2

È possibile spostare il blocco try/except all'interno della funzione. Esempio -

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

E poi chiamare questo normalmente, senza un blocco try/except -

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