【问题标题】:Python user data checkPython用户数据检查
【发布时间】:2015-06-30 08:34:52
【问题描述】:

我有一个程序可以获取用户的输入,然后询问信息是否正确。但是,当用户完成输入信息时,我收到以下代码错误:

#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(最近一次调用最后一次):文件 “/Users/joe/Documents/test123.py”,第 48 行,在 datacheck() 文件“/Users/joe/Documents/test123.py”,第 20 行,在 datacheck print("Age: ", age, "\n") UnboundLocalError: 赋值前引用了局部变量'age'

如果我输入没有错误但重新输入信息不起作用:

#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()

我如何获得它以便用户可以重新输入他们的信息(数据功能)?

【问题讨论】:

    标签: python


    【解决方案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': 'user@default',
                                 '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
    

    【讨论】:

    • 谢谢。将来,我会考虑使用它。 :)
    • @user3687911 酷。没问题!
    【解决方案2】:

    age, gen, mail, name 在data()datacheck() 中都是local variables,这些变量scope 是它们所属的方法。您必须将这些变量定义为global,或者将变量/元组对象从一种方法传递给另一种方法。

    根据你的逻辑,你需要将你的元组对象传入datacheck(),修改为datacheck(tuple),我测试如下:

    hzhang@dell-work ~/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)hzhang@dell-work ~/PycharmProjects/Test $ python test.py 
    Welcome to the game!
    
    Enter your age: 22
    Enter your gender: "male"
    Enter your email: "hi@email.com"
    Enter your name: "haifzhan"
    Your information:
    
    ('Age: ', 22, '\n')
    ('Gender: ', 'male', '\n')
    ('Email: ', 'hi@email.com', '\n')
    ('Username: ', 'haifzhan', '\n')
    Is it correct? Yes or No: "Yes" 
    ('Hello, ', 'haifzhan')
    

    【讨论】:

      【解决方案3】:

      您的变量不是全局变量,您需要将它们传递给函数或将它们声明为全局变量。

      还应使用 raw_input 而不是字符串的输入,如下所述: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)
      

      为我工作。

      【讨论】:

      • 将“if yn == "No":" 部分 datacheck() 更改为 datacheck(age, gen, mail, name)
      【解决方案4】:

      在尝试使用它们之前,您需要将变量从第一个函数传递到第二个函数

      #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()
      

      【讨论】:

      • 不会无限循环吗?
      猜你喜欢
      • 2021-06-03
      • 2017-07-23
      • 2020-12-03
      • 2019-06-19
      • 2016-08-31
      • 2010-12-12
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多