Есть ли способ уменьшить количество ifs? - PullRequest
1 голос
/ 14 января 2020

Я изучаю основы Python и пишу генератор паролей. Предполагается спросить пользователя, какой тип пароля они хотят и желаемой длины. Есть ли способ сократить код ниже? Я думаю, что я использую много ifs. Любая обратная связь с благодарностью.

`import random
import string

ans_n = input('Do you want numbers in your password?(y/n) ')
ans_l = input('Do you want letters in your password?(y/n) ')
ans_s = input('Do you want special characters in your password?(y/n) ')


def random_numbers(user_numbers_length):
    digits = []
    for i in range(user_numbers_length):
        digits.append(str(random.randint(1, 10)))

    return digits


def random_letters(user_letter_length):
    return random.sample(string.ascii_letters, user_letter_length)


def random_characters(user_special_length):
    stringSpecial = []
    for i in range(user_special_length):
        stringSpecial.append(random.choice('!$%&()*+,-.:;<=>?@[]^_`{|}~'))

    return stringSpecial

if ans_l == 'y' and ans_n == 'n' and ans_s == 'n':
    print("how many letters do you want in your password?")
    user_letter_length = input()
    password = random_letters(int(user_letter_length))

if ans_l == 'y' and ans_n == 'y' and ans_s == 'n':
    print("how many letters do you want in your password?")
    user_letter_length = input()
    print("how many numbers do you want in your password?")
    user_numbers_length = input()
    password = random_letters(int(user_letter_length)) + random_numbers(int(user_numbers_length))

if ans_l == 'y' and ans_n == 'y' and ans_s == 'y':
    print("how many letters do you want in your password?")
    user_letter_length = input()
    print("how many numbers do you want in your password?")
    user_numbers_length = input()
    print("how many special characters do you want in your password?")
    user_special_length = input()
    password = random_letters(int(user_letter_length)) + random_numbers(int(user_numbers_length)) + random_characters(
        int(user_special_length))

if ans_l == 'n' and ans_n == 'y' and ans_s == 'n':
    print("how many numbers do you want in your password?")
    user_numbers_length = input()
    password = random_numbers(int(user_numbers_length))

if ans_l == 'n' and ans_n == 'y' and ans_s == 'y':
    print("how many numbers do you want in your password?")
    user_numbers_length = input()
    print("how many special characters do you want in your password?")
    user_special_length = input()
    password = random_numbers(int(user_numbers_length)) +random_characters(int(user_special_length))

if ans_l == 'n' and ans_n == 'n' and ans_s == 'y':
    print("how many special characters do you want in your password?")
    user_special_length = input()
    password = random_characters(int(user_special_length))

if ans_l == 'y' and ans_n == 'n' and ans_s == 'y':
    print("how many letters do you want in your password?")
    user_letter_length = input()
    print("how many special characters do you want in your password?")
    user_special_length = input()
    password = random_letters(int(user_letter_length)) +random_characters(int(user_special_length))

random.shuffle(password)

print(f"Your generated password is: ")
print(''.join(password))
`

Ответы [ 3 ]

3 голосов
/ 14 января 2020

Вместо того, чтобы задавать много вопросов, если вы знаете, что вам придется задавать вопросы по каждому классу персонажей, вы можете просто задать номера заранее. Вы можете предложить им ввести 0, если они не хотят ничего. Тогда нужно позвонить random.choices() с номером, указанным в k=#. Наконец, вы перетасовываете пароль в конце процесса.

Этот подход также сводит к минимуму количество вопросов, на которые пользователь должен ответить. Если пользователю нужны письма, они могут просто сказать вам, сколько они хотят, вместо того, чтобы говорить «да», а затем сказать, сколько.

import random
import string

ans_l = int(input("How many letters do you want (0 for none)? "))
ans_n = int(input("How many numbers do you want (0 for none)? "))
ans_s = int(input("How many specials do you want (0 for none)? "))

password = []
password += random.choices(string.ascii_letters, k=ans_l)
password += random.choices(string.digits, k=ans_n)
password += random.choices(string.punctuation, k=ans_s)

random.shuffle(password)
print(''.join(password))

Пример взаимодействия будет выглядеть как ...

~$ python3 generate_password.py 
How many letters do you want (0 for none)? 4
How many numbers do you want (0 for none)? 4
How many specials do you want (0 for none)? 4
5N+46d9I_\"Z

Или без специальных символов

~$ python3 so.py 
How many letters do you want (0 for none)? 6
How many numbers do you want (0 for none)? 6
How many specials do you want (0 for none)? 0
9N0Y5X0p29yG
2 голосов
/ 14 января 2020

Поскольку ваши функции random_numbers, random_letters и random_characters отличаются только используемыми наборами символов, вы можете использовать dict для сопоставления отображаемых имен с наборами символов, а затем выполнять итерацию по элементам dict для запроса вместо входов:

import random
import string

character_sets = {
    'numbers': string.digits,
    'letters': string.ascii_letters,
    'special characters': string.punctuation
}

characters = []
for name, value in character_sets.items():
    if input(f'Do you want {name} in your password?(y/n) ') == 'y':
        characters.extend(random.choices(value, k=int(input(f'How many {name} do you want in your password? '))))
random.shuffle(characters)
print(f'Your generated password is : {"".join(characters)}')
2 голосов
/ 14 января 2020

Просто что-то вроде:

user_letter_length = None
user_numbers_length = None
user_special_length = None

if ans_l == 'y':
    print("how many letters do you want in your password?")
    user_letter_length = input()

if ans_n == 'y':
    print("how many numbers do you want in your password?")
    user_numbers_length = input()

if ans_s == 'y':
    print("how many special characters do you want in your password?")
    user_special_length = input()

Затем, когда вы создаете пароль, просто проверьте, является ли какой-либо из user_letter_length, user_numbers_length или user_special_length None. Если какая-либо переменная None, это потому, что пользователь не установил их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...