शून्य के बराबर शून्य से विभाजन करें - पायथन, विभाजन, शून्य

मैं कैसे नजरअंदाज कर सकता हूं ZeroDivisionError और बनाओ n / 0 == 0?

उत्तर:

जवाब के लिए 5 № 1

मुझे लगता है try except (जैसा कि साइबर के जवाब में) आमतौर पर सबसे अच्छा तरीका है (और अधिक पायथोनिक: अनुमति मांगने की तुलना में माफी माँगने के लिए बेहतर है!), लेकिन यहाँ एक और है:

def safe_div(x,y):
if y == 0:
return 0
return x / y

इस तरह से करने के पक्ष में एक तर्क, हालांकि, यदि आप उम्मीद करते हैं ZeroDivisionErrorअक्सर ऐसा होता है, समय से पहले 0 हर के लिए जाँच बहुत तेज़ होगी (यह अजगर 3 है):

import time

def timing(func):
def wrap(f):
time1 = time.time()
ret = func(f)
time2 = time.time()
print("%s function took %0.3f ms" % (f.__name__, int((time2-time1)*1000.0)))
return ret
return wrap

def safe_div(x,y):
if y==0: return 0
return x/y

def try_div(x,y):
try: return x/y
except ZeroDivisionError: return 0

@timing
def test_many_errors(f):
print("Results for lots of caught errors:")
for i in range(1000000):
f(i,0)

@timing
def test_few_errors(f):
print("Results for no caught errors:")
for i in range(1000000):
f(i,1)

test_many_errors(safe_div)
test_many_errors(try_div)
test_few_errors(safe_div)
test_few_errors(try_div)

आउटपुट:

Results for lots of caught errors:
safe_div function took 185.000 ms
Results for lots of caught errors:
try_div function took 727.000 ms
Results for no caught errors:
safe_div function took 223.000 ms
Results for no caught errors:
try_div function took 205.000 ms

इसलिए उपयोग कर रहे हैं try except बहुत सारी (या वास्तव में, सभी) त्रुटियों के लिए 3 से 4 गुना धीमी हो जाती है; यह है: यह 3 से 4 गुना धीमा है पुनरावृत्तियों के लिए कि एक त्रुटि पकड़ी गई है। संस्करण का उपयोग कर if जब कुछ (या वास्तव में, नहीं) त्रुटियां होती हैं तो कथन थोड़ा धीमा (10% या अधिक) हो जाता है।


जवाब के लिए 18 № 2

विभाजित करने से पहले जाँच करें कि भाजक शून्य है या नहीं। यह अपवाद को पकड़ने के ओवरहेड से बचा जाता है, जो अधिक कुशल हो सकता है यदि आप शून्य से बहुत अधिक विभाजित होने की उम्मीद करते हैं।

def weird_division(n, d):
return n / d if d else 0

जवाब के लिए 11 № 3

आप एक का उपयोग कर सकते हैं try/except इसके लिए ब्लॉक करें।

def foo(x,y):
try:
return x/y
except ZeroDivisionError:
return 0

>>> foo(5,0)
0

>>> foo(6,2)
3.0

जवाब के लिए 4 № 4
def foo(x, y):
return 0 if y == 0 else x / y

जवाब के लिए 0 № 5

आप ऑपरेटर अधिभार को देख सकते हैं (https://docs.python.org/2/library/operator.html) यदि यह एक नए वर्ग में अपने पूर्णांक को लपेटने के लिए ठीक है, तो बस जांचें कि क्या y 0 रिटर्न 0 है और x / y अन्यथा।


जवाब के लिए 0 № 6

मुझे लगता है कि अगर आप Zer0DivErrr का सामना नहीं करना चाहते हैं,आपको "इसके लिए प्रतीक्षा करने या अभिव्यक्ति की कोशिश को छोड़कर इसके माध्यम से जाने की आदत नहीं है। तेज तरीका यह है कि अपना कोड बनाकर बस उस पर कूदें, जब भाजक शून्य न हो जाए।"

(if Y Z=X/Y else Z=0)

उत्तर के लिए 0 № 7

आप निम्न का उपयोग कर सकते हैं:

x=0,y=0
print (y/(x or not x))

आउटपुट:

>>>x=0
>>>y=0
>>>print(y/(x or not x))
0.0
>>>x =1000
>>>print(y/(x or not x))
0.000999000999000999

x गलत नहीं होगा यदि x 0 के बराबर नहीं है, तो उस समय यह वास्तविक x के साथ विभाजित हो जाता है।


संबंधित सवाल
सबसे लोकप्रिय