2012-03-07 2 views
0

Я очень новичок в Python, так что простите мой новичок. У меня есть следующий код:Попросите пользователя ввести что-то еще, если первый вход недействителен

[a while loop starts] 

print 'Input the first data as 10 characters from a-f' 

input1 = raw_input() 
if not re.match("^[a-f]*$", input1): 
    print "The only valid inputs are 10-character strings containing letters a-f" 
    break 
else: 
[the rest of the script] 

Если бы я хотел, вместо того, чтобы разорвать петлю и выхода из программы, отправить пользователю вернуться к исходной строке, пока входные достоверные данные, какие бы я пишу вместо перерыва?

+4

Просто не используйте 'break'? (в зависимости от остальной части скрипта). –

+0

@Felix: Ему все равно пришлось бы поместить его фактический код в ветку 'else', хотя это можно было бы предотвратить, используя' continue'. –

ответ

6

Для продолжения следующей итерации цикла вы можете использовать continue statement.

Я обычно вынесет вход на выделенную функцию:

def get_input(prompt): 
    while True: 
     s = raw_input(prompt) 
     if len(s) == 10 and set(s).issubset("abcdef"): 
      return s 
     print("The only valid inputs are 10-character " 
       "strings containing letters a-f.") 
+0

Как отметил Никлас, стоит отметить, что если используется 'continue', условие' else' может быть также удалено. –

+0

@Sven Marnach, что такое использование «PROMPT» в raw_input ?? Пожалуйста, очистите его, и я также добавлю новое в python. –

+1

@VarunChhangani: это приглашение напечатано перед ожиданием ввода пользователя; см. [документация] (https://docs.python.org/2.7/library/functions.html#raw_input). –

0
print "Input initial data. Must be 10 characters, each being a-f." 
input = raw_input() 
while len(input) != 10 or not set(input).issubset('abcdef'): 
    print("Must enter 10 characters, each being a-f." 
    input = raw_input() 

Незначительной альтернатива:

input = '' 
while len(input) != 10 or not set(input).issubset('abcdef'): 
    print("Input initial data. Must enter 10 characters, each being a-f." 
    input = raw_input() 

Или, если вы хотите, чтобы разбить его, чтобы функции (эта функция является излишним для этого использования, но целая функция для частного случая является субоптимальной imo):

def prompt_for_input(prompt, validate_input=None, reprompt_on_fail=False, max_reprompts=0): 
    passed = False 
    reprompt_count = 0 
    while not (passed): 
     print prompt 
     input = raw_input() 
     if reprompt_on_fail: 
      if max_reprompts == 0 or max_reprompts <= reprompt_count: 
       passed = validate_input(input) 
      else: 
       passed = True 
     else: 
      passed = True 
     reprompt_count += 1 
    return input 

Этот метод позволяет определить ваш валидатор. Вы бы назвали это так:

def validator(input): 
    return len(input) == 10 and set(input).subset('abcdef') 

input_data = prompt_for_input('Please input initial data. Must enter 10 characters, each being a-f.', validator, True) 
Смежные вопросы