处理ZeroDivisonError的最佳方法是什么?

时间:2016-06-28 10:20:28

标签: python python-3.x

我已获得以下代码:

def chunk_trades(A):
    last = A[0]
    new = []
    for x in A.iteritems():
        if np.abs((x[1]-last)/last) > 0.1:
            new.append(x[1])
            last = x[1]
        else:
            new.append(last)
    s = pd.Series(new, index=A.index)
    return s

有时last可以为零。在这种情况下,我希望它能够优雅地继续进行,就像last几乎为零一样。

最干净的方式是什么?

3 个答案:

答案 0 :(得分:1)

只需替换你的行:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="vertex2016.mvjce.edu.bluealert.Connected"
    tools:showIn="@layout/activity_connected">


    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@id/screenimageView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

由于首先检查左侧断言,因此不会引发异常。

答案 1 :(得分:1)

不确定你是否真的想要除以&#34;几乎为0&#34;,因为结果将是&#34;几乎无穷大&#34;,但你也可以这样做:

if last == 0:
   last = sys.float_info.min

这是最小正标准化浮点数,即最接近零的值。

来源:https://docs.python.org/2/library/sys.html#sys.float_info

答案 2 :(得分:0)

如果我理解正确,当last == 0你得到ZeroDivisionError时,你会赢吗?如果是,请考虑使用稍微修改过的代码版本:

def chunk_trades(A):
    last = A[0]
    new = []
    for x in A.iteritems():
        try:
            if np.abs((x[1]-last)/last) > 0.1:
                new.append(x[1])
                last = x[1]
            else:
                new.append(last)
        except ZeroDivisionError:
            eps = 1e-18 # arbitary infinitesmall number
            last = last + eps
            if np.abs((x[1]-last)/last) > 0.1:
                new.append(x[1])
                last = x[1]
            else:
                new.append(last)

    s = pd.Series(new, index=A.index)
    return s