2012-06-02 4 views
4

Python beginner here. Попытка учиться, читая код здесь и там. Это произошло в программе, предназначенной для открытия файлов Excel в python. Эта функция выполняет простую работу - преобразует метку письма столбца Excel («Z» или «BB» или «CCC») в int, используя ord(). Я понимала прекрасно, пока я не видел эту часть кода преобразования:Использование ord() для преобразования букв в ints (очень простой)

if clen == 1: 
    return ord(column[0]) - 64 
elif clen == 2: 
    return ((1 + (ord(column[0]) - 65)) * 26) + (ord(column[1]) - 64) 

Какова цель (1 + (Ord (столбец [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) 

ответ

5

нет, это не имеет целей.? 1+x-65 = x-64 даже в Python :-)

Возможно, первоначальный разработчик считал, что было легче понять, что означает 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, что дает вам ключ от вашего вопроса. Предполагая, что переменная столбца содержит допустимую строку столбца Excel только A-Z, номер столбца фактически является сдвигом заданного символа от A char plus one. ord('A') даст вам 65. Разработчик заменяет ord('A') своим конечным значением.

Это говорит, да это, кажется, здесь в оптимизации избежать вызова ord, но это на самом деле запутывания кода и удаления читабельность Я думаю, что мало времени получил. Если эта функция действительно является важной функцией, которая называется миллион раз в программе, то это не этот код, который должен быть написан для оптимизации кода - вместо этого вы создадите предварительно рассчитанный словарь со всеми именами столбцов столбца Excel, которые он отображает к их целочисленному значению, или что-то подобное, что было бы очень эффективно.

Вот что было сделано, это плохой выбор в сравнении эффективности с читабельностью и обслуживанием кода; по крайней мере, вы ожидали комментария, объясняющего # 65 = ord('A'), и вы бы не задали вопрос об этом здесь.

Ключевой момент: сохранить логику кода, простую, читабельную и простую в обслуживании и не менять ее для плохих оптимизаций wannabe.