Почему этот Python Password Generator не работает, NAM четко определен - PullRequest
0 голосов
/ 06 апреля 2019

Итак, я новый кодер на Python и создаю генератор паролей, но его поговорка nam не определена.

Это мой код:

    import random
    import string

    def gen():
    let1 = random.choice(string.ascii_lowercase)
    let2 = random.choice(string.ascii_lowercase)
    let3 = random.choice(string.ascii_lowercase)
    let4 = random.choice(string.ascii_lowercase)
    let5 = random.choice(string.ascii_lowercase)
    nam = let1 + let2 + let3 + let4 + let5


    def num():
      num = '1234567890'
      number = random.choice(string.ascii_letters(num))

    pas = nam + nam + number + number + nam + number

    print(pas)

Ответы [ 2 ]

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

Есть local variables и global variables.

Вы создаете nam внутри gen(), и это локальная переменная, которая существует только внутри gen(), но не снаружи gen().

Но за пределами gen() вы пытаетесь получить значение из nam

pas = nam + nam + number + number + nam + number

, но Python не знает, как получить значение из переменной, которая не существует вне gen().

Внутри gen() вы можете использовать return nam для отправки значения из функции во внешнюю функцию.

И тогда вы можете запустить gen() и передать возвращаемое значение переменной.Это может быть nam.

nam = gen()

Таким образом, вы создаете локальную переменную nam, которая существует вне get(), но не внутри get().Для Python это будут две разные переменные.

У вас та же проблема с number в функции num()

вместо string.ascii_letters(num) (что неверно) и num Iбудет использовать string.digits

import random
import string

def gen():
    let1 = random.choice(string.ascii_lowercase)
    let2 = random.choice(string.ascii_lowercase)
    let3 = random.choice(string.ascii_lowercase)
    let4 = random.choice(string.ascii_lowercase)
    let5 = random.choice(string.ascii_lowercase)
    nam = let1 + let2 + let3 + let4 + let5
    return nam

def num():
    number = random.choice(string.digits)
    return number 

nam = gen()
number = num()
pas = nam + nam + number + number + nam + number

print(pas)

Чтобы сделать его чище, я меняю имена внутри функций - теперь это только один nam и один number

import random
import string

def gen():
    let1 = random.choice(string.ascii_lowercase)
    let2 = random.choice(string.ascii_lowercase)
    let3 = random.choice(string.ascii_lowercase)
    let4 = random.choice(string.ascii_lowercase)
    let5 = random.choice(string.ascii_lowercase)
    result = let1 + let2 + let3 + let4 + let5
    return result

def num():
    result = random.choice(string.digits)
    return result

nam = gen()
number = num()
pas = nam + nam + number + number + nam + number

print(pas)

Я также могу удалитьпеременные result

import random
import string

def gen():
    let1 = random.choice(string.ascii_lowercase)
    let2 = random.choice(string.ascii_lowercase)
    let3 = random.choice(string.ascii_lowercase)
    let4 = random.choice(string.ascii_lowercase)
    let5 = random.choice(string.ascii_lowercase)
    return let1 + let2 + let3 + let4 + let5

def num():
    return random.choice(string.digits)

nam = gen()
number = num()
pas = nam + nam + number + number + nam + number

print(pas)
0 голосов
/ 06 апреля 2019

Во-первых, ваши отступы немного сбиты (может быть, просто как вы это опубликовали?). Однако вы также не return получаете какие-либо значения из ваших функций, и, следовательно, не сможете получить доступ к nam или number, как вы предполагаете. Вы можете настроить свой скрипт так, чтобы он возвращал эти переменные, а затем измените определение pas для вызова этих функций. Что-то вроде:

import random
import string

def gen():
    let1 = random.choice(string.ascii_lowercase)
    let2 = random.choice(string.ascii_lowercase)
    let3 = random.choice(string.ascii_lowercase)
    let4 = random.choice(string.ascii_lowercase)
    let5 = random.choice(string.ascii_lowercase)
    nam = let1 + let2 + let3 + let4 + let5
    return nam

def num():
    num = '1234567890'
    number = random.choice(num)
    return number

pas = gen() + gen() + num() + num() + gen() + num() # call functions, not variables within them

print(pas)

В результате: hjvcwvmnlx79rnmdp7 печатается (когда я его запустил, ваш вывод будет отличаться).

Я предлагаю вам ознакомиться с созданием функций и областью видимости, поскольку основными ошибками были попытки получить доступ к локальной переменной из глобальной области видимости, и при этом ваши функции фактически ничего не делают (они довольно бесполезны без return)

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