2016-07-28 2 views
1

Я пишу генератор паролей, и я столкнулся с этой досадной проблемой, и это повторение числа или буквы в одной строке. Пользователь дает программе формат того, как они хотят, чтобы их пароль был сгенерирован ex «C @@ d %%%» , где @ - только буквы и где% - только числа, а пользователь также вводит числа и буквы для генерации пароль, тогда программа должна распечатать что-то вроде cold123, но вместо этого выведет cood111 или clld111, я опубликую фрагмент моего кода ниже, но, пожалуйста, не противно его, я довольно новичок в python , самоучкой и всего лишь пару месяцев в опыте питона.Как я могу остановить свою программу от создания того же ключа?

class G() 
    . 
    . 
    . 

    # self.forms is the format the user input they can input things such as [email protected]@d%%% 
    # where @ is only letters and where % is only numbers 

    # self.Bank is a list where generated things go 

    AlphaB = [] #list Of All Of The Positions That have The @ sign in The self.forms 
    NumB = [] #list of All of the positions that have a % sign 
    for char in self.forms: 
     if char == '@': 
      EOL=(self.Position) # Positions End Of Line 
      Loc = self.forms[EOL] # Letter 
      AlphaB.append(EOL) 


     if char == '%': 
      EOL=(self.Position) 
      Loc = self.forms[EOL] 
      NumB.append(EOL) 
     self.Position+=1 # Move right a position 

    for pos in AlphaB: 
     for letter in self.alphas: #letters in The User Inputs 
      GenPass=(self.forms.replace(self.forms[pos],letter)) 
      #Not Fully Formatted yet, because Only The letter been formatted 
      if GenPass.find('%'): 
       for Pos in NumB: 
        for number in self.ints: 
         GenPass=(GenPass.replace(GenPass[Pos],number)) 
         if GenPass not in self.Bank: 
          #Cood111 
          print (GenPass) 
          self.Bank.append(GenPass) 

      else: 
       if GenPass not in self.Bank: 
        print (GenPass) 
        self.Bank.append(GenPass) 
+1

Это упражнение, не так ли? Производственный код – l0b0

+0

Я думаю, что проблема заключается в функции 'replace()', которая заменяет все вхождения старого новым. Я верю, что если вы передадите ему третий аргумент ', 1', вместо него будет заменено только первое вхождение, а не все из них – depperm

ответ

0

GenPass.replace(GenPass[Pos],number)заменит все вхождение символа в GenPass[Pos] со значением number. Вы должны убедиться, что вы заменяете один символ за раз.

+0

, чтобы заменить один за раз, вы можете просто добавить третий аргумент в 'replace' на что-то вроде GenPass.replace (GenPass [Pos], number, 1)' и будет заменен только первый – depperm

+0

как? замените вещь замените все – user5117999

+0

, так что в основном GenPass.replace (GenPass [Pos], number, int (Pos)) – user5117999

0

Создайте список всех символов и список со всеми числами, затем просто выберите один с помощью list.pop (randint (0, len (list) - 1), вы всегда будете выбирать другую букву/номер, подобный этому но вы также будете ограничены 10 цифрами (0-9) и 20-значными буквами.

+0

Я не следую. – user5117999

+0

Поппинг из списка - страшная идея - вы уменьшаете энтропию пароля с места в карьер. – l0b0

+0

Возможно ли повторять символы без уменьшения энтропии? – rodjun