Я создаю генератор паролей, но я не знаю, почему он не работает - PullRequest
0 голосов
/ 10 ноября 2019

В основном я новичок в python, и я использую python 3, чтобы попытаться создать генератор паролей просто для удовольствия, но я продолжаю сталкиваться с проблемой. Когда я пытаюсь использовать следующий код в Pydroid 3, он работает так, как задумано: создать смешанный пароль (символы, буквы верхнего и нижнего регистра и цифры), длина которого определяется пользователем, но когда я запускаю его на Pycharm I,получить только 1 символ, несмотря на то, что я хочу больше 1. Знает ли кто-нибудь проблему?

import random
import string
import pyfiglet

print(pyfiglet.figlet_format('Password Generator!\n', font="digital"))

length = int(input('How many characters long do you want the password to be? '))
alphabet = list(string.ascii_lowercase)
numbers = range(0, 10)
specialchar = list(string.punctuation)
char = ('alfa', 'num', 'char')
pw = []
passw = ''

while length > 0:
    if random.choice(char) == 'alfa':
        x = str(random.choice(alphabet))
        pw.append(x)
        passw = ''.join(x)
        length -= 1
    elif random.choice(char) == 'num':
        x = str(random.choice(numbers))
        pw.append(x)
        passw = ''.join(x)
        length -= 1
    else:
        x = str(random.choice(specialchar))
        pw.append(x)
        passw = ''.join(x)
        length -= 1


def randomupper(c):
    if random.random() > 0.5:
        return c.upper()
    return c.lower()


password = ''.join(map(randomupper, passw))
print(f'Your randomly generated password is: {password}')

Ответы [ 4 ]

0 голосов
/ 11 ноября 2019

Я прочитал все ответы, и вы, люди, мне очень помогли, спасибо! Я понял, что в операторе passw = '' .join (x) есть ошибка, которая должна быть passw = '' .join (pw)

0 голосов
/ 10 ноября 2019

Это потому, что строка passw просто добавляет последний символ x к себе. Он вообще не взаимодействует со списком pw. И то, и другое pw и passw не нужно, вместо этого используйте pw += x в каждом из операторов if, который непосредственно добавляется к строке, а затем измените вашу последнюю строку на password = ''.join(map(randomupper, pw))

0 голосов
/ 10 ноября 2019

Основная проблема - строка passw = ''.join(x), которая стирает пароль и заменяет его только последним сгенерированным символом.

Некоторые другие улучшения:

  • для запускаЗацикливание фиксированное число раз, for i in range(length) гарантирует, что цикл будет выполнен ровно length раз, без необходимости инициализировать, обновлять и проверять переменную
  • код, такой как pw.append(x), который одинаков для каждого случаяиз if-тестов можно поставить вне
  • ваша переменная pw уже является строкой, поэтому passwd = ''.join(pw) просто копирует строку

Обновленный код:

import random
import string

length = int(input('How many characters long do you want the password to be? '))
alphabet = list(string.ascii_lowercase)
numbers = range(0, 10)
specialchar = list(string.punctuation)
char = ('alfa', 'num', 'char')
passw = ''

for i in range(length):
    if random.choice(char) == 'alfa':
        x = str(random.choice(alphabet))
    elif random.choice(char) == 'num':
        x = str(random.choice(numbers))
    else:
        x = str(random.choice(specialchar))
    passw.append(x)

def randomupper(c):
    if random.random() > 0.5:
        return c.upper()
    return c.lower()

password = ''.join(map(randomupper, passw))
print(f'Your randomly generated password is: {password}')
0 голосов
/ 10 ноября 2019

измените эту строку, и она будет работать

password = ''.join(map(randomupper, pw))

с passw = ''.join(x) вы итеративно добавляете один символ внутри x с пустым символом '' в переменную passw, и в результате получается толькоодин символ внутри, когда цикл заканчивается. но pw.append(x) добавьте символ внутри x в конец pw и увеличьте его размер. так что просто, когда вы используете passw вместо pw, вы увидите только последний символ, созданный внутри вашего цикла.

...