Kullanıcı Adı-Parola Eşleştirme Programı
Bu dönem üniversiteye başladım. Kodumu gözden geçirip düşüncelerinizi benimle paylaşır mısınız
# 5-November-2020
username = input("Please enter your username: ")
password = input("Please enter your password: ")
username_password = {
'Mert': "mertt"
}
if username in username_password:
if username == "Mert" and password == username_password[username]:
print("Welcome Sir")
else:
print("You're not authorized!")
else:
confirmation = input("Do you want to register? (Y/N): ")
if confirmation == "Y":
username = input("Enter your username: ")
password = input("Enter your password: ")
password_2 = input("Confirm your password: ")
if password == password_2:
username_password[username] = password
else:
print("Your password is incorrect!")
else:
print("Good bye")
print(username_password)
Herhangi bir iyileştirme öneriniz varsa lütfen bana söyleyin.
Yanıtlar
Girişi doğrula
Programınızın herhangi bir kötü girdi nedeniyle başarısız olmayacağından emin olmalısınız , kullanıcının girmemesi gereken ve programın yanlış davranmasına neden olabilecek bir şey
Programınız için bu mümkün mü? Evet, bu satırı al
username = input("Please enter your username: ")
Kullanıcı Ctrl+Zburaya girerse hataya neden olur ve program durur.
EOFError
Bu istisnaları Python dışında try ve istisna kullanarak yakalayabiliriz
try:
username = input("Please enter your username: ")
except (Exception, KeyboardInterrupt):
print("Please enter a valid username!")
Aynısı giriş için de geçerlidir password
Bir adım sonra, ayrıntıların uzunluğunu, yani kullanıcı adı veya parolanın çok kısa olup olmadığını da kontrol etmek istiyorum. Doğruysa özel bir mesaj göster
Bir istisna hakkında
Daha önce yaptığımız değişiklikler nedeniyle, programın sonlandırılması yerine bir istisna yakalarsak kolayca bir hata mesajı yazdırabiliriz.
Ama sonra ne olacak?
Kötü girişi işleyemediğiniz için programı orada durdurmak için iki seçeneğiniz vardır veya tekrar giriş isteyebilirsiniz.
İkinci seçeneği seçerseniz, bu birkaç satır daha kod alır, ancak kesinlikle daha iyidir çünkü kullanıcı tüm programı tekrar çalıştırmak yerine başka bir şans whileelde eder.Bunun için, onu elde edene kadar yinelenecek bir döngüye sarmamız gerekir. geçerli girdi
def username_input():
while True:
try:
username = input("Please enter your username: ")
except Exception:
print("Please a enter valid username! \n\n")
continue
return username
def password_input():
while True:
try:
password = input("Please enter your password: ")
except Exception:
print("Please enter a valid password! \n\n")
continue
return password
Burada kendimizi tekrarlıyoruz, işlevler aynı. Küçük bir hack ile kodu temizleyebiliriz
def ask_input(field):
while True:
try:
word = input(f"Please enter your {field}: ")
except (Exception, KeyboardInterrupt):
print(f"Please enter a valid {field}! \n\n")
continue
if not word: continue # if field is empty
return word
def take_input():
username = ask_input("username")
password = ask_input("password")
return username, password
Çalışmayı işlevlere ayırın
Son olarak, bir şeyi bir işleve taşıdığımı fark etmiş olmalısın.
SRP kuralını veya Tek sorumluluk ilkesini izlersek, kodumuzu gerçekten temizleyebiliriz
Tek sorumluluk ilkesi (SRP), bir bilgisayar programındaki her modülün, sınıfın veya işlevin, o programın işlevselliğinin tek bir parçası üzerinde sorumluluk sahibi olması gerektiğini belirten bir bilgisayar programlama ilkesidir.
Bu programda girdi alma görevini atarsak, diyelim ki take_input(), aynı görevi tekrar gerçekleştirmek istersek, aynı kod parçasını kopyalayıp yapıştırmadan aynı işlevi yeniden kullanabiliriz.
username, password = take_input()
process_login( username, password ):
take_input()girdi ile ilgili görevlerle ilgilenecek ve uygun şekilde geçerliliğe sahip olduğunda birusernamevepasswordprocess_login()kayıtlara göre girişin yetkili olup olmayacağına karar verir
Anahtarla kontrol edin username
if username in username_password:
if username == "Mert" and password == username_password[username]:
print("Welcome Sir")
else:
print("You're not authorized!")
Bu şu anda çalışıyor, ancak yalnızca kayıtların boyutunun olması nedeniyle 1, eklenen herhangi bir ekstra kayıt ve algoritmanız başarısız olacak, boyut olsaydı, ifadeler 50yazamazsanız 50, girilen kullanıcı adı ile kontrol etmeniz gerekir.
def process_login(username, password, records):
try:
if records[username] == password:
print("Authorized")
return True
except KeyError:
print("Not authroized")
return False
Burada, eğer usernamemevcut değilse records, bir KeyErrorben yakalamak ve baskı edecek olan yükseltilirNot authorized
Yeniden yazılmış
def ask_input(field):
while True:
try:
word = input(f"Please enter your {field}: ")
except (Exception, KeyboardInterrupt):
print(f"Please enter a valid {field}! \n\n")
continue
if not word: continue
return word
def take_input():
username = ask_input("username")
password = ask_input("password")
return username,password
def process_login(username, password, records):
try:
if records[username] == password:
print("Authorized")
except KeyError:
print("Not authroized")
Son kısım olan "kayıt" kısmını atladım. Bundan sonra açıklayacağım
records = {
"__Testu" : "__Testp",
"__Testu2" : "__Testp2"
}
username, password = take_input()
process_login(username, password, records)
Kayıtları bir dosyaya yazın
Şu anda olduğu gibi, sözlüğünüze önceden bir kayıt eklemişsinizdir, bundan sonra eklenen herhangi bir kayıt, programı bir sonraki çalıştırışınızda anlamsızdır, sözlük, eklediğiniz aynı kayıtla yeniden başlatılacaktır.
Kullanıcı kayıtlarını kaydetmenin bir yoluna ihtiyacınız var, böylece programınızı bir sonraki açışında önceki bilgileri kaydedilir.
Bunu yapmanın en iyi yolu, kullanıcının Python'daki csv modülüdür - csv.DictReaderbu, sizin için dosyanın tüm okunmasını / yazılmasını otomatikleştirecektir. Ama kendi başınıza yazmanız gereken bir şey.
Şerefe
>>> Please enter your username: (empty input)
>>> Please enter your username: __Testu
>>> Please enter your password: (empty input)
>>> Please enter your password: __Testp
>>> Authorized