2015-06-05 3 views
-1

Я работаю над очень простым преобразователем температуры в Python (только для практики), и я борюсь с некоторыми компонентами UX. Я хотел бы иметь проверки на месте, чтобы продолжить запрос на ввод переменных, когда сделаны недопустимые записи. Мой полный код ниже:Функция проверки входного сигнала на питоне не называется должным образом

o_temp = '' 

def temp_input(o_temp): 
    o_temp = raw_input('Enter a temperature (round to nearest integer): ') 
    return o_temp 

def temp_input_check(o_temp): 
    o_temp = list(o_temp) 
    for i in o_temp: 
     if i not in '1234567890': 
      print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.' 
      temp_input(o_temp) 
     else: 
      break 

def converter(o_temp): 
    unit = raw_input('Convert to (F)ahrenheit or (C)elsius? ') 
    unit = unit.upper() 
    if unit == 'F' or unit == 'f': 
     n_temp = (9.0/5.0) * int(o_temp) + 32 
     print '%d C = %d F' % (o_temp, n_temp) 
     quit() 
    elif unit == 'C' or unit == 'c': 
     n_temp = (5.0/9.0) * (int(o_temp) - 32) 
     print '%d F = %d C' % (o_temp, n_temp) 
     quit() 
    else: #check for valid entry 
     print 'Invalid entry. Please enter F for Fahrenheit or C for Celsius' 
     unit_input() 

def temp_converter(): 
#title, call sub-functions 
    print '' 
    print 'Temperature Converter' 
    print '' 
    temp_input(o_temp) 
    temp_input_check(o_temp) 
    converter(o_temp) 

temp_converter() 

Однако, когда я ввожу неверный ввод (например, буква или сочетание букв и цифр) в o_temp строку кода, кажется, не признает, что это является недопустимым и продолжается с запросом модуля. Я неправильно возвращаю переменную? В чем проблема? Я попытался удалить первоначальное заявление o_temp, но потом я получил «NameError: глобальное имя„o_temp“не определен»

EDIT

Я пришел к этому решению, любые дополнительные предложения для уточнения кода на всех?

def converter(): 
    print 'Temperature Converter' 
    while 1: 
     temp = raw_input('Starting temperature? ') 
     try: 
      temp = float(temp) 
     except ValueError: 
      print 'Invalid entry. Please enter only the numerical temperature measurement.' 
     else: 
      break 
    while 1: 
     unit = raw_input('Convert to Fahrenheit or Celsius? ')  
     if unit.upper().startswith('F') == True: 
      print "%f C = %f F" % (temp, temp*9./5+32) 
      return False 
     elif unit.upper().startswith('C') == True: 
      print "%f F = %f C" % (temp, (temp-32)*5./9) 
      return False 
     else: 
      print 'Invalid entry. Please enter F for Fahrenheit or C for Celsius' 

converter() 
+1

Что вы собственно вопрос? Что происходит, когда вы запускаете этот код и как это отличается от ожидаемого? – kindall

+0

Извините, не закончил писать вопрос и случайно представил преждевременно. Полный код и вопрос теперь подняты! – grrothman

+0

Кроме того, причина, по которой вы получили «ошибку имени», заключается в том, что ваш o_temp никогда не назначается нигде в temp_converter. Вы передаете переменную, которая не имеет значения для ваших функций! –

ответ

0

Вы определяете некоторые функции, а затем вызываете temp_coverter(). Эта функция вызывает temp_input(otemp), посылая ей пустую строку без причины, которую я могу видеть, кроме возможности, что вы не знаете, что вы можете определить функцию без параметров. Затем эта функция возвращает значение, которое вы не сохраняете.

После этого вызывается temp_input_check(otemp), который пытается проверить ту же пустую строку. Возвращаемое значение этой функции не сохраняется, что не является большой потерей, потому что None не является особенно полезным для сохранения.

Затем converter(otemp) отправляет ту же самую старую пустую строку в фактический преобразователь. Результаты поиска.

Я рекомендую потратить некоторое время на качество с помощью tutorial.

Когда вы закончите, код должен выглядеть следующим образом:

def converter(): 
    print 'Temperature Converter' 
    unit = raw_input('Convert to Fahrenheit or Celsius? ') 
    while 1: 
     temp = raw_input('Starting temperature? ') 
     try: 
      temp = float(temp) 
     except ValueError: 
      print 'Not a valid temperature.' 
     else: 
      break 
    if unit.lower().startswith('f'): 
     print "%f C = %f F" % (temp, temp*9./5+32) 
    else: 
     print "%f F = %f C" % (temp, (temp-32)*5./9) 

converter() 
0

Ваш цикл петли введен неверно.

def temp_input_check(o_temp): 
    o_temp = list(o_temp) 
    for i in o_temp: 
     if i not in '1234567890': 
      print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.' 
      temp_input(o_temp) 
     else: 
      break 

Вы проверяете каждый символ для недействительной записи. Если вы набрали несколько недопустимых символов, он будет продолжать использовать триггер после того, как вы уже определили, что строка неверна!

Кроме того, если ваш первый символ действителен, вы говорите ему, чтобы он прерывался из цикла for (в вашем коде 1fdsdfdsf была бы допустимой температурой, поскольку он пропускал каждый символ после того, как он ударил это другое утверждение и прорыв от петля).

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

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

def temp_input_check(o_temp): 
    o_temp = list(o_temp) 
    for i in o_temp: 
     if i not in '1234567890': 
      print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.' 
      return False 
     else: 
      pass # nothing is wrong with this character, keep checking 
    return True # if we hit this line, there were no problem characters 

Затем, когда вы называете вещи:

while(1): 
    o_temp = temp_input() 
    if temp_input_check(o_temp): 
     break # this means our o_temp is allllright. 
       # otherwise, go back to the start of the loop and ask for another temp 
converter(o_temp) 
0

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

Также raw_input не будет рассматривать ввод как строку. Попробуйте input вместо этого, чтобы избежать чувствительности не использовать str, чтобы исправить цикл.

Это будет делать:

def converter(): 
    o_temp = float(raw_input('Enter a temperature (round to nearest integer): ')) 
    for i in str(o_temp): 
     if i not in ['1','2','3','4','5','6','7','8','9','0','.']: 
      print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.' 
    unit = raw_input('Convert to (F)ahrenheit or (C)elsius? ') 
    if unit in ['f','F']: 
     n_temp = (9.0/5.0) * float(o_temp) + 32 
     print '%f C = %f F' % (o_temp, n_temp) 
    elif unit in ['c','C']: 
     n_temp = (5.0/9.0) * (float(o_temp) - 32) 
     print '%f F = %f C' % (o_temp, n_temp) 
    else: #check for valid entry 
     print 'Invalid entry. Please enter F for Fahrenheit or C for Celsius' 
     unit_input() 

def temp_converter(): 
#title, call sub-functions 
    print '' 
    print 'Temperature Converter' 
    print '' 
    converter() 

print temp_converter() 
Смежные вопросы