2015-09-25 14 views
5

Poniższy przykład jest bardzo prosty. Chcę wykonać map() z funkcją, która może podnieść wyjątek. Będzie to bardziej wyraźnie na przykładzie:Wyjątek mapy Pythona kontynuuj wykonywanie mapowania

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 

Kiedy wykonanie tego kodu uzyskać:

-2 : -0.500000 
-1 : -1.000000 

To ze względu na 0 w moim liście. Nie chcę usunąć tego 0 (ponieważ w rzeczywistości nie mogę najpierw wiedzieć, czy otrzymam wyjątek). Czy wiesz, jak wykonać kontynuować mapowanie po wyjściu z wyjątku?

+0

jeśli wiesz, co wartość do zastąpienia 'nieskończony', a następnie spróbuj użyć ': powrót 1/n; z wyjątkiem ZeroDivisionError: return yourvalue' – Pynchia

Odpowiedz

3

można złapać wyjątek w funkcji (zamiast w pętli for) i powrócić None (lub cokolwiek innego wyboru) jeżeli ZeroDivisionError jest podniesione:

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

jeśli zdecydujesz się return None trzeba dostosować twój ciąg formatu; None nie można sformatować za pomocą %f.

inne wartości można wrócić (i byłby zgodny z formatowania łańcucha) są float('inf') (lub float('-inf') w zależności od znaku swoim liczniku) lub float('nan') - „inf inity” lub "n ot sięn umber ".

here znajdą Państwo niektóre z zastrzeżeń dotyczących korzystania z float('inf').

+1

Myślę, że powrót 'float ('nan')' jest prawdopodobnie najlepszą opcją. Ale myślę, że należy wspomnieć, że musisz użyć [math.isnan()] (https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan) na przetestuj 'nan'. –

+0

Dziękujemy! To działa – jedema

2

Możesz przesunąć blok try/except wewnątrz funkcji. Przykład -

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

A potem nazywają to normalnie, bez try/z wyjątkiem bloku -

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