Код преобразования температуры

В настоящее время я создаю программу, которая может конвертировать различные единицы измерения для температуры. Он включает конверсии для Цельсия, Фаренгейта, кельвина и газовой метки. Может кто-то сказать мне, как я мог бы сделать мой код проще, поэтому я могу добавить больше единиц измерения температуры (например, Rankine). Кроме того, есть ли способ перестать использовать большие пробелы в моих котировках ввода, чтобы получить их по строкам?

print ("Welcome to the temperature converter, please choose which measurement you want to convert TO")
print (" ")
which = input("If you want to convert TO a fahrenheit value, press f.                                         If you want to convert TO a celcius value, press c.                                  If you want to convert TO a kelvin value, press k.                                   If you want to convert TO a gas mark value, press g.")
if which == "f":
 print (" ")
 print ("Now choose the measurement you are converting FROM")
 fwhich = input("If you want to convert FROM a celcius value, press c.                                 If you want to convert FROM a kelvin value press k.                                    If you want to convert FROM a gas mark value, press g.")
 if fwhich == "c":
  print (" ")
  celcius = float(input("Input the celcius value: "))
  fahrenheit = (celcius*(9/5)+32)
  print ("In fahrenheit, this is " , fahrenheit)
 elif fwhich == "k":
  print (" ")
  kelvin = float(input("Input the kelvin value: "))
  fahrenheit = (1.8 * (kelvin - 273) + 32)
  print ("In fahrenheit, this is " , fahrenheit)
 elif fwhich == "g":
  print (" ")
  gasmark = float(input("Input the gas mark value: "))
  fahrenheit = 250 + (gasmark * 25)
  print ("In fahrenheit, this is " , fahrenheit)
 else:
  print (" ")
  print ("Error, you didn't enter any of the specified keys")
elif which == "c":
 print (" ")
 print ("Now choose the measurement you are converting FROM")
 cwhich = input("If you want to convert FROM a fahrenheit value, press f.                               If you want to convert FROM a kelvin value, press k.                                 If you want to convert FROM a gas mark value, press g.")
 if cwhich == "f":
  print (" ")
  fahrenheit = float(input("Input the fahrenheit value: "))
  celcius = (fahrenheit - 32)*(5/9)
  print ("In celcius, this is " , celcius)
 elif cwhich == "k":
  print (" ")
  kelvin = float(input("Input the kelvin value: "))
  celcius = kelvin - 273
  print ("In celcius, this is " , celcius)
 elif cwhich == "g":
  print (" ")
  gasmark = float(input("Input the gas mark value: "))
  celcius = 130 + (gasmark * 10)
 else:
  print (" ")
  print ("Error, you didn't enter any of the specified keys")
elif which == "k":
 print (" ")
 print ("Now choose the measurement you are converting FROM")
 kwhich = input("If you want to convert FROM a fahrenheit value, press f.                               If you want to convert FROM a celcius value, press c.                                 If you want to convert FROM a gas mark value, press g.")
 if kwhich == "f":
  print (" ")
  fahrenheit = float(input("Input the fahrenheit value: "))
  kelvin = ((5/9) * (fahrenheit - 32) + 273)
  print ("In kelvin, this is " , kelvin)
 elif kwhich == "c":
  print (" ")
  celcius = float(input("Input the celcius value: "))
  kelvin = (celcius + 273)
  print ("In kelvin, this is " , kelvin)
 elif kwhich == "g":
  print (" ")
  gasmark = float(input("Input the gas mark value: "))
  kelvin = ((130 + (gasmark * 10))+ 273)
  print ("In kelvin, this is " , kelvin)
 else:
  print (" ")
  print ("Error, you didn't enter any of the specified keys")
elif which == "g":
 print (" ")
 print ("Now choose the measurement you are converting FROM")
 gwhich = input("If you want to convert FROM a fahrenheit value, press f.                               If you want to convert FROM a celcius value, press c.                                 If you want to convert FROM a kelvin value, press k.")
 if gwhich == "f":
  print (" ")
  fahrenheit = float(input("Input the fahrenheit value: "))
  gasmark = (fahrenheit / 25) - 10
  print ("In gas mark, this is " , gasmark)
 elif gwhich == "c":
  print (" ")
  celcius = float(input("Input the celcius value: "))
  gasmark = ((celcius / 10) -13)
  print ("In gas mark, this is " , gasmark)
 elif gwhich == "k":
  print (" ")
  kelvin = float(input("Input the kelvin value: "))
  gasmark = (((kelvin - 273) / 10) -13) 
  print ("In gas mark, this is " , gasmark)
 else:
  print (" ")
  print ("Error, you didn't enter any of the specified keys")
else:
 print (" ")
 print ("Error, you didn't enter any of the specified keys")
11 голосов | спросил Joseph McCoy 29 MarpmWed, 29 Mar 2017 15:43:20 +03002017-03-29T15:43:20+03:0003 2017, 15:43:20

4 ответа


10

Прежде всего, Python имеет официальный стиль-руководство, PEP8 . Он рекомендует использовать 4 пробела как отступ, а не 1, что делает код намного легче читать.

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

Для преобразования температуры имеет смысл сначала преобразовать в один базовый блок (Кельвин является очевидным выбором для температуры, но вы также можете пойти на Ранкин, если вы действительно хотите). Таким образом, вам не нужно определять все преобразования всех единиц во все другие единицы, только к базовому блоку и от него.

Вот начало:

def temperature_C_to_K(temp_C):
    return temp_C + 273.15

def temperature_K_to_C(temp_K):
    return temp_K - 273.15

def temperature_F_to_K(temp_F):
    return 5./9 * (temp_F - 32) + 273.15

def temperature_K_to_F(temp_K):
    return 1.8 * (temp_K - 273.15) + 32

to_K_from = {"c": temperature_C_to_K,
             "f": temperature_F_to_K,
             "k": lambda t: t}
from_K_to = {"c": temperature_K_to_C,
             "f": temperature_K_to_F,
             "k": lambda t: t}

if __name__ == "__main__":
    kelvin = to_K_from["c"]
    fahrenheit = from_K_to["f"]
    temperature = 33
    print(fahrenheit(kelvin(temperature)))

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

from_unit = input("From which unit? ").lower()
temperature = float(input("What temperature in that unit? "))
to_unit = input("Convert to which unit? ").lower()
print(from_K_to[to_unit](to_K_from[from_unit](temperature)))

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

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

def convert(temperature, from_unit, to_unit):
    return from_K_to[to_unit](to_K_from[from_unit](temperature))
ответил Graipher 29 MarpmWed, 29 Mar 2017 16:53:54 +03002017-03-29T16:53:54+03:0004 2017, 16:53:54
16

Самая большая проблема с вашим кодом - это количество повторений. Вы можете уменьшить это, указав класс Unit:

class Unit(object):
    "A temperature unit that can be linearly converted to or from Kelvins."
    def __init__(self, name, slope, intercept):
        self.name = name
        self.slope = slope
        self.intercept = intercept

    def to_kelvins(self, t):
        return self.intercept + t / self.slope

    def from_kelvins(self, k):
        return (k - self.intercept) * self.slope

Теперь мы можем создать словарь единиц, с помощью одной буквы, которую пользователь будет выбирать из них:

all_units = {
    "k": Unit("kelvins", 1.0, 0.0),
    "c": Unit("Celsius", 1.0, 273.15),
    "r": Unit("rankin", 9.0/5, 0.0),
    "f": Unit("Fahrenheit", 9.0/5, 255.37),
    "g": Unit("Gas Mark", 9.0/125, 255.37+250*5.0/9),
}

Давайте быстро рассмотрим выше:

if __name__ == '__main__':
    for i in [0, 255.37, 273.15, 373.15, 473.15]:
        for unit in all_units.values():
            print("%.2f K is %.2f %s" % (i, unit.from_kelvins(i), unit.name))
        print()

Это дает ожидаемый результат:

 0.00 K is 0.00 kelvins
0.00 K is -273.15 Celsius
0.00 K is 0.00 rankin
0.00 K is -28.39 Gas Mark
0.00 K is -459.67 Fahrenheit

255.37 K is 255.37 kelvins
255.37 K is -17.78 Celsius
255.37 K is 459.67 rankin
255.37 K is -10.00 Gas Mark
255.37 K is 0.00 Fahrenheit

273.15 K is 273.15 kelvins
273.15 K is 0.00 Celsius
273.15 K is 491.67 rankin
273.15 K is -8.72 Gas Mark
273.15 K is 32.00 Fahrenheit

373.15 K is 373.15 kelvins
373.15 K is 100.00 Celsius
373.15 K is 671.67 rankin
373.15 K is -1.52 Gas Mark
373.15 K is 212.00 Fahrenheit

473.15 K is 473.15 kelvins
473.15 K is 200.00 Celsius
473.15 K is 851.67 rankin
473.15 K is 5.68 Gas Mark
473.15 K is 392.00 Fahrenheit

Теперь мы можем работать на входе и выходе. Это необходимо для выбора единицы ввода и значения. Учитывая это, мы можем вычислить температуру (Кельвина), используя input_unit.to_kelvin(). Когда пользователь выбирает выходной блок, мы можем использовать output_unit.from_kelvin() для вычисления результата:

if __name__ == '__main__':
     # N.B. all error-checking is left as an exercise
    input_unit = all_units[input("From which unit? ")]
    input_value = float(input("What temperature, in %s? " % input_unit.name))
    kelvin_temp = input_unit.to_kelvins(input_value)
    output_unit = all_units[input("To which unit? ")]
    output_value = output_unit.from_kelvins(kelvin_temp)
    print("%.2f %s is %.2f %s" % (input_value, input_unit.name, output_value, output_unit.name))
ответил Toby Speight 29 MarpmWed, 29 Mar 2017 17:05:51 +03002017-03-29T17:05:51+03:0005 2017, 17:05:51
1

Я бы посоветовал вам скачать PyCharm, чтобы написать свой код. Он автоматически сообщает вам о стандартном синтаксисе python, а также вместо огромных пробелов, используя «input ()», попробуйте использовать Console.writeline () и Console.readline () {readline или writeline и добавьте новые строки в конце}

Кроме того, как предложил г-н Спейт, использование классов - путь. Ура!

ответил BikerDude 30 MarpmThu, 30 Mar 2017 20:39:09 +03002017-03-30T20:39:09+03:0008 2017, 20:39:09
0

Спасибо всем, я переписал свой код, чтобы теперь включить каждую температуру, которую я могу найти (если мне больше говорят). Вот мой новый код:

import sys
print ("Welcome to the temperature converter, please enter the unit you wish to convert FROM:")
print ("")
FROM = input("Type 'celcius', 'fahrenheit', 'kelvin', 'gas mark', 'rankine', 'delisle', 'newton', 'reaumur' or 'romer'").lower()
if FROM == "celcius" or FROM == "fahrenheit" or FROM == "kelvin" or FROM == "gas mark" or FROM == "rankine" or FROM == "delisle" or FROM == "newton" or FROM == "reaumur" or FROM == "romer": 
    print ("")
    VALUE = int(input("Now input the temperature in that unit"))
    if FROM == "celcius":
        kelvin = (VALUE + 273)
    elif FROM == "fahrenheit":
        kelvin = ((5/9) * (VALUE - 32) + 273)
    elif FROM == "kelvin":
        kelvin = VALUE
    elif FROM == "gas mark":
        kelvin = ((130 + (VALUE * 10))+ 273)
    elif FROM == "rankine":
        kelvin = (VALUE * (5/9))
    elif FROM == "delisle":
        kelvin = (373 - (VALUE * (2/3)))
    elif FROM == "newton":
        kelvin = (VALUE * (100/33) + 273) 
    elif FROM == "reaumur":
        kelvin = (VALUE * (5/4) + 273)
    elif FROM == "romer":
        kelvin = ((VALUE - 7.5) * (40/21) + 273)
else:
    print("")
    print ("You did not enter any of the specified words")
    sys.exit(1)
print ("")
TO = input("Now input the unit you wish to convert TO: Type 'celcius', 'fahrenheit', 'kelvin', 'gas mark', 'rankine', 'delisle', 'newton', 'reaumur' or 'romer'").lower()
if TO == "celcius" or TO == "fahrenheit" or TO == "kelvin" or TO == "gas mark" or TO == "rankine" or TO == "delisle" or TO == "newton" or TO == "reaumur" or TO == "romer":
    print ("")
    if TO == "celcius":
        END = (kelvin - 273)
    elif TO == "fahrenheit":
        END = (1.8 * (kelvin - 273) + 32)
    elif TO == "kelvin":
        END = kelvin
    elif TO == "gas mark":
        END = (((kelvin - 273) / 10) -13) 
    elif TO == "rankine":
        END = (kelvin * (9/5))
    elif TO == "delisle":
        END = ((373 - kelvin) * (3/2))
    elif TO == "newton":
        END = ((kelvin - 273) * (33/100))
    elif TO == "reaumur":
        END = ((kelvin - 273) * (4/5)) 
    elif TO == "romer":
        END = ((kelvin - 273) * (21/40) + 7.5)
else:
    print ("")
    print ("You did not enter any of the specified words")
    sys.exit(1)

print ("Your" ,  FROM , "value of" , VALUE , ", is" , END , "in" , TO )
ответил Joseph McCoy 31 MarpmFri, 31 Mar 2017 16:47:22 +03002017-03-31T16:47:22+03:0004 2017, 16:47:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132