我如何连接str和int对象?
如果我试图做到以下几点:
things = 5 print("You have " + things + " things.")
我在Python 3.x中得到以下错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int
…和Python 2.x中的类似错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
我怎样才能解决这个问题?
这里的问题是+
运算符在Python中有(至less)两种不同的含义:对于数字types,它意味着“将数字加在一起”:
>>> 1 + 2 3 >>> 3.4 + 5.6 9.0
…对于序列types,它意味着“连接序列”:
>>> [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> 'abc' + 'def' 'abcdef'
通常,Python不会隐式地将对象从一种types转换为另一种types1 ,以使操作“合理”,因为这会让人困惑:例如,您可能会认为'3' + 5
应该表示'35'
,但别人可能会认为它应该意味着8
甚至'8'
。
同样,Python不会让你连接两种不同types的序列:
>>> [7, 8, 9] + 'ghi' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list
因此,您需要明确地进行转换,无论您想要的是串联还是添加:
>>> 'Total: ' + str(123) 'Total: 123' >>> int('456') + 789 1245
不过, 还有一个更好的办法 。 根据您使用的Python版本,有三种不同的string格式可用2 ,这不仅可以避免多个+
操作:
>>> things = 5
>>> 'You have %d things.' % things # % interpolation 'You have 5 things.'
>>> 'You have {} things.'.format(things) # str.format() 'You have 5 things.'
>>> f'You have {things} things.' # f-string (since Python 3.6) 'You have 5 things.'
…还允许您控制值的显示方式:
>>> value = 5 >>> sq_root = value ** 0.5 >>> sq_root 2.23606797749979
>>> 'The square root of %d is %.2f (roughly).' % (value, sq_root) 'The square root of 5 is 2.24 (roughly).'
>>> 'The square root of {v} is {sr:.2f} (roughly).'.format(v=value, sr=sq_root) 'The square root of 5 is 2.24 (roughly).'
>>> f'The square root of {value} is {sq_root:.2f} (roughly).' 'The square root of 5 is 2.24 (roughly).'
无论使用%插值 , str.format()
还是f-string都取决于您:%插值已经是最长的了(对于C语言中的背景的人来说是熟悉的), str.format()
通常更强大,而f-strings仍然更强大(但只能在Python 3.6及更高版本中使用)。
另一种方法是使用这样的事实:如果您print
多个位置参数,则会使用sep
关键字参数(默认为' '
)将它们的string表示forms连接在一起:
>>> things = 5 >>> print('you have', things, 'things.') you have 5 things. >>> print('you have', things, 'things.', sep=' ... ') you have ... 5 ... things.
…但通常不如使用Python内置的string格式化function那么灵活。
1虽然数字types是个例外,但大多数人会认同“正确”的事情:
>>> 1 + 2.3 3.3 >>> 4.5 + (5.6+7j) (10.1+7j)
2其实四个…但模板string很less使用,有点尴尬。
TL; DR
-
或者:
print("You have " + str(things) + " things.")
(老派的方式) -
或者:
print("You have {} things.".format(things))
(新pythonic和推荐的方式)
多一点口头解释:
虽然上面的这个出色的@Zero Piraeus答案中没有任何内容,但我会尽量“缩小”一点 :
你不能在python中连接一个string和一个数字(任何种类),因为这些对象有不同的加号(+)运算符的定义,这些运算符不相互兼容(在str中,case +用于连接,在数字情况下它被用来一起添加两个数字)。 所以为了解决这个对象之间的“误会”
- 老派的方法是将数字转换为
str(anything)
方法的string,然后将结果与另一个string连接起来。 - 更pythonic和推荐的方法是使用格式方法是非常灵活的(你不必听我的话,阅读文档和本文)
玩得开心,阅读@Zero比雷埃夫斯答案肯定值得你的时间!
解决这个问题的最简单的方法之一(这是个问题,不是吗?)是习惯用逗号(',')作为连接操作符连接任何types的对象到一个string。 这对print()很好,如果不够完美(为了避免拼接点print()插入空格),只需使用下面提供的'myprint()'函数。 另一个方便的工具将是“concatByComma()”函数返回一个适当的string。
只需运行下面的代码,玩得开心:)
def myprint(*arg): strToPrint = "" for item in arg: strToPrint += str(item) print(strToPrint) def concatByComma(*arg): strToPrint = "" for item in arg: strToPrint += str(item) return strToPrint I = "I"; i=5 print(I, " am " , i , " years old") print(('s','o', I),[' wrote','it:'],' ',{1:'hour'},'and',5," min.") myprint(('s','o', I),[' wrote','it:'],' ',{1:'hour'},'and',5," min.")
Python 2.x
-
'You have %d things.' % things
'You have %d things.' % things
[ 1 ] -
'You have {} things.'.format(things)
[ 2 ]
Python 3.6+
-
'You have %d things.' % things
'You have %d things.' % things
[ 1 ] -
'You have {} things.'.format(things)
[ 2 ] -
f'You have {things} things.'
[ 3 ]
参考
- printf-stylestring格式
- 内置types – > str.format
- 格式化的string文字
为什么不简单?
things = 5 print("You have " + str(things) + " things.")
这两个工作在Python 2&python 3上