0

これは非常にグリーンな質問かもしれませんが、理解していただければ幸いです。Python を始めたばかりで、改善を試みています。とにかく、デカルト平面で多角形の面積を見つける「靴ひも法」を実行するための小さな関数を作成しました(復習のためにこれを参照してください)。

どうすれば自分の方法を改善できるか知りたいので、同じ古いことを行うための派手な新しい方法を試すことができます.

    def shoelace(list):
        r_p     = 0         # Positive Values
        r_n     = 0         # Negative Values

        x, y    = [i[0] for i in list], [i[1] for i in list]
        x.append(x[0]), y.append(y[0])

        print(x, y)

        for i in range(len(x)):
            if (i+1) < len(x):
                r_p += (x[i] * y[i+1])
                r_n += (x[i+1] * y[i])
            else:
                break

        return ((abs(r_p - r_n))/2)
4

2 に答える 2

2
  • コメントが必要な短い変数名は使用しないでください。機能を示す名前を使用します。

  • listは組み込みリスト型の名前です。したがって、Python ではその名前を置き換えることができますが、スタイル的には悪い考えです。

  • ,ステートメントであるべきものを区切るために使用すべきではありません。を使用することもできます;が、一般的には別の行に配置する方が適切です。あなたの場合、.append副作用のために使用しているため、たまたま機能しますが、基本的には、2タプル(None, None)(からの戻り値.append)を構築してそれを捨てることです。

  • 標準のリスト変換には、可能な場合は組み込み関数を使用します。zipたとえば、 のドキュメントを参照してください。この変換を実際に実行する必要がない場合を除きます。隣接するポイントのペアを考慮したいので、それを行い、ループ内でそれらの座標を分解します。

  • ただし、ポイントのリストを隣接ポイントのペアのリストに変換するために使用できます:)。これにより、よりクリーンなループを記述できますzipアイデアは単純です。最初に、元のポイントに関連するすべての「次の」ポイントのリストを作成し、次にzip2 つのポイント リストをまとめます。

  • returnは関数ではないため、return括弧で囲む必要はありません。

  • 正の値と負の値を別々に集計する代わりに、1 つの値に対して符号付き演算を実行します。


def shoelace(points):
    signed_double_area = 0

    next_points = points[1:] + points[:1]

    for begin, end in zip(points, next_points):
        begin_x, begin_y = begin
        end_x, end_y = end
        signed_double_area += begin_x * end_y
        signed_double_area -= end_x * begin_y

    return abs(signed_double_area) / 2
于 2012-09-03T11:20:11.337 に答える
0

機能的には、あなたのプログラムは非常に優れています。1 つのマイナーな発言は、に置き換えるrange(len(x))ことxrange(len(x))です。これにより、プログラムがわずかに効率的になります。一般に、range作成する値の完全なリストが実際に必要な場合にのみ使用してください。これらの値をループするだけでよい場合は、 を使用しますxrange

returnまた、ステートメントにもr_p +=andステートメントにも括弧は必要ありませんr_n +=

スタイルに関しては、Python では、変数の割り当てはあなたのように行うべきではなく、=シンボルの両側に 1 つのスペースを使用して行う必要があります。

r_p = 0
r_n = 0
于 2012-09-03T09:13:54.433 に答える