Мне было интересно, как сократить мой если заявление. Сейчас это очень большой список. но хотелось бы сократить. К сожалению, я часами искал несколько вещей в Интернете, но не могу найти решение.
Может ли кто-нибудь дать мне совет или привести пример в моем коде? (Извините, я только начал несколько дней назад с программирования)
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 ("")
Вы можете использовать цикл 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 и незащищенные пароли, заключается в том, что это предписано моей школой. В противном случае я бы сделал что-то другое, что имело бы смысл на практике. Я уже выполнил требования задания с моим кодом, но я хотел сделать свой код лучше и лучше понимать, как поступать в такой ситуации.
... или используйте электронную почту в качестве ключа вместо этого произвольного номера, тогда вам вообще не понадобится цикл