2014-12-06 3 views
1

Я пытаюсь написать функцию python, которая преобразует celsius и farenheit, а затем программу, которая сначала запрашивает временную шкалу (c или f), а затем значение temp, а затем преобразуется в другую. То, что я до сих пор:преобразование температуры

def convert_temp(source_temp, scale): 
    if scale == 'c': 
     return(tmp-32.0)*(5.0/9.0) 
    elif scale == 'f': 
     return(tmp*(9.0/5/0))+32 

source_temp = int(input)'Key in temp:')) 
scale = input('(c) or (f)?') 
y = conv(source_temp,scale) 
print(tmp, 'in ',scale,"='s",y) 

Однако, когда я пытаюсь запустить программу, я получаю много TraceBack и синтаксических ошибок. Что я делаю не так??

+0

Редактировать включить отслеживающий в теле вопроса. – shuttle87

+3

9.0/5/0 даст ZerodivisionError – Hackaholic

+0

у вас есть несоответствие parens 'source_temp = int (input) 'Key in temp:'))' – Victory

ответ

2

заменить это:

9.0/5/0  # you will get ZeroDivisionError 

к:

9.0/5.0 

заменить это:

source_temp = int(input)'Key in temp:')) # there should be opening bracket after input 

к:

source_temp = int(input('Key in temp:')) 

заменить это:

y = conv(source_temp,scale) 

к:

y = conv_temp(source_temp,scale) 

внести изменения в Уре операторе печати:

print(source_tmp, 'in ',scale,"='s",y)  # here tmp was not defined, its source_tmp 
0

несбалансированные скобки в этом заявлении, по крайней мере часть проблемы:

source_temp = int(input)'Key in temp:')) 

Попробуйте вместо этого:

source_temp = int(input('Key in temp:')) 

также: conv() не то же самое, как convert_temp(), raw_input() вместо input(), деление на ноль и т.д.

+0

Его непонятно его 2x или 3x, поэтому, если OP с использованием 3x raw_input повысит ошибку синтаксиса – Hackaholic

2

Там есть ряд проблем в коде.

def convert_temp(source_temp, scale): 
    if scale == 'c': 
     return(tmp-32.0)*(5.0/9.0) 
    elif scale == 'f': 
     return(tmp*(9.0/5/0))+32 

Во-первых, tmp не определено в этой области. Ваш параметр называется source_temp, а не tmp. Изменение определения функции исправит эту ошибку. Кроме того, вы сделали опечатку в одном из своих выражений и заменили точку косой чертой. Эта функция будет работать должным образом:

def convert_temp(tmp, scale): 
    if scale == 'c': 
     return(tmp-32.0)*(5.0/9.0) 
    elif scale == 'f': 
     return(tmp*(9.0/5.0))+32 

Далее, вы сделали несколько синтаксических ошибок в тексте вашей программы:

source_temp = int(input)'Key in temp:')) 

У вас есть несовпадение скобки в этой строке. Он должен быть

source_temp = int(input('Key in temp:')) 

Далее вниз:

y = conv(source_temp,scale) 

conv() не является функция.Вместо этого, вы должны использовать функцию convert_temp() вы определили

y = convert_temp(source_temp,scale) 

Наконец,

print(tmp, 'in ',scale,"='s",y) 

tmp теперь не определен. Используйте переменную source_temp, что вы определили, как таковой:

print(source_temp, ' in ',scale," ='s ",y) 
+0

Спасибо, что это здорово! Я ценю помощь, моя единственная проблема сейчас - я получаю файл «» строка 6, недопустимый синтаксис, указывающий на tmp; Я запускаю python 3.4.1 – movietime

+0

Не могли бы вы создать [pastebin] (http://pastebin.com/) вашего текущего кода? Я не получаю ошибку, хотя я запускаю 3.4.2 –

+0

def convert_temp (tmp, scale): if scale == 'c': return (tmp-32.0) * (5.0/9.0) elif scale = = 'f': return (tmp * (9.0/5.0)) + 32 tmp = int (ввод ('Ввод темпа:')) scale = input ('(c) или (f)?') y = convert_temp (temp, scale) print (tmp,' in ', scale, "=' s", y); – movietime

0

Другие ответы отлично, как к тому, что является неправильным синтаксически с кодом, но, возможно, я также рекомендую иметь только один оператор возврата. В целом считается, что в большинстве языков программирования плохая практика имеет более одного возврата. Также делать это следующим образом, предотвращает неправильное поведение во время работы, то есть, что произойдет, если вы передадите символ, кроме 'c' или 'f'. Это допустимый прецедент, особенно потому, что переданное значение происходит от ввода пользователем, и предварительных проверок для недопустимых значений нет.

def convert_temp(source_temp, scale): 
    final_temp = 0 
    if scale == 'c': 
     final_temp = (source_temp - 32.0) * (5.0/9.0) 
    elif scale == 'f': 
     final_temp = (source_temp * (9.0/5.0)) + 32 
    else: 
     raise Exception('Bad Temperature Scale') 
    return final_temp 

temp_input = int(input('Key in temp:')) 
scale_input = input('(c) or (f)?') 
y = convert_temp(temp_input, scale_input) 
print(tmp, 'in ', scale,"='s", y) 

на основе ошибок сделали это заставляет меня задаться вопросом, если дальнейшее объяснение необходимо в реальные механизмы на работе здесь. Поскольку у вас изначально было несоответствие вызова функции, а также параметров. Я подозреваю, что вы понимаете, какие переменные: символы, которые относятся к значению. source_temp и scale в вашей функции convert_temp являются переменными, локальными для функции, они не существуют вне функции, но они делают внутри. Эта концепция называется «областью». Когда функция называется, эти локальные переменные получают значение параметров в вашем вызове:

<return_variable> = convert_temp(<temp_arg>, <scale_arg>).

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

Что касается имени самой функции convert_temp, это имя, с которым вы называете свою функцию. Подобно тому, как переменные являются ссылками на значения, функции являются своего рода ссылками на поведение. Следовательно, когда вы вызываете функцию, вам нужно использовать тот же символ, с которым вы его определили.

+0

Я действительно не согласен с тем, что здесь может возникнуть проблема с более чем одним оператором 'return'. Большая проблема заключается в том, что делать, если 'scale' не' c' или 'f' (который должен быть проверен на входе). Вместо того, чтобы возвращать '0',' convert_temp() 'должен возбуждать исключение в этом случае. – xnx

+0

Это не «проблема», как «хорошая практика». Хорошо, я обновлю свой пример, чтобы выбросить исключение. Я не решался включить это, поскольку это могло быть чуть выше ОП, измеряя тип ошибок. – iceflow19

+1

Я бы сказал, что ваше мнение о количестве возвращаемых заявлений недействительно. См. Http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement –

0

Try или адаптировать эту более общую функцию:

C, F, K, R = c, f, k, r = ('C', 'F', 'K', 'R') 
SCALES = {C: (0.0, 100.0), F: (32.0, 212.0), K: (273.15, 373.15), R: (491.67, 671.67)} 

def convert(temperature, to_scale): 
    value, from_scale = temperature 
    from_scale_freeze, from_scale_boil = SCALES[from_scale] 
    to_scale_freeze, to_scale_boil = SCALES[to_scale] 
    from_scale_divisions = from_scale_boil - from_scale_freeze 
    to_scale_divisions = to_scale_boil - to_scale_freeze 
    return ((value-from_scale_freeze)*(to_scale_divisions/from_scale_divisions)+to_scale_freeze, 
      to_scale) 

my_favourite_temperature = (22, c) 

print(convert(my_favourite_temperature, k)) 
# (295.15, 'K') 
Смежные вопросы