一、问题
我在尝试着写一个文字游戏,遇到了一个函数错误,这个函数实现的功能是:在你输入完字符后,就会消耗你的技能分。刚开始时报错信息显示我在试图用一个整数减去一个字符,对应代码为“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'
|