2015-09-25 13 views
5

Ví dụ sau đây rất đơn giản. Tôi muốn thực hiện bản đồ() với chức năng có thể tăng Ngoại lệ. Nó sẽ rõ ràng hơn với một ví dụ:ngoại lệ bản đồ python tiếp tục thực hiện ánh xạ

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 

Khi tôi thực thi mã này tôi nhận được:

-2 : -0.500000 
-1 : -1.000000 

Đó là do sự 0 trong danh sách của tôi. Tôi không muốn loại bỏ điều này 0 (bởi vì trong trường hợp thực sự tôi không thể biết đầu tiên nếu tôi sẽ nhận được ngoại lệ). Bạn có biết cách tiếp tục lập bản đồ sau khi ngoại lệ không?

+0

nếu bạn biết những gì giá trị để thay thế cho 'vô hạn' sau đó sử dụng 'thử: return 1/n; ngoại trừ ZeroDivisionError: return yourvalue' – Pynchia

Trả lời

3

bạn có thể bắt ngoại trừ trong chức năng của bạn (thay vì trong for loop) và trở None (hoặc bất cứ điều gì mà bạn chọn) nếu ZeroDivisionError được nâng lên:

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

nếu bạn chọn để return None bạn cần phải thích ứng chuỗi định dạng của bạn; Không thể định dạng None bằng %f.

giá trị khác mà bạn có thể trở lại (và đó sẽ là tương thích với định dạng chuỗi của bạn) đang float('inf') (hoặc float('-inf') tùy thuộc vào dấu hiệu của tử số của bạn) hoặc float('nan') - "inf inity" hoặc "n ot mộtn umber ".

here bạn sẽ thấy một số cảnh báo sử dụng float('inf').

+1

Tôi nghĩ rằng trả về 'float ('nan')' có lẽ là lựa chọn tốt nhất ở đây. Nhưng tôi đoán rằng cần phải đề cập rằng bạn cần sử dụng [math.isnan()] (https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan) để kiểm tra 'nan'. –

+0

Cảm ơn bạn! Nó hoạt động – jedema

2

Bạn có thể di chuyển khối try/except bên trong hàm. Ví dụ -

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

Và sau đó gọi đây là bình thường, mà không có một thử/trừ khối -

for number, divide in zip(number_list, map(one_divide_by, number_list)): 
    print("%d : %f" % (number, divide)) 
Các vấn đề liên quan