Я сделал генератор случайных паролей, используя класс под названием password и метод под названием generate.
Моя программа работает как надо. Он генерирует случайный пароль, определяемый предпочтениями пользователя в отношении длины, верхнего или нижнего регистра, чисел и специальных символов.
Мне просто было интересно, есть ли способ реорганизовать многочисленные if statements Я использовал, чтобы определить, какой пароль будет генерировать программа.
Любые другие предложения по улучшению, которые я мог бы сделать, также были бы полезны. Большое спасибо: D
Код:
import random
import string
class password:
def __init__(self, length, string_method, numbers=True, special_chars=False):
self.length = length
self.string_method = string_method
self.numbers = numbers
self.special_chars = special_chars
def generate(self, iterations):
# Checking what type of string method the user has asked for
if self.string_method == 'upper':
stringMethod = string.ascii_uppercase
elif self.string_method == 'lower':
stringMethod = string.ascii_lowercase
elif self.string_method == 'both':
stringMethod = string.ascii_letters
# Checking if the user has asked for numbers or not
if self.numbers == True:
stringNumbers = string.digits
elif self.numbers == False:
stringNumbers=""
# Checking if the user has asked for special characters or not
if self.special_chars == True:
stringSpecial = string.punctuation
elif self.special_chars == False:
stringSpecial=""
characters = stringMethod + stringNumbers + stringSpecial
# Generating the password
for p in range(iterations):
output_password = ''
for c in range(self.length):
output_password += random.choice(characters)
print(output_password)
# Test
password1 = password(20, 'lower', True, False) # password length = 20, string method is lowercase, numbers are true and special characters are false
password1.generate(3) # generate the random password 3 times```
2 ответа
Вы можете использовать тернарную операцию, чтобы уменьшить вертикальное пространство, т. Е. x = a if condition else b. Это устанавливает x к a если condition верно и b иначе.
Вы также можете использовать словарь для сопоставления строки с некоторым объектом, например
the_map = {'a': 4, 'b': 7, 'c': 43}`
x = the_map['c']
Это установит x к 43.
Тогда вы можете вместо этого оценить все в инициализаторе. Так что это не меньше, если проверяет как таковое, но немного чище, и вы можете позвонить generate несколько раз без необходимости выполнять проверки.
import random
import string
class Password:
def __init__(self, length, string_method, numbers=True, special_chars=False):
self.length = length
self.string_method = {
'upper': string.ascii_uppercase,
'lower': string.ascii_lowercase,
'both': string.ascii_letters
}[string_method]
self.numbers = string.digits if numbers else ''
self.special_chars = string.punctuation if special_chars else ''
def generate(self, iterations):
characters = self.string_method + self.numbers + self.special_chars
# Generating the password
for p in range(iterations):
output_password = ''
for c in range(self.length):
output_password += random.choice(characters)
print(output_password)
# Test
password = Password(20, 'lower', True, False)
password.generate(3) # generate the random password 3 times
Если вам действительно нужно меньше проверок, просто передайте символы напрямую. Передача длины и того, какие символы вы хотите использовать в генераторе паролей, кажется совершенно законной и простой. Это также позволяет вам делать более сложные вещи, например, генерировать пароль, состоящий только из гласных, без четных чисел или, возможно, если вы хотите исключить определенные знаки препинания.
import random
import string
class Password:
def __init__(self, length, characters):
self.length = length
self.characters = characters
def generate(self, iterations):
# Generating the password
for p in range(iterations):
output_password = ''
for c in range(self.length):
output_password += random.choice(self.characters)
print(output_password)
# Test
password = Password(20, string.ascii_lowercase + string.digits)
password.generate(3) # generate the random password 3 times
Поскольку вы в конечном итоге все равно комбинируете разные наборы символов, вы можете сделать это сразу, используя один if за набор символов. И random.choices сохраняет петлю.
class password:
def __init__(self, length, string_method, numbers=True, special_chars=False):
self.length = length
self.chars=""
if string_method != 'lower':
self.chars += string.ascii_uppercase
if string_method != 'upper':
self.chars += string.ascii_lowercase
if numbers:
self.chars += string.digits
if special_chars:
self.chars += string.punctuation
def generate(self, iterations):
for _ in range(iterations):
print(''.join(random.choices(self.chars, k=self.length)))
