5

パイソン初心者です。あちらこちらでコードを読んで学習しようとしています。PythonでExcelファイルを開くように設計されたプログラムでこれに遭遇しました。この関数は、ord() を使用して、Excel 列の文字ラベル ('Z'、'BB'、または 'CCC') を int に変換するという単純な仕事をします。変換コードのこの部分を見るまで、私はうまく理解していました:

if clen == 1:
    return ord(column[0]) - 64
elif clen == 2:
    return ((1 + (ord(column[0]) - 65)) * 26) + (ord(column[1]) - 64)

(1 + (ord(column[0]) - 65)(ord(column[0]) - 64)を再度使用する目的は何ですか。「1 +」は冗長に見えます。これには目的がありますか?

これは完全な機能です:

def column_index_from_string(column, fast=False):
    """Convert a column letter into a column number (e.g. B -> 2)"""

    column = column.upper()

    clen = len(column)

    if not fast and not all('A' <= char <= 'Z' for char in column):
        msg = 'Column string must contain only characters A-Z: got %s' % column
        raise ColumnStringIndexException(msg)

    if clen == 1:
        return ord(column[0]) - 64
    elif clen == 2:
        return ((1 + (ord(column[0]) - 65)) * 26) + (ord(column[1]) - 64)
    elif clen == 3:
        return ((1 + (ord(column[0]) - 65)) * 676) + ((1 + (ord(column[1]) - 65)) * 26) + (ord(column[2]) - 64)
4

2 に答える 2

5

いいえ、目的はありません。1+x-65 = x-64Python でも :-)

元の開発者は、64 よりも 65 の方が意味を理解しやすいと考えていたのかもしれません。ただし、どちらもマジック ナンバーであり、変数に割り当てて数字に名前を付けた方がよいでしょう。

于 2012-06-02T19:18:19.310 に答える
4

の目的は、 -65 +1ほとんどの場合、元の開発者による不適切な最適化の試みの結果です。私は通常、次の関数を使用して Excel 列を整数値に変換します。

return reduce(lambda x,y: x*26+ord(y)-ord('A')+1, column.upper(), 0)

興味深いのはord(y)-ord('A')+1、質問の鍵を提供することです。列変数に有効なA-Z唯一の Excel 列文字列が含まれていると仮定すると、列番号は、実際には char から特定の charAに 1 を加えたシフトになります。ord('A')結果としてあなたに与えます65ord('A')開発者はその最終値に置き換えます。

そうは言っても、ここでは呼び出しを避けるための最適化ordのようですが、実際にはコードを難読化し、読みやすさを取り除いています。この関数が実際にプログラムで何百万回も呼び出される重要な関数である場合、コードを最適化するために記述する必要があるのはこのコードではありません。代わりに、すべての Excel 列名エントリがマップされた事前計算された辞書を作成します。整数値、または非常に効率的なこのようなものに。

ここで行われたことは、読みやすさとコードのメンテナンスに対するパフォーマンスのトレードオフにおいて悪い選択です。少なくとも、あなたは を説明するコメントを期待していたでしょ# 65 = ord('A')うし、それについてここで質問することもなかったでしょう。

重要なポイント: コード ロジックは、シンプルで読みやすく、保守しやすいものに保ち、最適化を望まないために変更しないでください。

于 2012-06-03T14:29:08.647 に答える