我收到了
TypeError: Can't convert 'float' object to str implicitly
使用
Gambler.pot += round(self.bet + self.money * 0.1)
锅,赌注和金钱都是双打(或至少应该是)。我不确定这是否是另一个Eclipse的东西,但我如何让这行编译?
初始化bet
和money
的代码:
class Gambler:
money = 0
bet = 0
测试用例:
number = 0
print("Here, the number is a {0}".format(type(number)))
number = input("Enter in something: ")
print("But now, it has turned into a {0}".format(type(number)))
测试用例的输出:
Here, the number is a <class 'int'>
Enter in something: 1
But now, it has turned into a <class 'str'>
显然,input()正在将其更改为字符串。
编辑:最后用
修复了问题(我认为)self.bet = int(self.bet.strip())
用户输入值后。虽然我不知道如果这是解决问题的最佳方法:)
Daniel G的更好解决方案:
self.bet = float(input("How much would you like to bet? $"))
答案 0 :(得分:6)
input()
仅返回字符串。程序员的工作是将它传递给数字构造函数,以便将其转换为数字。
答案 1 :(得分:4)
你在初始化锅吗?你是否尝试过存储中间结果来追踪问题来自哪里?最后,你知道pdb吗?这可能是一个很大的帮助。
class Gambler:
pot = 0.0
def __init__(self, money=0.0)
self.pot = 0.0
self.bet = 0.0
self.money = money
def update_pot(self):
import pdb; pdb.set_trace()
to_pot = self.bet + self.money * 0.1
to_pot = round(to_pot)
Gambler.pot = Gambler.pot + to_pot
执行set_trace()行时会出现提示。到达那里时,请尝试查看当前值。
(Pdb) h # help
(Pdb) n # go to next statement
(Pdb) l # list source code
...
(Pdb) to_pot
...
(Pdb) self.bet
...
(Pdb) self.money
...
(Pdb) Gambler.pot
...
(Pdb) c # continue
答案 2 :(得分:3)
如果Gambler.pot
,self.bet
或self.money
中的任何一个以某种方式成为字符串(因为它们在某个时刻被设置为字符串),+
将被视为字符串连接,它会导致您看到的错误消息。
答案 3 :(得分:3)
Python3.2 (py3k:77602)给出了以下错误消息:
>>> "1.2" * 0.1 #1 Traceback (most recent call last): File "", line 1, in TypeError: can't multiply sequence by non-int of type 'float' >>> "3.4" + 1.2 * 0.1 #2 Traceback (most recent call last): File "", line 1, in TypeError: Can't convert 'float' object to str implicitly >>> n = "42" >>> n += round(3.4 + 1.2 * 0.1) #3 Traceback (most recent call last): File "", line 1, in TypeError: Can't convert 'int' object to str implicitly
我怀疑您的错误消息是因为您的某个实际值是字符串而不是类似于#2的情景中的预期浮点数,这与您的例外完全匹配。
请记住,Py3.x的输入与Py2.x的 raw _input 和Py2.x的输入相同>已经消失(相当于使用 evai ,你不想这样做)。因此,3.x中的 input 将始终返回一个字符串。使用 int 转换:
n = int(input("Enter a number: "))
如果你想处理输入错误,那就赶上ValueError,这是 int 引发错误的原因:
try:
n = int(input("Enter a number: "))
except ValueError:
print("invalid input")
else:
print("squared:", n*n)
答案 4 :(得分:2)
在Python 3.x中,input()
取代了Python 2.x的raw_input()
。因此,函数input()
返回用户输入的确切字符串(如raw_input()
在先前版本中所做的那样)。
要获得Python 2.x行为,您可以执行
number = eval(input("Please enter a number: "))
但是,我不建议使用“eval”,因为用户可以在那里放置他们想要的任何Python行,这可能不是你想要的。如果你知道你想要float
,那就告诉Python你想要的是什么:
number = float(input("Please enter a number: "))
答案 5 :(得分:0)
正如在评论中所说,你所展示的是将局部变量初始化为0.而是尝试类似:
class Gambler:
def __init__(self):
self.bet = 0.0
self.money = 0.0
def calc_pot(self):
self.pot = round(self.bet + self.money * 0.1)
g = Gambler()
g.bet = 2.0
g.money = 5.0
g.calc_pot()
print "Pot = %f" % (g.pot)
另外,确保没有任何东西可以将这些成员变成字符串。