2015-10-14 4 views
0

Итак, я представил это для курса Cousera на базовом питоне (я очень новичок в написании кода). Это сработало. Тем не менее, я нашел в нем ошибку (которую я рад, что вижу и убил горем, потому что он существует).Python 2.7 отладка базового кода

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

Заранее благодарен!

код ниже:

largest = -1 
    smallest = None 
    while True: 
     try: 
      num = raw_input('number\n') 
      float(num) 
      if num > largest: 
       largest = num 
      elif smallest is None: 
       smallest = num 
      elif smallest > num: 
       smallest = num 
     except: 
      if num =="Done": 
       print "Maximum is", largest 
       print "Minimum is", smallest 
       break 
      print "Invalid input" 

ответ

1

Добро пожаловать в мир программирования!

Обычно, когда я делаю сравнения min/max, я начинаю с отрицательной и положительной бесконечности, а не None/null или первого элемента списка, поскольку это давало мне головные боли в прошлом.

Этот код работает нормально.

largest = float("-inf") 
smallest = float("inf") 

while True: 
    try: 
     num = raw_input('number: ') 
     num = float(num) # I reassign num for good-measure 
     if num > largest: 
      largest = num 
     if num < smallest: 
      smallest = num 
    except: 
     if num == "Done": 
      print "Maximum is", largest 
      print "Minimum is", smallest 
      break 
     print "Invalid input" 
+0

переназначение Num это не только хорошая мера, это необходимо! пример OP 'float (num)' преобразует вход в float, а затем сразу же отбрасывает его! – turbulencetoo

+0

@turbulencetoo - переменные Python не печатаются, и он вызывает просто 'float (num)' без переназначения, чтобы он генерировал исключение до блока дозорного. Я сделал это так, чтобы десятичные числа не могли интерпретироваться и сравниваться как строки. –

+0

Я удивлен, узнав, что существует '>', который позволяет сравнивать между 'str' и' int', обычно python строго придерживается тех видов сопоставлений. – turbulencetoo

0

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

largest = -1 
smallest = None 

try: 
    num1 = raw_input('number\n') 
    smallest = num1 
    largest = num1 

    while True: 
     num = raw_input('number\n') 
     num = float(num) 
     if num > largest: 
      largest = num 
     elif smallest > num: 
      smallest = num 
    except: 
     if num =="Done": 
      print "Maximum is", largest 
      print "Minimum is", smallest 
      break 
     print "Invalid input" 
1

Сугубо в качестве учебного упражнения, вы могли бы использовать некоторые функции питона (generators), чтобы сделать этот код более универсальным.

Это создает генератор под названием numbers, который возвращает последовательность ввода чисел, которые собираются в виде списка в a, а затем вы можете использовать встроенные min(a), max(a) методы:

def numbers(): 
    while True: 
     try: 
      num = input('number\n') 
      yield float(num) 
     except ValueError: 
      if num == "Done": 
       break 
      print "Invalid input" 

a = list(numbers()) 
print "Maximum is", max(a) 
print "Minimum is", min(a)