为了账号安全,请及时绑定邮箱和手机立即绑定

类型错误:尝试获取用户输入时,“元组”对象不可调用

类型错误:尝试获取用户输入时,“元组”对象不可调用

一只名叫tom的猫 2021-09-25 21:19:10
我在运行我的代码时遇到这种错误,但我不明白这是什么意思Traceback (most recent call last):                                                                                                               File "/home/main.py", line 27, in <module>                                                                                                       dataCheck(data);                                                                                                                             File "/home/main.py", line 24, in dataCheck                                                                                                      values=data();                                                                                                                             TypeError: 'tuple' object is not callable这是我写的代码:print("Welcome to the game!");def data():    name=input("Give me your name: ");    lname=input("Give me your last name: ");    age=int(input("Give me your age: "));    return (name,lname,age);def dataCheck(data):    name=data[0];    lname=data[1];    age=str(data[2]);    print("Your name: "+name);    print("Your Last name: "+lname);    print("Your age: "+age);    yn=input("The information are true Y/N :");    if yn.lower()=="y":        print("Welcome "+name);    elif yn.lower()=="n":        values=data();        dataCheck(values);data=data();dataCheck(data);
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

在一个层面上,你犯了一个错误,因为你定义data为一个函数,重新定义data为函数返回的内容,并最终试图data用作你最初定义的函数(Python 抱怨你试图将元组用作函数:TypeError: 'tuple' object is not callable)。为函数和玩家信息使用不同的名称就足以解决您的问题。

在另一个层面上,你命名你的函数是错误的。函数代表动作,因此您应该尝试为它们使用动作名称。 dataCheckis OK, (that, or check_dataif you want to pressure the verb), datais not good, get_datacould be OK but get_player_datais even better, with check_player_dataas well.


作为第一个脚注,而不是name=data[0];etc 更惯用的是将整个元组/列表解包为a, b, c = data.


第二个,你dataCheck没有产生结果......data需要编辑你得到新的valuesdata不会被你的功能修改。


第三次和最后一次,如果你想编辑datacheckData,不这样做

    elif yn == 'n':
        data = get_data()

因为这将创建一个不会在调用者名称空间级别产生回响的本地分配。


查看完整回答
反对 回复 2021-09-25
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你有一个命名空间冲突。一旦你说data = data(),函数data()就消失了,所以当你用 调用它时values = data(),你试图调用它之前返回的值。


尝试这个。


print("Welcome to the game!")


def get_data():

    name = input("Give me your name: ")

    lname = input("Give me your last name: ")

    age = int(input("Give me your age: "))

    return (name, lname, age)


def data_check(data):

    name, lname, age = data

    print("Your name: " + name)

    print("Your Last name: " + lname)

    print("Your age: " + str(age))

    yn = input("The information are true Y/N :")

    if yn.lower() == "y":

        print("Welcome " + name)

    elif yn.lower() == "n":

        data_check(get_data())


data_check(get_data())

注意我也


删除了分号(Python 中不需要分号)

snake_cased该data_check功能(这是惯例)

在 中使用元组解包而不是单独赋值data_check(),这是一个方便的快捷方式


查看完整回答
反对 回复 2021-09-25
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

总是使用一些唯一的变量名或注意函数/变量名。在您的情况下,由于名称相同,它将数据视为元组,而不是您要引用的元组。请比较与您的代码和下面的差异。


print("Welcome to the game!");



def Input_data():

    name=input("Give me your name: ");

    lname=input("Give me your last name: ");

    age=int(input("Give me your age: "));

    return (name,lname,age);


def dataCheck(data):

    name=data[0];

    lname=data[1];

    age=str(data[2]);

    print("Your name: "+name);

    print("Your Last name: "+lname);

    print("Your age: "+age);

    yn=input("The information are true Y/N :");

    if yn.lower()=="y":

        print("Welcome "+name);

    elif yn.lower()=="n":

        values=Input_data();

        dataCheck(values);

data=Input_data();

dataCheck(data);


查看完整回答
反对 回复 2021-09-25
  • 3 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信