使用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(column [0]) – 64)的目的是什么?“1+”似乎是多余的,这是否有目的?

这是完整的function:

 def column_index_from_string(column, fast=False): """Convert a column letter into a column number (eg 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 AZ: 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) 

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

原来的开发者可能认为理解65是什么比64更容易。两者都是神奇的数字,你最好把数字赋给variables。

-65 +1的目的主要是由原始开发人员进行糟糕的优化尝试所致。 我通常使用以下函数将Excel列转换为整数值:

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

有趣的部分是ord(y)-ord('A')+1 ,它给了你问题的关键。 假设列variables包含一个有效的AZ唯一的Excel列string,列号实际上是一个给定字符从A字符加一的移位。 ord('A')会给你65个结果。 开发人员用其最终值replaceord('A')

这是说,是的,这似乎是在这里优化,以避免调用ord ,但它真的混淆了代码,并删除可读性,我认为几时间了。 如果这个函数确实是一个在程序中被调用了数百万次的关键函数,那么这个代码就不是为了优化代码而编写的,而是要创build一个预先计算好的字典,其中包含所有Excel列名称条目到它们的整数值,或类似的东西,这将是非常有效的。

在这里,所做的是在性能与可读性和代码维护的平衡方面做出错误的select。 至less你会想到解释# 65 = ord('A') ,你不会在这里提出一个问题。

要点:保持代码逻辑简单,易读易维护,不要因为恶意的优化而改变它。