5

Python初学者在这里。尝试通过阅读这里和那里的代码来学习。在一个旨在用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-64即使在 Python 中 :-)

可能最初的开发人员认为 65 的含义比 64 更容易理解。不过,两者都是幻数,最好通过将它们分配给变量来为数字命名。

于 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为您提供了问题的关键。假设 column 变量包含一个A-Z仅有效的 Excel 列字符串,则列号实际上是给定 char 从Achar 的移位加一。ord('A')结果会给你65。开发人员用ord('A')其最终值替换。

也就是说,是的,这似乎是一种避免调用的优化ord,但它确实混淆了代码并消除了可读性,因为我认为获得的时间很少。如果此函数确实是在程序中被调用数百万次的关键函数,那么这不是必须编写来优化代码的代码 - 您将创建一个预先计算的字典,其中映射了所有 Excel 列名条目到它们的整数值,或者类似这样的东西,这将是非常有效的。

在这里,在性能与可读性和代码维护之间进行权衡是一个糟糕的选择;至少您会期待评论解释# 65 = ord('A'),并且您不会在这里提出有关它的问题。

关键点:保持代码逻辑,简单,可读,易于维护,不要为了糟糕的优化而改变它。

于 2012-06-03T14:29:08.647 回答