Есть ли способ использовать меньше операторов if в моей функции?

Я сделал генератор случайных паролей, используя класс под названием 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 ответа
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)))
    

      Добавить комментарий

      Ваш адрес email не будет опубликован. Обязательные поля помечены *