2015-04-22 65 views
1

我有一個程序獲取用戶的輸入,然後詢問信息是否正確。但是,當用戶輸入信息後,我得到一個錯誤與此代碼:Python用戶數據檢查

#Welcome 
print("Welcome to the game!\n") 


def data(): 
    #Age 
    age = int(input("Enter your age: ")) 
    #Gender 
    gen = input("Enter your gender: ") 
    #email 
    mail = input("Enter your email: ") 
    #username 
    name = input("Enter your name: ") 
    return (age, gen, mail, name) 

def datacheck(): 
    print("Your information:\n") 
    print("Age: ", age, "\n") 
    print("Gender: ", gen, "\n") 
    print("Email: ", mail, "\n") 
    print("Username: ", name, "\n") 
    yn = input("Is it correct? Yes or No: ") 
    if yn == "Yes": 
     print("Hello, ", name) 
    if yn == "No": 
     data() 
     #Array to variables 
     age = data[0] 
     gen = data[1] 
     mail = data[2] 
     name = data[3] 
     #datacheck 
     datacheck() 


data = data() 


#Array to Variable. 
age = data[0] 
gen = data[1] 
mail = data[2] 
name = data[3] 
#datacheck 
datacheck() 

我得到的錯誤是:

Traceback (most recent call last): File "/Users/joe/Documents/test123.py", line 48, in datacheck() File "/Users/joe/Documents/test123.py", line 20, in datacheck print("Age: ", age, "\n") UnboundLocalError: local variable 'age' referenced before assignment

還有,如果我輸入沒有錯誤,但重新進入信息的不工作:

#Welcome 
print("Welcome to the game!\n") 


def data(): 
    #Age 
    age = int(input("Enter your age: ")) 
    #Gender 
    gen = input("Enter your gender: ") 
    #email 
    mail = input("Enter your email: ") 
    #username 
    name = input("Enter your name: ") 
    return (age, gen, mail, name) 

def datacheck(): 
    print("Your information:\n") 
    print("Age: ", age, "\n") 
    print("Gender: ", gen, "\n") 
    print("Email: ", mail, "\n") 
    print("Username: ", name, "\n") 
    yn = input("Is it correct? Yes or No: ") 
    if yn == "Yes": 
     print("Hello, ", name) 
    if yn == "No": 
     data() 
     #datacheck 
     datacheck() 


data = data() 


#Array to Variable. 
age = data[0] 
gen = data[1] 
mail = data[2] 
name = data[3] 
#datacheck 
datacheck() 

如何我會得到它,以便用戶可以重新輸入自己的信息(數據功能)?

回答

2

data()datacheck()這兩個年齡,gen,郵件,名稱都是local variables,那些變量scope是它們所屬的方法。您必須將這些變量定義爲global,或者將變量/元組對象從一種方法傳遞給另一種方法。

根據你的邏輯,你需要你的元組對象傳遞到datacheck(),其修改爲datacheck(tuple),我測試如下:

[email protected] ~/PycharmProjects/Test $ cat test.py 
#Welcome 
print("Welcome to the game!\n") 


def data(): 
    #Age 
    age = int(input("Enter your age: ")) 
    #Gender 
    gen = input("Enter your gender: ") 
    #email 
    mail = input("Enter your email: ") 
    #username 
    name = input("Enter your name: ") 
    return (age, gen, mail, name) 


def datacheck(data): 
    age = data[0] 
    gen = data[1] 
    mail = data[2] 
    name = data[3] 

    print("Your information:\n") 
    print("Age: ", age, "\n") 
    print("Gender: ", gen, "\n") 
    print("Email: ", mail, "\n") 
    print("Username: ", name, "\n") 
    yn = input("Is it correct? Yes or No: ") 
    if yn == "Yes": 
     print("Hello, ", name) 
    if yn == "No": 
     values = data() 
     #datacheck 
     datacheck(values) 


data = data() 

#Array to Variable. 
age = data[0] 
gen = data[1] 
mail = data[2] 
name = data[3] 
#datacheck 
datacheck(data)[email protected] ~/PycharmProjects/Test $ python test.py 
Welcome to the game! 

Enter your age: 22 
Enter your gender: "male" 
Enter your email: "[email protected]" 
Enter your name: "haifzhan" 
Your information: 

('Age: ', 22, '\n') 
('Gender: ', 'male', '\n') 
('Email: ', '[email protected]', '\n') 
('Username: ', 'haifzhan', '\n') 
Is it correct? Yes or No: "Yes" 
('Hello, ', 'haifzhan') 
0

您的變量不是全局變量,您需要將它們傳遞給函數或將它們聲明爲全局變量。 Python 2.7 getting user input and manipulating as string without quotations

#Welcome 
print("Welcome to the game!\n") 


def data(): 
    #Age 
    age = raw_input(input("Enter your age: ")) 
    #Gender 
    gen = raw_input("Enter your gender: ") 
    #email 
    mail = raw_input("Enter your email: ") 
    #username 
    name = raw_input("Enter your name: ") 
    return (age, gen, mail, name) 

def datacheck(age, gen, mail, name): 
    print("Your information:\n") 
    print("Age: ", age, "\n") 
    print("Gender: ", gen, "\n") 
    print("Email: ", mail, "\n") 
    print("Username: ", name, "\n") 
    yn = raw_input("Is it correct? Yes or No: ") 
    if yn == "Yes": 
     print("Hello, ", name) 
    if yn == "No": 
     data() 
     #datacheck 
     datacheck(age, gen, mail, name) 


data = data() 


#Array to Variable. 
age = data[0] 
gen = data[1] 
mail = data[2] 
name = data[3] 
#datacheck 
datacheck(age, gen, mail, name) 

工作對我來說:

的raw_input也爲這裏指出應使用,而不是輸入字符串。

+0

時,答案是:「如果YN ==」 _No_ – ForceBru

+1

變化沒有這不起作用「:」部分datacheck()datatck(年齡,gen,郵件,名稱) – zinjaai

+0

啊是的,謝謝你,我沒有測試所有的用例。 – marsh

0

您需要從第一個函數變量傳遞到第二在嘗試使用它們之前

#Welcome 
print("Welcome to the game!\n") 


def data(): 
    age = int(input("Enter your age: ")) 
    gen = str(input("Enter your gender: ")) 
    mail = str(input("Enter your email: ")) 
    name = str(input("Enter your name: ")) 
    return (age, gen, mail, name) 

def datacheck(): 
    age, gen, mail, name = data() 
    print("Your information:\n") 
    print("Age: %s\n"%(age)) 
    print("Gender: %s\n"%(gen)) 
    print("Email: %s\n"%(mail)) 
    print("Username: %s\n"%(name)) 
    yn = input("Is it correct? Yes or No: ") 
    if yn == "Yes": 
     print("Hello, ", name) 
    if yn == "No": 
     datacheck() 

#datacheck 
datacheck() 
+0

不會無限循環? – marsh

+0

@marsh是的,我編輯它以提高效率 – bladexeon

1

您有scoping問題。

此外,我想你可能要考慮的是object oriented。也就是說,如果我的假設對你使用用戶數據是正確的。您可以將用戶的屬性保存在一個名爲object的地方,而不是將您的用戶屬性保存在一堆數組(列表)中。我的意思是,如果您的用戶最終擁有2,000個屬性,您是否想要記住屬性編號代表他們的眼睛顏色,以便您可以在列表中引用它?可能不會。哈哈

這種方法可能使你的代碼更易於使用/再利用和對未來更有組織:

class User(): 
    """A class representing a user. 

    defaults set. 
    """ 

    def __init__(self, data={'age': 1, 
          'gender': 'x', 
          'mail': '[email protected]', 
          'name': 'User'}): 

     self.data = data 
     self.age = self.data['age'] 
     self.gender = self.data['gender'] 
     self.mail = self.data['mail'] 
     self.name = self.data['name'] 

    def __str__(self): 
     """The string representation of a User object.""" 

     return self.name 


    def get_age(self): 
     """Return the user's age.""" 

     return self.age 

    def get_gender(self): 
     """Return the user's gender.""" 

     return self.gen 

    def get_mail(self): 
     """Return the user's email address.""" 

     return self.mail 

    def get_name(self): 
     """Return the user's name.""" 

     return self.name 

    def get_data(self): 
     """Return a dictionary containing a User's info.""" 

     return self.data 

if __name__=="__main__": 

    user_data = {} # will contain our data 

    # ask for user input 
    for key in ["age", "gender", "mail", "name"]: 
     user_data[key] = raw_input("Enter your %s: " % key) 

    # Store user input data in an object 
    user = User(data=user_data) 

    print user.get_data() # prints a dictionary containing user values 
+0

謝謝。將來,我會考慮使用這個。 :) –

+0

@ user3687911酷。沒問題! –