Что я пропустил? - PullRequest
       48

Что я пропустил?

0 голосов
/ 25 июня 2019

Я пытаюсь научить себя Python и прорабатываю некоторые онлайн-уроки. Я создал базовую программу, которая просит вас ввести имя и пароль (которые хранятся в виде переменных). Затем он просит вас повторно ввести их и, если они соответствуют отпечаткам, предоставляется разрешение.

Я определил некоторые функции с глобальными переменными. Однако, если я выложу глобальную декларацию, моя программа все равно будет работать. Из того, что я прочитал, переменные, не объявленные как глобальные внутри функции, должны быть локальными. Так что с глобальной декларацией # моя программа не должна работать. Но это так. Что я пропустил?

import sys

#password = ""
#name = ""
#inputName = ""
#inputPassword = ""
#accountAnswer = ""

def username():
    #global inputName
    print("What is your name?")
    inputName = input()
    while name != inputName:
        print("Sorry, you are not a registered user.")
        print("What is your name?")
        inputName = input()
    #return

def pwrd():
    #global inputPassword
    print("Please enter your password:")
    inputPassword = input()
    while inputPassword != password:
        print("Sorry, incorrect Password:")
        print("Please re-enter your password:")
        inputPassword = input()
        continue
    #return


print("Hi there, would you like to create an account? (y/n)")


while True:
    accountAnswer = input()
    if accountAnswer == "y":
        break
    if accountAnswer == "n":
        break
    print("That was an incorrect response")
    print("Would you like to create an account? (y/n)")


if accountAnswer == "y":
    print("Great! Let's get you set up.")
else:
    print("OK, no worries.")
    sys.exit()

print("Choose a username")
name = input()

print("Now choose a password.")
password = input()

print("let's try logging in.")

username()

pwrd()

print("Access Granted")

print(name, password)

1 Ответ

0 голосов
/ 25 июня 2019

То, с чем вам следует ознакомиться, это Scope. Вы можете найти много информации об этом в режиме онлайн, но в короткой области видимости вашей переменной. Итак, в вашем примере давайте попробуем выполнить шаги, которые выполняет интерпретатор при вводе вашей функции.

имя пользователя ()

  1. Печать текста
  2. Присвойте значение от input() переменной с именем inputName. Обратите внимание, что не имеет значения, существовала ли переменная раньше или нет. Если это не так, переводчик создаст его.
  3. Введите while цикл.
  4. Проверить, равна ли переменная с именем name inputName. Интерпретатор не может видеть переменную name в текущем scope , поэтому он пытается посмотреть на один рычаг выше, что является вашим основным сценарием. Он находит переменную, поэтому использует ее (которую вы объявили в строке 51).

Я надеюсь, что вы понимаете основную концепцию здесь. Это, однако, не должно использоваться в качестве метода по умолчанию. Лучше создавать функции, которые принимают аргументы, а не использовать глобальные переменные или более высокую область видимости.

Одна маленькая заметка в конце. Я рекомендую вам попробовать использовать редактор, такой как PyCharm . Он предупредит вас о таких ситуациях. Это также поможет вам лучше следовать следующим правилам стиля кода (документ называется PEP8), которые включают, как именовать переменные, где ставить и сколько пробелов и т. Д. На данный момент это может показаться ненужным, но сэкономит вам много времени. изменение привычек позже.

Удачи!

...