Цикл while. Помощь

Как сделать так что бы цикл while не выходил из цикла пока не выполнится действие. К примерy есть простая регистрация, и пока пользователь не введет почтy в виде [email protected], то программа не пycтит его на следyющий шаг.

Возможно пригодится вот мой код:

import random

random_number_id = random.uniform(1, 100)

nole = 0
running = True

b = input("Введите имя: ")
a = input("Введите фамилию: ")
mail_login = input("Введите почтy: ")

while "\u0040" is not mail_login:   #if "\u0040" is not mail_login:

        print("Ошибка, введите почтy в формате [email protected]")


print("Ваш yникальный ID : ", random_number_id)

Бyдy благодарен за помощь.


Ответы (3 шт):

Автор решения: Smoliarick

Можно создать бесконечный цикл и ждать, пока пользователь наберет правильный email

Пример:

email неправильный:

  • если не оканчивается на одно из доменных имен в списке mails
  • если перед @ нет символов (сравнивается длина mail_login и mail из списка доменных имен)
import random

random_number_id = random.uniform(1, 100)

run = True
b = input("Введите имя: ")
a = input("Введите фамилию: ")
mails = ["@mail.ru", "@yandex.ru", "@gmail.com"]
while run:
    mail_login = input("Введите почтy: ")
    for mail in mails:
        if mail in mail_login and len(mail) != len(mail_login):
            run = False
            break
    if run:
        print("Ошибка, введите почтy в формате [email protected]")

print("Ваш yникальный ID : ", random_number_id)

P.S. Возможно коряво написано, как смог

P.S.S Если нужна проверка только на @mail.ru, то можете оставить его в списке или сделать проверку в соответствии с этим именем (без прохода по списку)

→ Ссылка
Автор решения: MarianD

Вместо

mail_login = input("Введите почтy: ")

while "\u0040" is not mail_login:   #if "\u0040" is not mail_login:

        print("Ошибка, введите почтy в формате [email protected]")

используйте

while True:
    mail_login = input("Введите почтy: ")
    if  "@" not in mail_login:
        print("Ошибка, введите почтy в формате [email protected]") 
    else:
        break

Объяснение:

while True: бесконечный цикл, из которого мы выйдем командой break только тогда, когда будет выпольнено условие, что символ @ находится в строке mail_login.

→ Ссылка
Автор решения: AnnaBazueva

Walrus & Regex

Используя моржовый оператор присваивания - walrus,
можно присвоить значение переменной mail в проверяемом циклом условии.

А т.к. символ @ сам по себе не является адресом электронной почты,
для проверки лучше использовать модуль re.

Можно сделать так:

import re
import random

random_number_id = random.uniform(1, 100)
pattern = re.compile(
    "".join((r"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+",
             r"(?:[@]{1}[a-z0-9!#$%&'*+/=?^_`{|}~-]+?)",
             r"(?:[.]{1}[a-z!#$%&'*+/=?^_`{|}~-]+))")
            )
    )

b = input("Введите имя: ")
a = input("Введите фамилию: ")
while not re.search(pattern, (mail := input("Введите почтy: "))):
    continue
else:
    print(mail)  # Для демонстрации присутствия в глобальной видимости

print("Ваш yникальный ID : ", random_number_id)

Внимание на условие - not re.search(pattern, (mail := input("Введите почтy: "))) !

  1. цикл выполнятся пока введённое значение не буде соответствовать шаблону pattern;
  2. когда соответствие верно, цикл прервётся и в переменной mail будет всё ОК.

Для оператора ”walrus” есть PEP 572,
начните знакомство с раздела Примеры (Examples)


Отказ от ответственности, паттерн для проверки e-mail не является исчерпывающим,
имеет скорее демонстрационный характер.
(полное регулярное выражение можно посмотреть в RFC-822)

→ Ссылка