Comment concaténer des objets str et int?

si j'essaie de faire ce qui suit:

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

j'obtiens l'erreur suivante en Python 3.x:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

... et une erreur similaire en Python 2.x:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

Comment puis-je contourner ce problème?

43
demandé sur Zero Piraeus 2014-09-05 02:28:29

3 réponses

le problème ici est que l'opérateur + a (au moins) deux significations différentes en Python: pour les types numériques, il signifie "ajouter les nombres ensemble":

>>> 1 + 2
3
>>> 3.4 + 5.6
9.0

... et pour les types de séquences, cela signifie "concaténer les séquences":

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'abc' + 'def'
'abcdef'

en règle générale, Python ne convertit pas implicitement des objets d'un type à un autre 1 afin de rendre les opérations "sensées", parce que ce serait confusion: par exemple, vous pourriez penser que '3' + 5 devrait signifier '35' , mais quelqu'un d'autre pourrait penser qu'il devrait signifier 8 ou même '8' .

de même, Python ne vous laissera pas concaténer deux types différents de séquence:

>>> [7, 8, 9] + 'ghi'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list

pour cette raison, vous devez faire la conversion explicitement, si ce que vous voulez est la concaténation ou l'addition:

>>> 'Total: ' + str(123)
'Total: 123'
>>> int('456') + 789
1245

cependant, il y a une meilleure façon . Selon la version de Python que vous utilisez, il existe trois types de formatage de chaîne de caractères disponibles 2 , qui non seulement vous permettent d'éviter les opérations multiples + :

>>> 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.'

... mais aussi vous permettent de contrôler la façon dont les valeurs sont affichées:

>>> 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).'

si vous utilisez % interpolation , str.format() , ou F-strings dépend de vous: % interpolation a été autour de la plus longue (et est familier aux gens avec un fond en C), str.format() est souvent plus puissant, et les F-strings sont plus puissant (mais disponible seulement en Python 3.6 et plus tard).

une autre alternative est d'utiliser le fait que si vous donnez print plusieurs arguments de position, il joindra leurs représentations de chaîne de caractères ensemble en utilisant le sep argument de mot clé (qui par défaut à ' ' ):

>>> things = 5
>>> print('you have', things, 'things.')
you have 5 things.
>>> print('you have', things, 'things.', sep=' ... ')
you have ... 5 ... things.

... mais ce n'est généralement pas aussi flexible que d'utiliser les capacités de formatage de chaîne de Python.


1 bien qu'il fasse une exception pour les types numériques, où la plupart des gens seraient d'accord sur la "bonne" chose à faire:

>>> 1 + 2.3
3.3
>>> 4.5 + (5.6+7j)
(10.1+7j)

2 en fait quatre ... mais template strings sont rarement utilisés et quelque peu maladroit.

68
répondu Zero Piraeus 2016-12-27 17:10:38

TL; DR

  1. soit: print("You have " + str(things) + " things.") (le vieux façon l'école)

  2. ou: print("You have {} things.".format(things)) (la nouvelle pythonic et de la manière recommandée)


un peu plus d'explication verbale:

Bien qu'il y ait quelque chose qui n'est pas couvert par excellent @Zero Piraeus réponse ci-dessus, je vais essayer de "minify" il un peu :

Vous ne pouvez pas concaténer une chaîne et un nombre (de n'importe quelle sorte) en python parce que ces objets ont des définitions différentes de l'opérateur plus(+) qui ne sont pas compatibles entre eux (dans le cas de str + est utilisé pour la concaténation, dans le cas de nombre il est utilisé pour ajouter deux nombres ensemble). Afin de résoudre ce "malentendu" entre les objets:

  1. old school est de jeter le numéro de chaîne avec le str(anything) et concaténer ensuite le résultat avec un autre chaîne.
  2. la façon la plus pythonique et recommandée est d'utiliser la méthode format qui est très polyvalent (vous n'avez pas à prendre ma parole sur elle, Lire la documentation et ce article)

amusez-vous et faire lisez la réponse de @Zero Piraeus cela en vaut sûrement la peine!

4
répondu John Moutafis 2017-04-01 16:42:22

Python 2.x

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

Python 3.6+

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

référence

  1. printf style de mise en forme de Chaîne
  2. types Intégrés -> str.format
  3. Formaté littéraux de chaîne
-2
répondu ngub05 2017-04-02 20:27:51