Сократить словарь операторов if

Мне было интересно, как сократить мой если заявление. Сейчас это очень большой список. но хотелось бы сократить. К сожалению, я часами искал несколько вещей в Интернете, но не могу найти решение.

Может ли кто-нибудь дать мне совет или привести пример в моем коде? (Извините, я только начал несколько дней назад с программирования)

import time # for lockout after 5 attempts 

students = { # Make a static dictenoary called students
    1: {"name": "Daniel","lastname": "maker","email" : "[email protected]","password" : "123456"},
    2: {"name": "Sandy","lastname": "Mango","email" : "[email protected]","password" : "sdasdas!@"},
    3: {"name": "Kreeft","lastname": "Garnaal","email" : "[email protected]","password" : "Mekalekkea!@"},
    4: {"name": "Alfred","lastname": "Skylake","email" : "[email protected]","password" :"suiker!@"}
}

count = 0 # Count the number of failed login attempts
while True: # Create a loop that requests and checks the credentials
    print ("")
    email = input("Enter your E-mail account: ")
    passwords = input("Enter your password: ")
    count += 1 #count the number of failed login attempts
    print ("")
    
    if (email == students[1]["email"] and passwords == students[1]["password"]): # Check credentials if it's correct on the right email and password.
        print ("Welcome",students[1]["name"],students[1]["lastname"],"you are successfully logged in!")
        break
    elif (email == students[2]["email"] and passwords == students[2]["password"]):
        print ("Welcome",students[2]["name"],students[2]["lastname"],"you are successfully logged in!")
        break
    elif (email == students[3]["email"] and passwords == students[3]["password"]):
        print ("Welcome",students[3]["name"],students[3]["lastname"],"you are successfully logged in!")
        break
    elif (email == students[4]["email"] and passwords == students[4]["password"]):
        print ("Welcome",students[4]["name"], students[4]["lastname"], "you are successfully logged in!")
        break
    elif count > 5:
        tijd = time.localtime()
        clock = time.strftime("%I:%M:%S %p", tijd)
        print("On", clock, "You have logged incorrectly 5 times. You are blocked for 15 minutes")
        #time.sleep(900) #Sleep 15 minutes.
        break
    else:
        print ("Incorrect E-mail or password!")
        print ("")

... или используйте электронную почту в качестве ключа вместо этого произвольного номера, тогда вам вообще не понадобится цикл

DeepSpace 20.03.2022 16:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать цикл for и использовать функцию Python, которая for может быть объединена с else, где часть else выполняется, если не было выполнено ни одного оператора break.

for i in students:
    # Check credentials if it's correct on the right email and password.
    if (email == students[i]["email"] and passwords == students[i]["password"]):
        print("Welcome", students[i]["name"], students[i]["lastname"], "you are successfully logged in!")
        break
    elif count > 5:
        tijd = time.localtime()
        clock = time.strftime("%I:%M:%S %p", tijd)
        print("On", clock, "You have logged incorrectly 5 times. You are blocked for 15 minutes")
        # time.sleep(900) #Sleep 15 minutes.
        break
else:
    print("Incorrect E-mail or password!")
    print("")

Если вы можете изменить структуру данных, вы можете использовать адрес электронной почты в качестве ключа словаря вместо числа.

students = {  # Make a static dictenoary called students
    "[email protected]": {"name": "Daniel", "lastname": "maker", "email": "[email protected]", "password": "123456"},
    "[email protected]": {"name": "Sandy", "lastname": "Mango", "email": "[email protected]", "password": "sdasdas!@"},
    "[email protected]": {"name": "Kreeft", "lastname": "Garnaal", "email": "[email protected]", "password": "Mekalekkea!@"},
    "[email protected]": {"name": "Alfred", "lastname": "Skylake", "email": "[email protected]", "password": "suiker!@"}
}

[...]
    try:
        student = students[email]
        if passwords == student["password"]:
            print("Welcome", student["name"], student["lastname"], "you are successfully logged in!")
            break
        elif count > 5:
            tijd = time.localtime()
            clock = time.strftime("%I:%M:%S %p", tijd)
            print("On", clock, "You have logged incorrectly 5 times. You are blocked for 15 minutes")
            # time.sleep(900) #Sleep 15 minutes.
            break
        else:
            print("Incorrect E-mail or password!")
            print("")
    except KeyError:
        print("Incorrect E-mail or password!")
        print("")

Вы, конечно, не хотите хранить пароли в виде простого текста и вместо этого использовать хэш.

Используйте понимание списка

selected_students = [s for s in students if s["email"] == email and s["password"] == password]

Если len(seleced_students) == 0, то вы ничего не нашли.

Это не сломается и всегда будет проходить через полный dict, но он более питонический, чем for, а также находит дубликаты.

Ответ принят как подходящий

Вы можете заменить свои операторы if-else простым циклом for:

import time 

students = { # Make a static dictenoary called students
    1: {"name": "Daniel","lastname": "maker","email" : "[email protected]","password" : "123456"},
    2: {"name": "Sandy","lastname": "Mango","email" : "[email protected]","password" : "sdasdas!@"},
    3: {"name": "Kreeft","lastname": "Garnaal","email" : "[email protected]","password" : "Mekalekkea!@"},
    4: {"name": "Alfred","lastname": "Skylake","email" : "[email protected]","password" :"suiker!@"}
}


count = 0
while True:
    email = input("\nEnter your E-mail account: ")
    passwords = input("Enter your password: ")
    count += 1 #count the number of failed login attempts
    login = False
    print ("")
    
    for student in students:
        if students[student]["email"] == email:
            if students[student]["password"] == passwords:
                print (f"Welcome, {students[student]["name"]},{students[student]["lastname"]}, you are successfully logged in!")
                count = 0
                login = True
                break
    if not login:
        print ("Incorrect E-mail or password!\n")
    if count > 5:
        current_time = time.localtime()
        clock = time.strftime("%I:%M:%S %p", current_time)
        print("On", clock, "You have logged incorrectly 5 times. You are blocked for 15 minutes")
        #time.sleep(900) #Sleep 15 minutes.
        #count = 0 
        break

спасибо за все ваши ответы и советы! Я протестировал и попробовал все 3 кода и все заработало. Теперь я понимаю это лучше. Да, причина, по которой у меня есть цикл while и незащищенные пароли, заключается в том, что это предписано моей школой. В противном случае я бы сделал что-то другое, что имело бы смысл на практике. Я уже выполнил требования задания с моим кодом, но я хотел сделать свой код лучше и лучше понимать, как поступать в такой ситуации.

DanielDude 20.03.2022 17:15

Другие вопросы по теме