2015-08-24 4 views
1

Так что я пытаюсь сделать программу для преобразования единиц, чтобы избежать использования метода меток-меток в моем классе физики. Я вычислил общий код для него, но к концу у меня будет 35 функций для определения. Ниже приведен код, который у меня до сих пор, с каждым модулем, который я хотел бы иметь возможность конвертировать сверху. Непосредственно ниже каждого из них возможно преобразование с использованием этих единиц. Беда в том, что я хотел бы не выполнять функции для каждого из этих возможных преобразований. Код, который я закончил до сих пор лишь немногие из этих подразделений, но его можно найти в безделушку по этой ссылке:Как сконденсировать кучу функций в Python?

   # km & m & cm & mm & M & ft & In 
#km to m | m to km | cm to km | mm to km | M to km | ft to km | In to km 
#km to cm | m to cm | cm to m | mm to m | M to m | ft to m | In to m 
#km to mm | m to mm | cm to mm | mm to cm | M to cm | ft to cm | In to cm 
#km to M | m to M | cm to M | mm to M | M to mm | ft to mm | In to mm 
#km to ft | m to ft | cm to ft | mm to ft | M to ft | ft to M | In to M 
#km to In | m to In | cm to In | mm to In | M to In | ft to In | In to ft 



def km_to_M_conv(): 
    km=float(input("How many km?")) 
    result = km * .621371192 
    sentence = '{} km is equal to {} M.'.format(km, result) 
    print sentence 

def M_to_km_conv(): 
    M=float(input("How many m?")) 
    result = M * 1.60934 
    sentence = '{} M is equal to {} km.'.format(M, result) 
    print sentence 

def km_to_m_conv(): 
    km=float(input("How many km?")) 
    result = km * 1000 
    sentence = '{} km is equal to {} m.'.format(km, result) 
    print sentence 

def mm_to_cm_conv(): 
    mm=float(input("How many mm?")) 
    result = mm * .1 
    sentence = '{} mm is equal to {} cm.'.format(mm, result) 
    print sentence 

def cm_to_mm_conv(): 
    cm=float(input("How many cm?")) 
    result = cm * 10 
    sentence = '{} cm is equal to {} mm.'.format(cm, result) 
    print sentence 

welcome=input("What would you like to convert?") 
if welcome == ("mm to cm"): 
    mm_to_cm_conv() 
if welcome == ("cm to mm"): 
    cm_to_mm_conv() 
if welcome == ("km to M"): 
    km_to_M_conv() 
if welcome == ("M to km"): 
    M_to_km_conv() 

Я все еще довольно новый для Python, так терпите меня. Благодаря!

+0

Добро пожаловать. При публикации кода вы должны опубликовать его прямо здесь, отформатировать правильно (это так же просто, как добавить 4 пробела перед каждой строкой). – spectras

ответ

4

фактор общего кода:

def converter(source, target, factor): 
    qty = float(input("How many %s?")) 
    result = qty * factor 
    print '{} {} is equal to {} {}.'.format(qty, source, result, target) 

def km_to_miles(km): 
    converter('km', 'miles', 0.621371) 

Update:

, если вы хотите быть действительно умны вы можете динамически создавать функции, как это:

CONVERSIONS = (
    ('km', 'miles', 0.621371), 
    ('metres', 'feet', 3.28084), 
    ('litres', 'gallons', 0.264172), 
) 

for from, to, factor in CONVERSIONS: 
    func_name = '%s_to_%s' % (from, to) 
    func = lambda x: x * factor 
    globals()[func_name] = func 

    reverse_func_name = '%s_to_%s' % (to, from) 
    reverse_func = lambda x: x * (1/factor) 
    globals()[reverse_func_name] = reverse_func 
+1

Я бы не квалифицировал «генерацию динамических функций» как «действительно умный», но, наоборот, «умный парень» действительно имел бы что-то, что легче понять и поддерживать в долгосрочной перспективе (здесь, сделано. ..). –

+0

Как кто-то, кто должен был обновить и использовать более старый код, который (ab) использовал 'globals()' и подобные отражающие функции, я хотел бы повторить замечания @ brunodesthuilliers. Этот тип вещей выглядит скребком, но он быстро становится кошмаром, если документация не является фантастической (а документация практически не фантастична). Помните [zen] (https://www.python.org/dev/peps/pep-0020/), в частности «Простой лучше, чем сложный». и «Чтение рассчитывается». – or1426

4

я бы выбрал стандарт (вероятно, метров) и держите словарь (если вы не знаете, что такое dictionary, то посмотрите их/играйте с ними немного, так как они очень полезны), хранящиеся в том, как долго каждая единица находится в e стандартная единица. Например:

conversion_factors_dict = {'m': 1, 
          'cm': 0.01, 
          'ft':0.305} 

Тогда ваша функция должна принять ряд, а «источник» блок и «назначения» блок. Сначала конвертируйте исходный блок в свой стандарт (метры), а затем преобразуйте его в блок назначения. Например:

def convert(number, source, destination, conversion_factors_dict): 
    input_in_metres = number * conversion_factors_dict[source] 
    input_in_destination_units = input_in_metres/conversion_factors_dict[destination] 
    return "{}{} = {}{}".format(number, source, input_in_destination_units, destination) 
+0

Это кажется самым разумным подходом ко мне, потому что дублирование кода может быть минимальным. – Wolf

0

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

factors = {'mm to cm' : 0.1, 'cm to mm' : 10, 'km to M' : .621371192} # You may like to define more conversion factors here 

welcome = input("What would you like to convert?") 
frm, _, to = welcome.split() 
distance = input("How many "+frm+" ?") 

print (str(distance)+frm+' is equal to ' +str(float(distance)*factors[welcome])+ to 
+0

Прошу прощения, я не уверен, что полностью понимаю. У меня есть следующее: – Helsman323

+0

Я только что создал коллекцию пары ключевых значений, которая служит для ваших различных функций. Попробуйте распечатать каждую переменную, и вы узнаете, как это работает. – ZdaR

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