0

Я делаю функцию преобразования единиц для Python для удовольствия.Элегантный список условий в Python

Это мой код, до сих пор:

def UnitConverter(number,*units): 
    if units == ("feet","inches"): 
     return number*12 
    elif units == ("ft","yd"): 
     return number/3 

Вы, вероятно, получить представление о том, как у меня эту работу.

Потому что я одержим элегантностью, хорошей практикой кода и общим потоком, я хочу знать, что вы, кодеры, думаете об этом вообще, в дополнение к моему основному вопросу: Как я могу эффективно проверить список перестановки в заявлении if?

Пример: Есть ли эффективный способ сделать эту работу?

def UnitConverter(number,*units): 
    if units == (("feet" or "foot" or "ft."),("inches" or "in" or "in.")): 
     return number*12 
    elif units == ("ft","yd"): 
     return number/3 

Если нет, то есть способ перестроить свою программу таким образом, что кто-то может ввести три аргумента number, unit1, unit2 таким образом, что на конце кодирования, я фактически может включать в себя все альтернативные варианты написания каждого блока (feet, foot, ft, etc)?

Я действительно ценю мнение каждого.

Спасибо!

+1

Почему вы принимающему '* units', а затем несколько раз неявно заставляя его быть два значения, вместо того, чтобы просто принимать, скажем, 'fromunit, tounit' как два отдельных параметра? – abarnert

+1

Кроме того, попытка обработки декартова произведения N единиц с N-1 другими устройствами будет означать много кода, если N намного лучше, чем 3.Почему бы не сделать это в два этапа: конвертировать из 'fromunit' в каноническую единицу, а затем преобразовать из канонического элемента в' tounit'. Тогда вам нужны только условия N * 2 'if' вместо N ** 2. – abarnert

+1

+1 для abarnert, за исключением того, что make 'from_unit' и' to_unit' –

ответ

3

Я бы выбрал стандартную единицу длины, допустим, m. Тогда я бы один словарь, который дает коэффициент для каждого другого устройства, а также конвертировать:

conversion_factors = { 
    'foot': 0.3048, # Google search '1 foot in m' 
    'yard': 0.9144, 
    # etc 
} 

def unit_convert(number, from_unit='m', to_unit='m'): 
    m = number * conversion_factor[from_unit] 
    return m/conversion_factor[to_unit] 

Для синонимов (ноги, фута, и т.д.), вы могли бы сделать второй словарь и поиск канонического имени в том, что первом :

conversion_factors = { ... } # as above 

synonyms = { 
    'feet': 'foot', 
    'ft': 'foot', 
    ... 
} 

def unit_convert(number, from_unit='m', to_unit='m'): 
    from_unit = synonyms.get(from_unit, from_unit) 
    to_unit = synonyms.get(to_unit, to_unit) 
    # etc 

... или просто положить их в conversion_factors словарных несколько раз:

conversion_factors = { 
    'foot': 0.3048, # Google search '1 foot in m' 
    'feet': 0.3048, 
    'ft': 0.3048, 
    'yard': 0.9144, 
    # etc 
} 
+0

Это именно то, как я бы это написал ... но вы должны добавить один пример того, как он решает проблему, с которой столкнулся OP, в первую очередь: несколько имен для одного и того же устройства. Просто добавьте «ноги»: 0.3048, '. – abarnert

1

Возможно, что-то вроде следующего, используя in оператор, который проверяет для локализации:

def UnitConverter(number,*units): 
    feet = {'feet', 'foot', 'ft.'} 
    inches = {'inches', 'in', 'in.'} 
    yards = {'yard', 'yd', 'yd.'} 
    if units[0] in feet and units[1] in inches: 
     return number*12 
    elif units[0] in feet and units[1] in yards: 
     return number/3 
4

Используйте наборы.

foot_units = {"ft.", "feet", "foot"} 

Тогда вы можете проверить право собственности на комплекты.

if(units[0] in foot_units): 
    ... 

Вне этого сделайте словарь conversion_factor, который перейдет на общий элемент преобразования. Затем вы можете принудить вас к финалу.

inches -> feet -> yards 
inches -> feet -> feet 

RemcoGerlich имеет хорошее решение для этого шага.

+0

Если вы хотите упростить это, я бы использовал одну таблицу 1D для преобразования каждого блока в/из одного канонического устройства вместо 2D-таблицы, которая будет взорваться комбинаторно (и все мы знаем, насколько беспорядочно,), как и код OP. – abarnert

Смежные вопросы