2015-11-17 2 views
0

Новый для python, нуждающийся в помощи, как обычно, мне нужно создать функцию, которая запрашивает у пользователя для int от 10 до 50, если число вне диапазона составляет , выводит сообщение об ошибке и продолжить задаёте, но если ничего не будет введен он должен возвращать список всех номеров пользователь введенными, а также среднее значение этих чисел.Неожиданный EOF при анализе eval (ввод (

Example input/output: 
myAvg() 
Enter an int: 34 
Enter an int: 43 
Enter an int: 23 
Numbers entered: 34 42 23 
Average of list: 33 

Это мой код до сих пор, незаконченный чтобы получить его, чтобы вернуть список.Я получаю неожиданный EOF при разборе, если я не ошибаюсь, что связано с eval (ввод)), но я не уверен, как это сделать.

def myAvg(): 
    lst = [] 

    while True: 
     n = eval(input('Enter an int between 10 and 50: ')) 
     if n < 10: 
       print('Please enter ant int between 10 and 50') 
     elif n > 50: 
       print('Please enter an int between 10 and 50') 
     elif n == '': 
      return lst 
     lst.append(n) 

Edit: Теперь ПОЛУЧАТЬ ValueError: неверный буквальным для Int() с базой 10: '' пытаются использовать только то, что мы охвачены в классе

def myAvg(): 
    lst = [] 

    while True: 
     n = input('Enter an int between 10 and 50: ') 
     if int(n) < 10 or int(n) > 50: 
      print("Please enter an integer between 10 and 50") 
     elif n == '': 
      lst.append(int(n)) 
      return lst 

edit2:

def myAvg(): 
lst = [] 


while True: 
    n = input("Enter an integer between 10 and 50: ") 

    if n == '': 
     print('Numbers entered:') 
     return lst 
    else: 
     ntemp = int(n) 

    if ntemp < 10 or ntemp > 50: 
      print("Please enter a value between 10 and 50.") 
    else: 
     lst.append(ntemp) 

    print('Average of numbers:') 
    return sum(lst)/len(lst) 

Что выводится:

Enter an integer between 10 and 50: 45 
Average of numbers: 
45.0 
+3

Не используйте 'eval' для ввода пользователем. Это дает вашему пользователю возможность [удалить ваш жесткий диск] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) и отправить смущающие фотографии вашей бабушке. Если вы хотите превратить строку в целое число, используйте 'int()'. – Kevin

+0

Моя бедная бабушка, тогда как бы я преобразовал значение n в int, пока n все еще может использовать == ''? –

+0

Сохраните строковую версию ввода в промежуточной переменной. Проверьте, что для "", и только после этого попытайтесь преобразовать в int. Это может потребовать переупорядочения ваших условностей. – Kevin

ответ

0

Вот ваш код, он пытается убедить ert число до целого числа и при подаче пустого ввода, он захватывает вывод ValueError и возвращает список. Я также объединил два условия: n < 10 и n > 50 в один.

def myAvg(): 
    lst = [] 

    while True: 
     try: 
      n = int(input("Enter a number: ")) 

      if n < 10 or n > 50: 
       print("Please enter a number between 10 and 50") 
      else: 
       lst.append(n) 
     except ValueError: 
      print(lst) 
      return sum(lst)/len(lst) 

print(myAvg()) 

Выход:

C:\Users\jermenkoo\Desktop>test.py 
Enter a number: 10 
Enter a number: 10 
Enter a number: 1 
Please enter a number between 10 and 50 
Enter a number: 
10.0 

Самое главное, eval() ОПАСНО и НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬСЯ, как он может выполнить произвольный ввод, например __import__('os').system(<your command here>). Если команда rm, вы можете обнаружить, что все ваши файлы удалены.

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

def myAvg(): 
    lst = [] 

    while True: 
     n = input("Enter a number: ") 

     if n == '': 
      print(lst) 
      return sum(lst)/len(lst) 
     else: 
      temp = int(n) 

      if temp < 10 or temp > 50: 
       print("Please enter a value between 10 and 50.") 
      else: 
       lst.append(temp) 

print(myAvg()) 

Расчет средней из списка, то легкая задача - sum(lst)/len(lst). sum(lst) возвращает сумму чисел в списке, len(lst) возвращает количество элементов.

Поскольку вы, кажется, использует Python 2.x, вот код изменен:

def myAvg(): 
    lst = [] 

    while True: 
     n = raw_input("Enter a number: ") 

     if n == '': 
      return 1.0 * sum(lst)/len(lst) 
     else: 
      temp = int(n) 

      if temp < 10 or temp > 50: 
       print("Please enter a value between 10 and 50.") 
      else: 
       lst.append(temp) 

print(myAvg()) 
+0

Это работает чудесно, просто возникают проблемы с его получением чтобы напечатать среднее значение lst –

+0

@ D.Leigh: отредактировал его для печати среднего значения. – jermenkoo

+0

Я использую модифицированную версию второго кода из-за того, что не перешел за исключением ValueError: и Try: в первом кодировании я «Мне удалось получить среднее значение для печати в реальном времени в соответствии с введенными целыми числами, но я не могу заставить его печатать в конце функции. –

0

Опять же, как сказал Кевин, не используйте eval.

def myAvg(): 
    lst = [] 
    while True: 
     n = raw_input('Enter an int between 10 and 50: ') 
     if n=="": 
      print lst 
      break 
     if 10<int(n)<50: 
      lst.append(int(n)) 

myAvg() 
+0

Это работает, если я ввожу новую строку, я подозреваю, что вы ввели пробел. Да, я могу справиться с этим тоже с исключением, но я не уверен, что фактически хочет OP –

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