2017-07-20 32 views
-4

関数から2つの変数を返すことに問題が出てきましたが、変数をグローバルに設定しています。私が作成しているプログラムは、ユーザーを追加してそのユーザーにログインする、またはユーザーのパスワードを変更するプロセスを模倣するように設計されています。関数のpythonからの戻り値

check = False 

global uname 
global pword 

uname = 0 
pword = 0 

while check == False: 


def user(uname, pword): 
    set_uname = input("Enter username: ") 
    set_pword = input("Enter password: ") 
    print("Username and Password set") 

    return(set_uname, set_pword) 

def login(uname, pword): 
    correct = False 
    while correct == False: 
     enter_uname = input("Enter username: ") 
     enter_pword = input("Enter password: ") 
     if enter_uname == uname and enter_pword == pword: 
      print("Login successful") 
     elif enter_uname != uname or enter_pword != pword: 
      print("Incorrect username or password") 
      correct = False 

def cpword(pword): 
    done = False 
    while done == False: 
     check_pword = input("Enter current password: ") 
     if check_pword == pword: 
      new_pword = input("Enter new password: ") 
      if new_pword == pword: 
       print("New password cannot be old password") 
       done = False 
      elif new_pword != pword: 
       print("Password successfully changed") 
       pword = new_pword 
       done = True 
       return(pword) 
     elif check_pword != pword: 
      print("Incorrect password") 
      done = False 

print("Enter User") 
user(uname, pword) 

uname = set_uname 
pword = set_pword 

print("Login = 1") 
print("Change Password = 2") 

choice = int(input("Enter function: ")) 

if choice == 1: 
    login(uname, pword) 
elif choice == 2: 
    cpword(pword) 
    pword = pword 

私は、エラーを受信し続ける:

Traceback (most recent call last): File "C:\Users\tay.swain\Documents\Login.py", line 54, in uname = set_uname NameError: name 'set_uname' is not defined

私は、ユーザーを設定すると、私はこのエラーが表示されたログイン機能を実行するとき。返信しようとしています。

return(set_uname, set_pword)

ユーザー機能です。関数から変数を返す方法を理解していますが、このコードでは関数を呼び出せません。あなたは、関数から2つの変数を返すようにしようとしている

+1

"変数をグローバルに設定しました" - あなたのプログラムは 'set_uname'と' set_pword'がグローバルであるとは言いません。 – khelwood

+0

これはうまくいきました。変数をグローバルとして設定することなく、以前のような変数を返すことができました。 –

+0

なぜ、 'set_uname'がグローバルスコープになると思いますか?また、あなたのトップレベルの 'global'指示文は完全に冗長です*あなたは既にグローバルスコープ*にあります。また、 'user'関数は値のペアを返しますが、呼び出しの結果を何か.... user(uname、pword)'に代入しないと破棄します。 –

答えて

3

は言う:

def foo(): 
    a = 1 
    b = 2 
    return a,b 

を明らかに、私は、関数の外からaまたはbにアクセスしようとした場合、私はあなたが見ている同じエラー、すなわちを受け取ることになりますa NameError

私たちが行うことができ、関数の外で使用する値を返すために:関数を呼び出すときに、単純に2つの変数を使用して、次の2つの変数に返すものは何でも得るために

c = foo() 
print (c) 
# (1,2) which is a tuple 

を:

a,b = foo() 
print (a,b) 
# 1 1 
+2

FWIWで入力されたパスワードを使用して、 'return'ステートメントのそれらの括弧は余分です。 – deceze

+3

Nitpick、角括弧はタプルを作成しません。カンマはタプルを作成しません。 –

+0

@ juanpa.arrivillagaありがとう、それを知らなかった! – DavidG