Python'daki ilk şifre üreticisi
Bu, Python kullanan ilk projem. Kullanıcı girişini kontrol eden basit bir şifre üreticisi yaptım. Nasıl geliştirebilirim?
import random
def password_generator():
password = []
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
"v", "w", "x", "y", "z"]
password_length = 0
password_numbers = []
password_letters = []
# Input the length of the password
while True:
password_length_input = input("Choose the length of your password with numbers between 6 and 15:\n")
if not password_length_input.isnumeric():
print(f"{password_length_input} is not a number, try again:")
continue
else:
password_length = int(password_length_input)
print(f"Password length: {password_length}")
if 6 <= password_length <= 15:
break
else:
print("The password must be between 6 and 15 characters, try again:")
continue
# Input the amount of numbers in password
while True:
password_numbers_input = \
input(f"Choose the amount of numbers you want in your password, max {password_length}\n")
if not password_numbers_input.isnumeric():
print(f"{password_numbers_input} is not a number try again")
continue
elif int(password_numbers_input) > password_length:
password_numbers = 0
print(f"The value is too high, choose maximum {password_length} numbers")
continue
else:
password_numbers = int(password_numbers_input)
print(f"Password numbers: {password_numbers}")
for number in range(0,password_numbers):
password.append(random.randrange(0,9))
break
# Check for numbers and letters in password
while True:
if password_numbers == password_length:
print(f"The password will be only {password_numbers} numbers, no letters.")
break
else:
password_letters = password_length - password_numbers
print(f"""Your password will be {password_length} characters with {password_numbers} numbers and {password_letters} letters.""")
for letter in range(0,password_letters):
password.append(random.choice(letters))
break
random.shuffle(password)
password_string = ''.join([str(item) for item in password])
print(f"Your password is:\n{password_string}")
password_generator()
Kullanım örneği:
Choose the length of your password with numbers between 6 and 15:
Password length: 8
Choose the amount of numbers you want in your password, max 8
Password numbers: 2
Your password will be 8 characters with 2 numbers and 6 letters.
Your password is:
pzc11bmf
Yanıtlar
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",` "v", "w", "x", "y", "z"]
Alfabeyi yazmanın bu yöntemi hataya çok açıktır. Yerine ithal stringedip kullanırdım . Hangi nedenle olursa olsun kendi harf dizinizi oluşturmak istiyorsanız, yazardımstring.ascii_lowercaseletters
letters = [chr(n) for n in range(ord('a'), ord('z') + 1)]
çünkü o zaman bir mektubu ihmal etme veya çoğaltma tehlikesi yoktur.
password_length = 0 password_numbers = [] password_letters = []
Bu varsayılan değerler asla kullanılmaz. Varsayılanlar için password_numbersve password_lettersbu değişkenler sayıları tuttuğu için bir anlam ifade etmiyor. Üç satırı da silerim.
if not password_length_input.isnumeric(): print(f"{password_length_input} is not a number, try again:") continue else: password_length = int(password_length_input) print(f"Password length: {password_length}")
Onun yerine yazarım
try:
password_length = int(password_length_input)
except ValueError:
print(f"{password_length_input} is not a number, try again:")
continue
print(f"Password length: {password_length}")
while True: if password_numbers == password_length: ... break else: ... break
Burada bir whiledöngüye sahip olmanın bir anlamı yok, çünkü her zaman ilk yinelemede ondan çıkıyorsunuz.
range(0,password_numbers)
Sadece yazabilirsin range(password_numbers).
password.append(random.randrange(0,9))
Bu, 0'dan 8'e kadar bir rakam ekleyecektir, hiçbir zaman 9. 10 hanenin tümünü istiyorsanız yazmalısınız random.randrange(10). Veya, belki daha iyi, kullanın random.choice(string.digits).
password_string = ''.join([str(item) for item in password])
Eğer kullanırsanız, string.digitsöğesinin her öğesi passwordbir karakter olacaktır, böylece bunu basitleştirebilirsiniz password_string = ''.join(password).
Rastgele bir dizge oluşturmanın daha basit bir yolu:
import random
import string
def get_random_string(length):
letters = string.ascii_lowercase
result_str = ''.join(random.choice(letters) for i in range(length))
print("Random string of length", length, "is:", result_str)
get_random_string(8)
get_random_string(8)
get_random_string(6)
buradan ödünç alındı ve daha fazla örnek var.
Şimdi, minimum basamak sayısı gibi belirli gereksinimleriniz varsa, formülde ince ayar yapabilir veya iki liste oluşturabilir ve değerleri karıştırırken bunları birleştirebilirsiniz.
Yukarıda aktardığım bağlantıda bir örnek var: "Sabit sayıda harf ve rakam içeren rastgele bir alfasayısal dize oluşturun" => iki liste anlayışını birleştirerek.
Yapma şekliniz prosedüreldir ama Pythonic değildir. Tekerleği yeniden icat ediyor.
En azından, izin verilen karakterler listeniz şu şekilde görünmelidir:
letters = "abcdefghijklmnopqrstuvwxyz"
Sonra rastgele bir harf seçersiniz, örneğin letters[3]liste 0 tabanlı olduğundan ve Python dizeleri karakter dizileri olarak ele aldığından 'd' döndürür. Zaten yaptığınız gibi karıştırmayı kullanarak daha kısa kodlar yazabilirsiniz.
İlk
Her while döngüsü için ayrı yöntemler oluşturmanızı öneririm.
İkinci
"while True" döngüsü iyi bir uygulama değil bence. Bunun yerine koşulu kullanın.
Üçüncü
Kodunuzu içerecek olan PasswordGenerator sınıfı oluşturmanızı öneririm. Gelecekte kodunuzu genişletmenize yardımcı olacaktır.
Projeniz için temel yapı
class PasswordGenerator():
check_declared_password_length():
...
check_amount_of_password_numbers():
...
*
*
*
Sonunda tek sorumlulukla işlevler oluşturmayı unutmayın. Bundan sonra, her biri için birim testleri yazabilirsiniz ve daha kolay olacaktır.