2017-02-07 43 views
0

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

Для этого задания с открытого курса в Мичигане мне было поручено попросить пользователя ввести его до тех пор, пока пользователь не вступит в «сделанный», и в этот момент код должен рассчитать наибольшую, наименьшую сумму и среднюю. Во всех моих тестах все работает нормально. Но я чувствую, что есть, вероятно, гораздо более простой способ написать этот код. Может ли кто-нибудь предложить предложения для улучшения?

largest = None 
smallest = None 
count = 0 
sum = 0 
while True: 
    try: 
     num = raw_input("Enter a number: ") 
     if num == "done" : break 
     num = float(num) 
     count = count + 1 
     sum = sum + num 
     avg = sum/count 
     if largest is None: 
      largest = num 
     if smallest is None: 
      smallest = num 
     if num < smallest: 
      smallest = num 
     elif num > largest: 
      largest = num 
     continue 
    except: print 'Invalid input' 

print "Maximum is", int(largest) 
print "Minimum is", int(smallest) 
print "Count:", int(count) 
print "Sum:", int(sum) 
print "Average:", avg 
+0

Почему вы используете 'float' и позже конвертируете обратно в' int'? –

+0

Я хотел усреднить, чтобы плавать, но все остальное - int. Если бы я не указывал int или float, то в предложении try было бы работать нечисловое значение. Но если я начал с int, я не смог получить float (средний). Имеет ли это смысл? Есть ли лучший способ сделать это? –

ответ

1

Ну есть несколько вещей здесь:

  • вы можете уронить continue заявление, так как это конец петли в любом случае;
  • вы можете сжать операторы if в if largest is None or num > largest:, это будет короткое замыкание и сделать петлю меньшей;
  • Вы можете использовать x += y вместо x = x + y; и
  • не нужно рассчитать среднее значение внутри петля; вычисляя его один раз, когда цикл завершается, достаточно.

Итак:

largest = None 
smallest = None 
count = 0 
sum = 0 
while True: 
    try: 
     num = raw_input("Enter a number: ") 
     if num == "done" : break 
     num = float(num) 
     count += 1 
     sum += num 
     if largest is None or num > largest: 
      largest = num 
     if smallest is None or num < smallest: 
      smallest = num 
    except: print 'Invalid input' 

print "Maximum is", int(largest) 
print "Minimum is", int(smallest) 
print "Count:", int(count) 
print "Sum:", int(sum) 
print "Average:", sum/count 

Но с точки зрения большой ой, вы не можете улучшить много: вычисления суммы и т.д. просто требуют O (N) и это также стоит O (n), чтобы прочитать ввод в любом случае.

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

largest = None 
smallest = None 
count = 0 
sum = 0 
while True: 
    try: 
     num = raw_input("Enter a number: ") 
     if num == "done" : break 
     num = float(num) 
     count += 1 
     sum += num 
     if largest is None or num > largest: 
      largest = num 
     if smallest is None or num < smallest: 
      smallest = num 
    except ValueError: print 'Invalid input' 

print "Maximum is", int(largest) 
print "Minimum is", int(smallest) 
print "Count:", int(count) 
print "Sum:", int(sum) 
print "Average:", sum/count
+0

Большое спасибо! Это все очень полезно! Рекомендуется ли указывать исключение, главным образом, чтобы сделать код более понятным (для отладки и что-нет)? Или есть еще одно преимущество? –

+0

@LaurenGainsbrook: ну в этом случае это не имеет большого значения. Но скажем, например, вы также собираетесь открывать файлы в цикле и т. Д. Теперь скажем, что открытие файла сбой: вы хотите показать * Недопустимый ввод? *, Вероятно, нет, вы хотите показать выделенное сообщение или прекратить выполнение программы.Если вы определяете функции, вы всегда должны обрабатывать исключение, которое, по вашему мнению, вы можете * обрабатывать на этом уровне, напоминание должно быть передано на уровни выше (в стеке вызовов) и должно обрабатываться в этом месте. –

+0

ОК, так что в зависимости от того, что я делаю в цикле, ошибка (кроме функции) будет отличаться. Я хочу определить, какую ошибку я ожидаю, и ответьте соответствующим образом. Итак, тогда у меня могло бы быть и два исключения? Попробуйте ..... за исключением значения ошибка: ... кроме некоторая-другая-ошибка: ... –

1

Альтернативный подход для достижения этой цели является сохранение всех входов в список, а затем использовать встроенные модули min(), max(), len() и sum() найти значения:

num=raw_input("Enter a number: ") 
nums=[] 
while num!="done":  #check if user has finished entering inputs 
    try: 
     nums.append(int(num))  #append the input as an integer to a list 
     num=raw_input("Enter a number: ") #get another input 
    except ValueError: 
     print "Invalid input" 

print "Maximum is",max(nums) 
print "Minimum is",min(nums) 
print "Count:",len(nums) 
print "Sum: ",sum(nums) 
print "Average: ",sum(nums)/len(nums) 

Выход:

Enter a number: 1 
Enter a number: 2 
Enter a number: 3 
Enter a number: 4 
Enter a number: 5 
Enter a number: 6 
Enter a number: done 
Maximum is 6 
Minimum is 1 
Count: 6 
Sum: 21 
Average: 3.5 
+0

Единственная проблема с этим, я думаю, в том, что если вы введете миллиарды чисел, у вас не хватит памяти. –

+0

Спасибо - я просмотрю списки чуть больше. @WillemVanOnsem Является ли память проблемой только при использовании списка? Итак, если бы я ожидал миллиарды чисел, я бы не использовал список? –