2013-10-15 8 views
0

У меня возникли проблемы с программой, которую я пытаюсь написать. Код, показанный ниже, должен запросить пользователя для ввода и затем распечатать результат непрерывно до тех пор, пока не будет введено недопустимое значение. В моей конструкции кода я могу либо сделать цикл ответа бесконечно, либо как показано ниже, дважды спросить и выйти. Как я могу зациклить эту функцию, чтобы делать то, что хочу? Большое большое спасибо!Зацикливание функции внутри модуля

#define the function getLetterGrade and enter conditions of the function 

def getLetterGrade (numGrade): 
    if numGrade >= 95 and numGrade <= 100: 
     print (" A+") 
    elif numGrade >= 90 and numGrade <95: 
     print (" A") 
    elif numGrade >= 85 and numGrade <90: 
     print (" A-") 
    elif numGrade >= 80 and numGrade <85: 
     print (" B+") 
    elif numGrade >= 75 and numGrade <80: 
     print (" B") 
    elif numGrade >= 70 and numGrade <75: 
     print (" B-") 
    elif numGrade >= 65 and numGrade <70: 
     print (" C+") 
    elif numGrade >= 60 and numGrade <65: 
     print (" C") 
    elif numGrade >= 55 and numGrade <60: 
     print (" C-") 
    elif numGrade >= 50 and numGrade <55: 
     print (" P") 
    elif numGrade < 50 and numGrade >=0: 
     print (" F") 
    elif numGrade < 0 or numGrade > 100: 
     print (" invalid, please enter a score between 0 and 100.") 

def main(): 
    #Ask the user for input 


    numGrade = eval(input("Enter your mark in percent")) 
    while numGrade >= 0 or numGrade <= 100: 
     print("The grade for", numGrade, "is", end = '') 
     getLetterGrade(numGrade) # Call the function getLetterGrade as defined above 
     break 
    numGrade = eval(input("Enter your mark in percent")) 
    while numGrade >= 0 or numGrade <= 100: 
     print("The grade for", numGrade, "is", end = '') 
     getLetterGrade(numGrade) # Call the function getLetterGrade as defined above 
     break 


if __name__ == '__main__': 
    main() 
+0

Почему вы называете 'eval' на входе пользователя? –

+1

'eval (input (« Введите свой знак в процентах »))' <--- это плохая идея и опасно –

+0

Я новичок в программировании, причина, по которой я использовал функцию eval, заключается в том, что переменная становится и целой а не строку. Какая альтернатива? Спасибо, парни! @JoranBeasley – user2883489

ответ

0
# Loop until the mark inserted is not correct 
numGrade = input("Enter your mark in percent") 
while numGrade >= 0 or numGrade <= 100: 
    print("The grade for", numGrade, "is", end = '') 
    getLetterGrade(numGrade) # Call the function getLetterGrade as defined above 
    numGrade = input("Enter your mark in percent") 
print "Invalid mark. Bye!". 
+0

' eval (input (...)) 'кажется опасно для меня. Что делать, если пользователь вводит 'os.system (« rm -rf/»)'? –

+0

@ Robᵩ: обновил мой ответ. Спасибо за подсказку! :) – user278064

+0

OP хочет, чтобы цикл остановился, когда нелегальный результат Ввод и продолжение при вводе действительного результата. – Stuart

0

Используйте while True и вырваться из цикла, когда вводится недопустимое значение.

def main(): 
    while True: 
     num_grade = input("Enter your mark in percent") 
     if num_grade < 0 or num_grade > 100: 
      break 
     print("The grade for", num_grade, "is", end = '') 
     get_letter_grade(num_grade) 
+0

Огромное вам спасибо! Я очень благодарен за помощь, я раньше не видел функцию «пока истина». Это действительно помогает. @Stuart – user2883489

+0

вместо 'break' в функции, я обычно' return'. Также вы можете захотеть сделать это 'int (input (...))' –

-1

мое решение

>>> def get_grade_input(): 
...  val = int(raw_input("Enter Grade:")) 
...  return val if 0 <= val <= 100 else -1 
... 
>>> grades = list(iter(get_grade_input,-1)) 
>>> def get_grade(pct_grade): 
... return "FDCBA"[(pct_grade-50)//10] 
... 
>>> get_grade(66) 
'D' 
>>> get_grade(73) 
'C' 
+0

, если вы хотите, чтобы downvote по крайней мере оставил комментарий RE why –

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