функция не возвращает ничего вместо кортежа - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Python 2.7.Я написал код для генерации паролей.Для этого я использовал случайный модуль, чтобы сгенерировать, сколько символов разных типов (прописные, строчные, специальные и цифры) нужно использовать для генерации пароля заданной длины.Когда a написал функцию для этого, он должен был вернуть кортеж, но он возвращает None.Почему это происходит?

Я попробовал случайный метод отладки - поместить операторы печати между ними и выяснить, где это пошло не так.Все работает просто отлично, кроме того, что возвращает None.

def passlen(a):
    """Gives length of different characters to be put into passwords"""
    uplen=random.randrange(0, a)
    lwlen=random.randrange(0, a)
    speclen=random.randrange(0, a)
    nmbrlen=random.randrange(0, a)
    if uplen+lwlen+speclen+nmbrlen==a:
        print (uplen, lwlen, speclen, nmbrlen)
        return(uplen, lwlen, speclen, nmbrlen)
    else:
        passlen(a)

x=input("how many characters in the password?")

print(passlen(x))

Ожидаемый результат - 4 кортежа, но вместо этого он дает None.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

То есть вы хотите четыре случайных числа, которые добавляют к a?Конечно, вы можете попытаться выбрать четыре случайных числа, пока не найдете набор, который составляет в сумме a, но это может занять некоторое время для больших значений a (и вы определенно не хотите делать это рекурсивно).

Намного лучше выбрать три точки разделения между 0 и a:

def passlen(a):
    splits = sorted([random.randrange(0,a) for _ in range(3)])
    uplen = splits[0]
    lwlen = splits[1] - uplen
    speclen = splits[2] - uplen - lwlen
    nmbrlen = a - uplen - lwlen - speclen
    return uplen, lwlen, speclen, nmbrlen
0 голосов
/ 29 апреля 2019

Спасибо Kamiccolo за попытку помочь.

Функция должна выглядеть следующим образом:

def passlen(a):
    """Gives length of different characters to be put into passwords"""
    uplen=int(random.randrange(0, a))
    lwlen=int(random.randrange(0, a))
    speclen=int(random.randrange(0, a))
    nmbrlen=int(random.randrange(0, a))
    bab=(uplen, lwlen, speclen, nmbrlen)
    if uplen+lwlen+speclen+nmbrlen==a:
        return bab
    else:
        return passlen(a)

A дублирующая тема также помогла мне в этом.

...