2015-09-25 15 views
5

Aşağıdaki örnek çok basittir. İstisnayı artırabilen bir işlevle map()'u çalıştırmak istiyorum. Bir örnek daha net olacaktır: Bu kodu çalıştırdığınızdapiton haritası istisna devam haritalama yürütme

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 

alıyorum: Listemde 0'a nedeniyle olduğunu

-2 : -0.500000 
-1 : -1.000000 

. Bu 0'ı kaldırmak istemiyorum (çünkü gerçek durumda Özel Durum alırsam ilk önce bunu bilmiyorum). istisna sonra Harita oluşturmaya devam nasıl biliyor musunuz?

+0

sen yerine ne değeri biliyorsanız 'sonsuz' sonra deneyin 'kullanın: dönüş 1/n; ZeroDivisionError hariç: senin değerini döndür " – Pynchia

cevap

3

sen (for döngü yerine içinde) işlevinde durum yakalamak ve ZeroDivisionError yükseltilmiş ise (seçtiğiniz ya da herneyse) None geri dönebilirler: Eğer return None seçerseniz

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

sen uyarlamak gerekir format dizginiz; None, %f ile biçimlendirilemez.

diğer değerler geri dönebilirler (ve bu dize biçimlendirme ile uyumlu olacaktır) float('inf') veya float('nan') (veya float('-inf') da numaratör işareti bağlı olarak) - "inf inity" veya "n ot birn toprak rengi".

here

Eğer float('inf') kullanmanın uyarılar bazılarını bulacaksınız.

+1

" Float ('nan') 'i döndürmeyi düşünüyorum, muhtemelen burada en iyi seçenek. Ama kullanmak gerektiğini belirtmek gerekir ki sanırım [math.isnan()] (https://docs.python.org/3/library/math.html?highlight=math.isnan#math.isnan) için nan testi yap. –

+0

Teşekkür ederiz! İşe yarıyor – jedema

2

Sen işlevi içinde try/except blok taşıyabilirsiniz. Örnek -

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

Sonra bloğu hariç/try olmadan, normalde bu çağrı -

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