python中“TypeError: Can't convert 'int' object to str implicitly"报错的解决办法

一、问题

我在尝试着写一个文字游戏,遇到了一个函数错误,这个函数实现的功能是:在你输入完字符后,就会消耗你的技能分。刚开始时报错信息显示我在试图用一个整数减去一个字符,对应代码为“balance - strength”,这个错误很明显,因此我将其改为“strength = int(strength)”修复了... 但是现在我遇到了一个以前从未见过的错误(o(╯□╰)o我是一个新手),我不知道它试图在告诉我什么以及如何修复它。


以下为该函数对应的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def attributeSelection():
    balance = 25
    print("Your SP balance is currently 25.")
    strength = input("How much SP do you want to put into strength?")
    strength = int(strength)
    balanceAfterStrength = balance - strength
    if balanceAfterStrength == 0:
        print("Your SP balance is now 0.")
        attributeConfirmation()
    elif strength < 0:
        print("That is an invalid input. Restarting attribute selection. Keep an eye on your balance this time!")
        attributeSelection()
    elif strength > balance:
        print("That is an invalid input. Restarting attribute selection. Keep an eye on your balance this time!")
        attributeSelection()
    elif balanceAfterStrength > 0 and balanceAfterStrength < 26:
        print("Ok. You're balance is now at " + balanceAfterStrength + " skill points.")
    else:
        print("That is an invalid input. Restarting attribute selection.")
        attributeSelection()


以下为运行此部分代码后的报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Your SP balance is currently 25.
How much SP do you want to put into strength?5
Traceback (most recent call last):
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 205in <module>
    gender()
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 22in gender
    customizationMan()
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 54in customizationMan
    characterConfirmation()
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 93in characterConfirmation
    characterConfirmation()
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 85in characterConfirmation
    attributeSelection()
  File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py", line 143in attributeSelection
    print("Ok. You're balance is now at " + balanceAfterStrength + " skill points.")
TypeError: Can't convert 'intobject to str implicitly


(提问者报错信息中涉及较多,部分为其项目代码文件。为缩短报错信息,我将提问者所提到的函数部分代码粘贴到本机后,运行完对应的报错信息如下)

1
2
3
4
5
6
7
8
Your SP balance is currently 25.
How much SP do you want to put into strength?5
Traceback (most recent call last):
  File "test.py", line 26in <module>
    attributeSelection()
  File "test.py", line 20in attributeSelection
    print("Ok. You're balance is now at " + balanceAfterStrength + " skill points.")
TypeError: cannot concatenate 'str' and 'int' objects


有人知道如何解决这个问题吗?先行感谢。


二、答案


你不能将整型(int)与字符串(string)连在一起。你需要使用'str'函数将整型(int)转换为字符型(string),或者使用'formatting'格式化输出。


1
print("Ok. Your balance is now at " + balanceAfterStrength + " skill points.")

改为:

({}  .format方式)

1
print("Ok. Your balance is now at {} skill points.".format(balanceAfterStrength))

或改为:

(使用str函数转换类型)

1
print("Ok. Your balance is now at " + str(balanceAfterStrength) + " skill points.")

或按照下面的一条评论所提及的那样做,使用','将不同的字符串传递给print函数,而不是使用'+'连接。(涉及的评论为:你不能使用','连接字符串;你可以用','将参数分开传递给print函数,这些参数会以空格分割,一个接一个的打印出来,)

1
print("Ok. Your balance is now at ", balanceAfterStrength, " skill points.")



三、总结


当同时打印字符及整型变量时,有以下几种方式来避免“TypeError”报错。

假设变量temp = 3,要输出的内容为the number you input is 3.

1.使用str强制将整型转换为字符型

1
print 'the nume you input is ' + str(temp)

2.使用格式化输出(python2中适用,“format % values”形式),详细使用方法可参考官方文档:https://docs.python.org/2/library/stdtypes.html#string-formatting

1
print 'the nume you input is %s' % temp

3.使用" str.format()"(python2.6以上)格式化输出,详细使用方法可参考官方文档:https://docs.python.org/3/library/string.html#string-formatting

1
print 'the nume you input is {}' .format(temp)

4.使用逗号将变量和字符串分隔

1
print 'the nume you input is' , temp


四、% 及 .format() 两种格式化输出对比

更多实例对比请参考:

https://pyformat.info/

https://github.com/ulope/pyformat.info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
基本输出
Old    '%s %s' % ('one''two')
New    '{} {}'.format('one''two')
Output    one two
 
Old    '%d %d' % (12)
New    '{} {}'.format(12)
Output    1 2
 
#右对齐
Old    '%10s' % ('test',)
New    '{:>10}'.format('test')
Output        test    #test左边有六个空格 
 
#左对齐
Old    '%-10s' % ('test',)
New    '{:10}'.format('test')
Output    test       #test右边有六个空格   
 
#字典 
person = {'first''Jean-Luc''last''Picard'}
New    '{p[first]} {p[last]}'.format(p=person)
Output    Jean-Luc Picard
 
#列表
data = [4815162342]
New    '{d[4]} {d[5]}'.format(d=data)
Output    23 42
 
#Accessing arguments by position:
>>> '{0}, {1}, {2}'.format('a''b''c')
'a, b, c'
>>> '{}, {}, {}'.format('a''b''c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a''b''c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra''cad')   # arguments' indices can be repeated
'abracadabra'  
 
#Accessing arguments by name:
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude''37.24N''longitude''-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'


本文转自 xoyabc 51CTO博客,原文链接:http://blog.51cto.com/xoyabc/1983364,如需转载请自行联系原作者
上一篇:猜数游戏


下一篇:【SVM预测】基于萤火虫算法改进SVM算法实现数据分类matlab源码