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)
答案 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')
的评论,你不会在这里问一个问题。
关键点:保持代码逻辑,简单,易读和易于维护,不要因为不良的崇拜优化而改变它。