Merhaba küçük bir şifre belirleme kodu yazdım ama ben istiyorum ki şifre belirlenirken girilen harflerde kullanıcının en az bir tane diğerlerinden farklı lower yada upper harf şartı olsun.
Ankara1968 yada A1968cankaya gibi hem upper hemde lower harf kullanılmasını zorunlu yapmak istiyorum ama beceremedim. Yol göstermenizi rica ederim.
while True:
password = input("Set User Password : ")
if password == "":
print('Exit by user')
break
if len(password) < 7:
print("Your password must be at least 7 characters")
continue
if password.isnumeric():
print('Password must contain at least 1 lowercase or uppercase letter ')
continue
elif password.isalpha():
print('Password must contain at least 1 number')
continue
elif not password.isalnum():
print("Password must contain number and letter")
continue
else:
print(f'Your password ( {password} ) has been defined.')
break
Selamun Aleyküm. Karakter dizilerinde kullanılan islower() ve isupper() isimli metotlar diziyi oluşturan karakterlerin tamamının küçük ya da büyük olup olmadığını sorgulamayı sağlıyor. true ya da false değerlerini geri döndürüyorlar. Söz konusu probleminizi çözebilmeniz açısından fikir vermek için aşağıdaki örnekleri inceleyelim;
kardiz1 = "Sifre"
kardiz2 = "sIFRE"
kardiz3 = "sifre"
kardiz4 = "SIFRE"
print("kardiz1'de hepsi küçük mü?", kardiz1.islower())
print("kardiz1'de hepsi büyük mü?", kardiz1.isupper(), "\n")
print("kardiz2'de hepsi küçük mü?", kardiz2.islower())
print("kardiz2'de hepsi büyük mü?", kardiz2.isupper(), "\n")
print("kardiz3'de hepsi küçük mü?", kardiz3.islower())
print("kardiz3'de hepsi büyük mü?", kardiz3.isupper(), "\n")
print("kardiz4'de hepsi küçük mü?", kardiz4.islower())
print("kardiz4'de hepsi büyük mü?", kardiz4.isupper(), "\n")
Ekran Çıktıları
kardiz1'de hepsi küçük mü? False
kardiz1'de hepsi büyük mü? False
kardiz2'de hepsi küçük mü? False
kardiz2'de hepsi büyük mü? False
kardiz3'de hepsi küçük mü? True
kardiz3'de hepsi büyük mü? False
kardiz4'de hepsi küçük mü? False
kardiz4'de hepsi büyük mü? True
Senin kriterlerine kardiz1 ve kardiz2 uyuyor. Çıktıları inceleyecek olursan kriterlerine uyan bir karakter dizisini islower ve isupper methotları ile sorgulattığında her ikisinden de false cevabını almalısın.
Bu durumda karakter dizisi içerisinde numerik karakterler olursa islower ve isupper'i kullanmak sorununu çözmeyebilir.
Alternatif bir çözüm olarak büyük ve küçük harfler ile numerik karakterlerin sayılarının tutan sayaç değişkenleri oluşturup, bu değişkenlerin >= 1 olması koşuluna göre de bir algoritma geliştirebilirsin.
İyi çalışmalar…
Merhaba,
Kullanıcıdan alınan şifreyi döngüye sokup iki tane flag kullanabilirsin.
Birinci flag: karakter dizisindeki harf büyük olduğunda True olur.
İkinci flag: karakter dizisindeki harf küçük olduğunda True olur.
Implementation aşağıda.
def control(x):
can1 = False # flag
can2 = False # flag
for i in x:
if(i.islower()):
can1 = True
elif(i.isupper()):
can2 = True
if(can1 and can2):
return True
return False
a = input()
print(control(a))
Numeric karakterler de içerdiği için islower ve isupper metotları ile çözememiştim. O yüzden konuyu açtım. Alternatif çözümünüz ile ilgili çalışacağım. İlginiz için teşekkür ederim.
Burada kutuphane metodlarina fazla baglilik goruyorum. Sadece bunlari kullanarak, sadece bunlarin tasarlandigi seyleri yapabilirsin. (Ve parola kontrolu bunlardan degil.)
String’in tamaminin numerik/alfabetik olduguna bakan fonksiyonlardansa icinde rakam olup olmadigina, kucuk harf olup olmadigina bakan fonksiyonlar yaz ve ciktilarini nasil birlestirip kullanacagini dusun.
Su haliyle bakmak istedigin seyin De Morgan eslenigine bakiyorsun gibi oluyor (“A ve B” yerine “A degil veya B degil, degil”)
Eğer istersen re(regular expression) modulünü kullanarak bu sorunu çözebilirsin.
import re
while True:
password = input("Set User Password : ")
if not (re.search("[A-Z]",password) and re.search("[a-z]",password)):
print("Password must contain at least 1 lowercase and uppercase letter")
continue
else:
break
basit, düzgün veya okunabilirliği ön planda tutma amacı taşıyan, en azından bu konu için daha basit çözümler herzaman daha yararlı olacaktır. Sn @dildeolupbiten bir konuda kiss prensibi adlı güzel bir paylaşım yapmıştı okumanızı öneririm. Veya python interpreter’da import this kodunu çalıştırmanızı öneririm.
Sadece fikir vermek açısından…
Yönlendirmeniz için teşekkür ederim. Kod yazmadan kod yazmayı öğrenmek istiyormuşum gibi hissettim bir an ama henüz acemiyim yavaş yavaş sizlerin uyarılarıyla inşallah yazılımcı gibi düşünebilme yetisi kazanırım.
Forumda kiss prensibi diye arattım ama sadece bu mesajınızı sonuç olarak gösterdi konuyu hatırlıyorsanız link atabilirseniz okumak isterim. Teşekkürler.
Parolamız Ankara1968 olarak TRUE değer döndürmesi gerekiyor diyelim.
döngüye girdi ve ilk if bloğunda tüm harfler küçük olmadığı için can1 False olarak kaldı ve elif bloğuna geçti aynı durum bu seferde can2’nin başına geldi tüm harfler büyük olmadığı için can2 de false olarak kaldı. Ve benim öğrendiğim kıt bilgimle can1 ve can 2 false olduğunda sonuç false olmaz mı.
Yani
if(can1 and can2):
kodu can1 ve can2 kodu True ise demek değil mi. Yani ikiside False aslında nasıl return True döndürüyor.
for döngüsü ile, verilen şifrenin karakterlerini teker teker inceliyorum.
İncelediğim her bir karakter için if yapıları ile sorgulama yapıyorum.
if : incelenen karakter küçük ise can1 True olur. Alttaki elif yapısı ve içerisindekiler sorgulanmaz.
elif : incelenen karakter küçük değil ise bu sefer de aynı karakterin büyük olup olmadığını sorguluyorum. Eğer verilen karakter büyük ise bu sefer can2 True olur.
Kısaca can1 : verilen şifrede küçük harf olup olmadığını belirlemek için
can2 : verilen şifrede büyük harf olup olmadığını bulmak için
Kodu anlayamıyorsan şunu bi çalıştır bakalım. Muhtemelen anlayacaksındır.
def control(x):
can1 = False # flag
can2 = False # flag
for i in x:
if(i.islower()):
can1 = True
print(i, "karakteri kücük karakterdir")
elif(i.isupper()):
can2 = True
print (i, "karakteri buyuk karakterdir")
else:
print(i, "karakteri ne buyuk karakterdir ne de kucuk karakterdir")
# yukaridaki if , eliflerle
# isimiz bitti
# simdi asagidaki
# sarti kontrol ediyorum
if(can1 and can2):
return True
return False
a = input()
print(control(a))
Yazdıklarınızın hepsini yazdığınız şekilde anlamıştım lakin
if(can1 and can2):
return True
şartı kontrol ettirdiğiniz kodun bu kismindaki durumu yorumlarken aklım nereye gittiyse saçmalamışım. Kusura bakmayın. Sabırla izahat yazdığınız için ayrıca teşekkürler.
Sn @aib, sn @Muallim nin alternatif olarak gösterdiği yolu kullanarak böyle bir çözüm geliştirdim ama sizin söylediğiniz gibi kütüphane metodlarına yine başvurmuş oldum. Tüm alfabeyi küçük harf ayrı, büyük harf ayrı yazıp döngüye sokmaktan başka aklıma metod kullanmadan çözüm üretmek gelmiyor. Tüm alfabeyi küçük harf ve büyük harf olarak yazıp parolada olup olmadığını sorgulatmakta bana iyi bir çözüm olarak da gelmedi. Söylediğiniz şekilde bir çözüm zahmet olmazsa yazarsanız çok makbule geçecek yoksa sürmenaj olucam. İlginiz için tekrar teşekkürler.
def setpass():
while True:
upper_letterCount = 0
lower_letterCount = 0
numeric_charCount = 0
password = input("Set User Password : ")
if password == "":
print('Exit by user')
break
if len(password) < 7:
print("Your password must be at least 7 characters")
continue
for char in password:
if char.islower():
lower_letterCount += 1
if char.isupper():
upper_letterCount += 1
if char.isnumeric():
numeric_charCount += 1
if (lower_letterCount > 0) and (upper_letterCount > 0) and (numeric_charCount > 0):
print(f"Your password : {password} has been accepted ")
break
elif lower_letterCount == 0:
print("Your password must contain at least one lowercase letter")
elif upper_letterCount == 0:
print("Your password must contain at least one uppercase letter")
elif numeric_charCount == 0:
print("Your password must contain at least one number")
return password
setpass()
hmm peki şöyle yapsanız mesela diyelim ki siz şifre programınızın verilen şifrenin ilk harfi büyük değilse o şifreyi kabul etmemesini istiyorsunuz bu çok basit şifrenin ilk harfini büyütürsünüz ve eğer eski şifre o şifre nin aynısı ise kabul edip değil ise kabul etmez