2015-04-08 3 views
-1

Итак, я пытаюсь получить два входа, которые отделяют имена пользователей по кредитным часам, и каждый раз после выхода из цикла я получаю неожиданный EOF.eval() Неожиданный EOF при разборе

fresh = [] 
soph = [] 
jun = [] 
sen = [] 

def classify(cr, un): 
    if cr <= 27: 
     fresh.append(un) 
     print(un, 'is a freshman.\n') 
    elif 28 <= cr <= 56: 
     soph.append(un) 
     print(un, 'is a sophomore.\n') 
    elif 57 <= cr <= 84: 
     jun.append(un) 
     print(un, 'is a junior.\n') 
    elif cr >= 85: 
     sen.append(un) 
     print(un, 'is a senior\n') 


def main(): 

    un = input('Student: ') 
    cr = eval(input('Credits: ')) 
    while un and cr != '': 
     un = input('Student: ') 
     cr = eval(input('Credits: ')) 
     classify(cr, un) 

В частности, ошибка, я получаю:

File "./class.py", line 58, in <module> 
    main() 
File "./class.py", line 51, in main 
    cr = eval(input('Credits: ')) 
File "<string>", line 0 

Я не уверен, если это связано (или, если это просто то, что я с видом), но я должен пройти через кредит для того, чтобы выйдите из цикла. Не следует ли выйти из цикла после нажатия, когда появляется Студент из-за оператора И?

Редактировать: добавить классификацию func. Я не думаю, что это проблема, хотя я попытался ее удалить, и это все равно возвращает меня в EOF.

+4

вы знаете, что 'eval' делает? – murgatroid99

+0

'eval (input())' кажется неплохой идеей. Он позволяет пользователю выполнить произвольный код, введя его в приглашении. – khelwood

+0

Где ваша классификация() – Ajay

ответ

1

Вы не должны использовать eval(), чтобы превратить строку в целое число. Вместо этого используйте int.

def main(): 

    un = input('Student: ') 
    cr = input('Credits: ') 
    classify(int(cr), un) 
    while un and cr: 
     un = input('Student: ') 
     cr = input('Credits: ') 
     classify(int(cr), un) 

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

def main(): 

    while 1: 
     un = input('Student: ') 
     if not un: break 
     cr = input('Credits: ') 
     if not cr: break 
     classify(int(cr), un) 

И, конечно же, использовать input для Python 3 и raw_input для Python 2.

+0

Почему бы не просто «while True:» с условиями разрыва для обоих значений и устранить весь код до времени (не большой поклонник этого повтора -> до шаблона). И если вы сохраните этот шаблон, вы также должны переместить классификацию в цикл while в качестве первого оператора, чтобы избежать вызова классификации, если не 'un' или' cr' (и удаление другого вызова для классификации – AChampion

+0

Очень верно - если мы собираемся чтобы использовать 'break', также можно использовать его полностью. Я отредактирую ответ. – TigerhawkT3

+0

Спасибо (еще раз), действительно полезно услышать, когда и где я должен использовать какие функции. – tankchi