Цикл 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 шт):
Можно создать бесконечный цикл и ждать, пока пользователь наберет правильный 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, то можете оставить его в списке или сделать проверку в соответствии с этим именем (без прохода по списку)
Вместо
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.
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: "))) !
- цикл выполнятся пока введённое значение не буде соответствовать шаблону
pattern; - когда соответствие верно, цикл прервётся и в переменной
mailбудет всё ОК.
Для оператора ”walrus” есть PEP 572,
начните знакомство с раздела Примеры (Examples)
Отказ от ответственности, паттерн для проверки e-mail не является исчерпывающим,
имеет скорее демонстрационный характер.
(полное регулярное выражение можно посмотреть в RFC-822)