使用ord()函数将字母转换为整数(非常基础)

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)
2个回答

5
不,它没有任何目的。即使在Python中,1+x-65 = x-64也是成立的 :-)
可能原始开发人员认为理解65比64更容易。但两个数字都是神奇数字,最好将它们赋值给变量并命名。

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列字符串,则列号实际上是给定字符从A字符开始的移位加一。ord('A')将给出65作为结果。开发人员用其最终值替换ord('A')
也就是说,是的,这似乎是一种优化方式,可以避免调用ord,但这实际上使代码混淆,减少可读性,并且我认为为了节省时间而得到的收益很少。如果此函数确实是程序中被调用数百万次的关键函数,则不能编写此代码来优化代码 - 您将创建一个预先计算好的字典,其中包含所有Excel列名称条目,并将其映射到其整数值,或者类似此类的东西,这将非常高效。
这里所做的不好的选择是在性能与可读性和代码维护之间做出的折衷; 至少您应该期望有一条注释解释# 65 = ord('A'),并且您不必在这里提问。
重点:保持代码逻辑简单、易读、易于维护,并且不要为了坏的仿冒优化而更改代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接