Python'daki ilk şifre üreticisi

Sep 10 2020

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

9 benrg Sep 10 2020 at 22:06
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).

6 Anonymous Sep 10 2020 at 20:31

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.

3 K.Oleksy Sep 10 2020 at 19:19

İ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.