Python : Как объединить цикл for и цикл while вместе?

#python #loops #for-loop #while-loop

Вопрос:

Я пытался создать функцию регистрации, которая будет запрашивать информацию о нескольких пользователях. Приведенный ниже код является частичной частью функции. Я использую цикл while, чтобы предотвратить любой недопустимый ввод или конкретный ввод для выполнения другой задачи. Как только проверка ввода завершена, я использовал цикл for для проверки наличия зарегистрированной электронной почты. Однако я использую рекурсивную функцию, когда регистрируемое электронное письмо было зарегистрировано, есть ли способ избежать повторной функции и вместо этого поместить цикл for в цикл while ?

 user = [['a','a.gmail.com'],['b','b.gmail.com'],['c','c.gmail.com']]

def signup():
     print(" Enter '0' to return mainpage")
     emailAddress = input("Please enter your email address   : ")
     while True:
          if emailAddress == '0':
               print('mainpage returned')
               signup()
          elif emailAddress == '':
               emailAddress = input("Please enter your email address   : ")
          else:
               break
     # check if email address is registered or not
     for item in user:
          if emailAddress == item[1]:
               print("This Email address has been registered")
               signup()
     else:
          print("email registering:",emailAddress)
signup()               
               
 

Комментарии:

1. Вы вообще не должны повторяться. Всегда break выходите в самый нижний блок signup() . for item in user должно быть внутри while цикла, где находится текущий break оператор.

2. Могу ли я узнать, когда следует выполнить рекурсию функции и когда продолжать использовать итерацию ?

3. Не повторяйтесь. Период. Выйдите из while цикла, когда ваши условия будут выполнены.

Ответ №1:

Не используйте рекурсию. Что-то вроде этого подойдет. Ваша главная проблема for -это петля.

 user = [['a','a.gmail.com'],['b','b.gmail.com'],['c','c.gmail.com']]

def signup():
    
    emailAddress = None
    
    #---
    
    while True:
        print(" Enter '0' to return mainpage")
        
        desiredEmailAddress = input("Please enter your email address   : ")
        
        if desiredEmailAddress == '0':
            print('Ok, will return to mainpage')
            break # <---- BREAK OUT OF THE WHILE LOOP
        
        elif desiredEmailAddress == '':
            pass # let the while-loop iterate again
        
        else:
            # check if email address is registered or not
            emailIsAlreadyRegistered = False
            
            for item in user:
                if desiredEmailAddress == item[1]:
                    emailIsAlreadyRegistered = True
                    break # we can break out of the for loop
            
            if emailIsAlreadyRegistered:
                print("This Email address has been registered")
                pass # let the while-loop iterate again
            else:
                emailAddress = desiredEmailAddress
                break # <---- BREAK OUT OF THE WHILE LOOP
    
    #---
    
    if emailAddress is None:
        # User wanted to return to mainpage
        return None
    else:
        print("email registering:", emailAddress)
        return emailAddress
    
signup()