使用ord()将字母转换为int(非常基本)

时间:2012-06-02 19:13:06

标签: python excel ord

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(列[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 个答案:

答案 0 :(得分:5)

不,它没有目的。即使在Python中也是1+x-65 = x-64: - )

原始开发人员可能认为理解65比64意味着更容易。但两者都是魔术数字,你最好通过将数字分配给变量来为这些数字命名。

答案 1 :(得分: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从A char加1的转移。 ord('A')会为您提供65。开发人员将ord('A')替换为最终值。

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

在这里,所做的是在性能与可读性和代码维护之间进行权衡的不良选择;至少你会期待一个解释# 65 = ord('A')的评论,你不会在这里问一个问题。

关键点:保持代码逻辑,简单,易读和易于维护,不要因为不良的崇拜优化而改变它。

相关问题