Python 错误是:无法将序列与“float”类型的非int相乘

Python 错误是:无法将序列与“float”类型的非int相乘,python,jython,Python,Jython,例如,我必须制作一个命令行游戏,以怪物1和2的亲和性(HP)广告为基础,在包含亲和性优势的同时与它们作战 如果怪物1的亲和性是地球,而怪物2的亲和性是火,则每次命中比*怪物1的广告低20%,每次命中比*怪物2的广告低20% def getmonsterData(): global Affinity1 global Affinity2 global HP1 global HP2 global AD1 global AD2 monster1

例如,我必须制作一个命令行游戏,以怪物1和2的亲和性(HP)广告为基础,在包含亲和性优势的同时与它们作战

如果怪物1的亲和性是地球,而怪物2的亲和性是火,则每次命中比*怪物1的广告低20%,每次命中比*怪物2的广告低20%

def getmonsterData():

    global Affinity1
    global Affinity2
    global HP1
    global HP2
    global AD1
    global AD2
    monster1 =  raw_input("Enter the Monster 1's Affinity|HP|AD> ")
    x = monster1.index('|')
    y = monster1.index('|',x+1)
    Affinity1 = monster1[:x]
    HP1 = monster1[x+1:y]
    AD1 = monster1[y+1:]
    printNow(Affinity1+"|"+HP1+"|"+AD1)

    monster2 =  raw_input("Enter the Monster 2's Affinity|HP|AD> ")
    x = monster2.index('|')
    y = monster2.index('|',x+1)
    Affinity2 = monster2[:x]
    HP2 = monster2[x+1:y]
    AD2 = monster2[y+1:]
    printNow(Affinity2+"|"+HP2+"|"+AD2)
    battleNow();


def battleNow():

    global Affinity1
    global Affinity2
    global HP1
    global HP2
    global AD1
    global AD2
    if (Affinity1 == Affinity2):
       printNow("There are no affinity advantages in this battle")
    if (Affinity1 == ("Earth") and Affinity2 == ("Fire")):
       AD1 = (AD1*.20)+AD1  #THIS IS SUPPOSED TO RETURN AD1(MONSTER 1'S AD) TO THE INCREASED 20%
       printNow("Monster 1 has an affinity advantage over Monster 2")
       return
       printNow(AD1)
然而,一旦我这样做了,我就会犯这个恼人的错误

======= Loading Progam =======
Enter the Monster 1's Affinity|HP|AD> Earth|55|1
Earth|55|1
Enter the Monster 2's Affinity|HP|AD> Fire|52|1
Fire|52|1
The error was:can't multiply sequence by non-int of type 'float'
Inappropriate argument type.
我不知道该怎么办。。我找遍了所有的地方,没有一个真正可靠的答案与列表的乘法无关。 帮助:D

EDITTTTTT: 在将HP1/2和AD1/2更改为int之后,我没有收到任何错误,但只接收

======= Loading Progam =======
Enter the Monster 1's Affinity|HP|AD> Earth|22|1
Enter the Monster 2's Affinity|HP|AD> Fire|25|1
Monster 1 has an affinity advantage over Monster 2
>>> 
我现在还没拿到最后一张照片。我想打印AD1,看看20%的增长是否正确地添加到AD1中

return
printNow(AD1)

出现此错误是因为所有HPs和ADs都是字符串,而不是整数。将字符串乘以整数时,会得到该字符串的多个副本:

>>> "abc" * 3
abcabcabc
由于无法逻辑地将字符串乘以0.2,因此会出现错误。要修复它,只需使用内置的int函数,如下所示:

HP1 = int(monster1[x+1:y])
作为旁注,我想向您介绍str.split函数。与其计算字符串索引并尝试以这种方式解析输入,不如简单地执行以下操作

Affinity1, HP1, AD1 = monster1.split("|")

你们都准备好了。在任何计算中使用int之前,只需对需要它的变量调用int即可。

您的问题是,您试图将字符串乘以浮点AD1*.20

如果启动python解释器,并执行以下操作:

>>> ad = "10"
>>> print ad *.5 + ad
class Monster():
    """Define monster characteristics
    """
    def __init__(self):
        pass

    def getMonsterData(self):
        monster =  raw_input("Enter the Monster's Affinity|HP|AD> ")
        self.loadMonsterData(monster)

    def loadMonsterData(self, monsterData):
        self.affinity, self.hp, self.ad = monsterData.split('|') # not safe
        print("{}|{}|{}".format(self.affinity, self.hp, self.ad))

def battleNow(monster1, monster2):
    """Make 2 monsters fight it out
    """
    if (monster1.affinity == monster2.affinity):
        printNow("There are no affinity advantages in this battle")
    if (monster1.affinity == "Earth" and monster2.affinity == "Fire"):
        ad = float(monster1.ad)
        monster1.ad = ad * .2 + ad #THIS IS SUPPOSED TO RETURN AD1(MONSTER 1'S AD) TO THE INCREASED 20%
        print("Monster 1 has an affinity advantage ({}) over Monster 2 ({})".format(monster1.ad, monster2.ad))
        return
    print(monster1.ad)

if __name__ == '__main__':
    monsters = []
    monsters.append(Monster())
    monsters.append(Monster())
    monsters[0].loadMonsterData("Earth|100|10")
    monsters[1].loadMonsterData("Fire|50|5")

    battleNow(monsters[0], monsters[1])
你会得到

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
还有一些其他想法:

不要使用globals。 使用类存储特定于实例的数据。 行尾不需要分号。 按照建议,缩进4个空格 我对您的代码进行了一些研究,得出了以下结论:

>>> ad = "10"
>>> print ad *.5 + ad
class Monster():
    """Define monster characteristics
    """
    def __init__(self):
        pass

    def getMonsterData(self):
        monster =  raw_input("Enter the Monster's Affinity|HP|AD> ")
        self.loadMonsterData(monster)

    def loadMonsterData(self, monsterData):
        self.affinity, self.hp, self.ad = monsterData.split('|') # not safe
        print("{}|{}|{}".format(self.affinity, self.hp, self.ad))

def battleNow(monster1, monster2):
    """Make 2 monsters fight it out
    """
    if (monster1.affinity == monster2.affinity):
        printNow("There are no affinity advantages in this battle")
    if (monster1.affinity == "Earth" and monster2.affinity == "Fire"):
        ad = float(monster1.ad)
        monster1.ad = ad * .2 + ad #THIS IS SUPPOSED TO RETURN AD1(MONSTER 1'S AD) TO THE INCREASED 20%
        print("Monster 1 has an affinity advantage ({}) over Monster 2 ({})".format(monster1.ad, monster2.ad))
        return
    print(monster1.ad)

if __name__ == '__main__':
    monsters = []
    monsters.append(Monster())
    monsters.append(Monster())
    monsters[0].loadMonsterData("Earth|100|10")
    monsters[1].loadMonsterData("Fire|50|5")

    battleNow(monsters[0], monsters[1])

请缩进超过1个空格!标准是4,代码可读性更高,错误更少。不确定我是否知道你的意思?我是新来的。只是试着为你留出更多的空间在返回后做任何事情都是毫无意义的-返回完成了功能-然后该功能退出。在将我的广告和HP的更改为int后,我没有将affinity更改为int,因为它仍然是一个str,因为土/火/水,它可以打印出affinity优势,但它没有打印发布怪物1AD1的新广告。AD1=AD1*.20+AD1是否足以添加20%的增量intAD?@Erik应该可以,而且由于运算符优先级,您甚至不需要括号。是的,当我运行完这个,我没有得到错误,但我只得到加载程序的输出==========输入怪物1的亲和性HP广告>地球22 1输入怪物2的亲和性HP广告>火25 1怪物1比怪物2有亲和性优势>>@ErikVorcov首先,printNow看起来像什么,你为什么要制作自己的打印功能?第二,在返回语句之后,函数中不会发生任何事情,因此最终的printNowAD1将永远不会运行。@ErikVorcov第三,不能使用+运算符将int和字符串连接在一起,因为您将得到一个错误,我猜这可能会被printNow吞没。试着运行print |。加入[Affinity1,HP1,AD1]中的[strx for x],看看它是如何工作的。这对我来说非常混乱?当我将它加载到Jython-JES环境中时,我会收到大量语法错误,当我修复它要求我修复的东西时,我只会收到更多错误,说“怪物”不是全局的。很明显,如果你在gloobal中遇到任何错误,你都不会修复任何东西。类的意义在于可以完全删除全局变量。我们在本编程课程中没有使用任何类,我在ITEC 109中。我们用Jython编写,它不使用类,因为类怪物,我得到了一个语法错误。。