一、问题
我在尝试着写一个文字游戏,遇到了一个函数错误,这个函数实现的功能是:在你输入完字符后,就会消耗你的技能分。刚开始时报错信息显示我在试图用一个整数减去一个字符,对应代码为“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 205 , in <module>
gender()
File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py" , line 22 , in gender
customizationMan()
File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py" , line 54 , in customizationMan
characterConfirmation()
File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py" , line 93 , in characterConfirmation
characterConfirmation()
File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py" , line 85 , in characterConfirmation
attributeSelection()
File "C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py" , line 143 , in attributeSelection
print ( "Ok. You're balance is now at " + balanceAfterStrength + " skill points." )
TypeError: Can 't convert ' int ' object 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 26 , in <module>
attributeSelection()
File "test.py" , line 20 , in 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://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' % ( 1 , 2 )
New '{} {}' . format ( 1 , 2 )
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 = [ 4 , 8 , 15 , 16 , 23 , 42 ]
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' |