2015-05-07 4 views
0
largest_so_far = None 
smalest_so_far = None 

value = float(raw_input(">")) 
while value != ValueError: 


    value = float(raw_input(">")) 
    if value > largest_so_far:  
      largest_so_far = value 
    elif value == "done": 
     break 



print largest_so_far 

Я думаю, что проблема с этим заключается в том, что сделано, это строка, в то время как вход - тип float.распечатать результат, как только пользовательский ввод «done»

Я также попытался это работает, используя value = raw_input(">") вместо float(raw_input(">") но печатает результат как сделано

+0

Обратите внимание, что 'в то время как значение = ValueError:' это ** не ** будет эффективным, как обработка исключений. * «Я также пробовал это без поплавка, но результат печати был выполнен!» * - что? – jonrsharpe

+0

@jonrsharpe Я отредактировал вопрос. Надеюсь, что это станет более ясным. – Freddy

ответ

2

Несколько советов:

  1. Вместо преобразование пользовательского ввода в float немедленно, почему дон вы не проверяете, действительно ли это done?

  2. Так как вы собираетесь сделать это навсегда, пока пользователь не введет done или есть ошибка значения используйте бесконечный цикл и try..except, как этот


# Start with, the negative infinity (the smallest number) 
largest_so_far = float("-inf") 
# the positive infinity (the biggest number) 
smallest_so_far = float("+inf") 

# Tell users how they can quit the program 
print "Type done to quit the program" 

# Infinite loop 
while True: 

    # Read data from the user 
    value = raw_input(">") 

    # Check if it is `done` and break out if it actually is 
    if value == "done": 
     break 

    # Try to convert the user entered value to float 
    try: 
     value = float(value) 
    except ValueError: 
     # If we got `ValueError` print error message and skip to the beginning 
     print "Invalid value" 
     continue 

    if value > largest_so_far:  
     largest_so_far = value 

    if value < smallest_so_far:  
     smallest_so_far = value 

print largest_so_far 
print smallest_so_far 

Редактировать: У отредактированного кода есть две основные проблемы.

  1. continue заявление должно быть в пределах except блока. В противном случае сравнения всегда пропускаются вообще.

  2. Когда вы сравниваете два значения разных типов, Python 2 не жалуется на это. Он просто сравнивает тип значений. Итак, в вашем случае, поскольку вы назначили largest_so_far как None, NoneType сравнивается с типом float.

    >>> type(None) 
    <type 'NoneType'> 
    >>> None > 3.14 
    False 
    >>> None < 3.14 
    True 
    

    В виду того что float типа всегда меньше, чем None тип, состояние

    if value > largest_so_far:  
        largest_so_far = value 
    

    никогда не встречались. Таким образом, вы получите None. Вместо этого используйте float("- inf"), как я показал в своем ответе.

+0

Я узнал о '-inf' от этого Спасибо большое :-) – Freddy

+0

Я обновил свой код в вопросе, можете ли вы, пожалуйста, посмотреть. – Freddy

+0

@Freddy Пожалуйста, проверьте обновленный ответ. – thefourtheye

1

Я хотел бы сделать это следующим образом:

largest_so_far = smallest_so_far = None 

while True: 
    value = raw_input(">") 
    # first deal with 'done' 
    if value.lower() == 'done': 
     break 
    # then convert to float 
    try: 
     value = float(value) 
    except ValueError: 
     continue # or break, if you don't want to give them another try 
    # finally, do comparisons 
    if largest_so_far is None or value > largest_so_far: 
     largest_so_far = value 
    if smallest_so_far is None or value < smallest_so_far: 
     smallest_so_far = value 
+0

Я обновил свой код в вопросе, не могли бы вы посмотреть. – Freddy

+1

@Freddy 1. Не изменяйте вопрос, как только у вас есть ответы. 2. Отступы важны в Python - 'continue' должен быть ** в блоке' except' **, иначе остальная часть цикла недоступна. – jonrsharpe

+0

извините за это. И после отступов он печатает наибольшее число, но по-прежнему не печатает самые маленькие – Freddy

Смежные вопросы