我如何连接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

  1. 或者: print("You have " + str(things) + " things.") (老派的方式)

  2. 或者: print("You have {} things.".format(things)) (新pythonic和推荐的方式)


多一点口头解释:
虽然上面的这个出色的@Zero Piraeus答案中没有任何内容,但我会尽量“缩小”一点
你不能在python中连接一个string和一个数字(任何种类),因为这些对象有不同的加号(+)运算符的定义,这些运算符不相互兼容(在str中,case +用于连接,在数字情况下它被用来一起添加两个数字)。 所以为了解决这个对象之间的“误会”

  1. 老派的方法是将数字转换为str(anything)方法的string,然后将结果与另一个string连接起来。
  2. 更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

  1. 'You have %d things.' % things 'You have %d things.' % things [ 1 ]
  2. 'You have {} things.'.format(things) [ 2 ]

Python 3.6+

  1. 'You have %d things.' % things 'You have %d things.' % things [ 1 ]
  2. 'You have {} things.'.format(things) [ 2 ]
  3. f'You have {things} things.' [ 3 ]

参考

  1. printf-stylestring格式
  2. 内置types – > str.format
  3. 格式化的string文字

为什么不简单?

 things = 5 print("You have " + str(things) + " things.") 

这两个工作在Python 2&python 3上