82 votes

Concaténation de chaînes de caractères sans l'opérateur '+'.

Je jouais avec Python et j'ai réalisé que nous n'avions pas besoin d'utiliser l'opérateur '+' pour concaténer des chaînes statiques. Mais cela échoue si je l'assigne à une variable.

Par exemple :

string1 = 'Hello'   'World'  #1 works fine
string2 = 'Hello' + 'World'  #2 also works fine

string3 = 'Hello'
string4 = 'World'
string5 = string3   string4  #3 causes syntax error
string6 = string3 + string4  #4 works fine

Maintenant, j'ai deux questions :

  1. Pourquoi l'affirmation 3 ne fonctionne pas alors que l'affirmation 1 fonctionne ?
  2. Y a-t-il une différence technique, comme la vitesse de calcul, etc., entre les déclarations 1 et 2 ?

4 votes

C'est tout simplement similaire à C/C++ où "hello " "world" seront automatiquement concaténés ensemble

1 votes

Il y a un rapport de bogue sur ce comportement, mais il a été rejeté parce qu'il est de conception : legacy.python.org/dev/peps/pep-3126

2 votes

Pylint a un avertissement pour certains cas où cette fonctionnalité du langage est source d'erreurs maintenant : implicit-str-concat-in-sequence . Disponible depuis Pylint 2.2 : pylint.pycqa.org/fr/stable/whatsnew/2.2.html

72voto

Haidro Points 24336

De la docs :

Plusieurs chaînes de caractères adjacentes (délimitées par des espaces), utilisant éventuellement des conventions de citation différentes, sont autorisées, et leur signification est la même que leur concaténation. Ainsi, "hello" 'world' est équivalent à "helloworld".


L'affirmation 3 ne fonctionne pas parce que :

L'opérateur "+" doit être utilisé pour concaténer des expressions de type chaîne au moment de l'exécution.

Remarquez que le titre du sous-titre dans la documentation est également "string literal concatenation". Cela ne fonctionne que pour les chaînes de caractères, pas pour les autres objets.


Il n'y a probablement aucune différence. Si c'est le cas, elle est probablement extrêmement minime et personne ne devrait s'en inquiéter.


Comprenez également que cela peut présenter des dangers :

>>> def foo(bar, baz=None):
...     return bar
... 
>>> foo("bob"
... "bill")
'bobbill'

C'est un parfait exemple de l'endroit où Les erreurs ne doivent jamais passer en silence. Et si je voulais "bill" pour être l'argument baz ? J'ai oublié une virgule, mais aucune erreur n'est signalée. Au contraire, la concaténation a eu lieu.

8 votes

Donc "Les erreurs ne doivent jamais passer inaperçues" signifie dans ce cas que la grammaire doit être définie de telle sorte que si une virgule est supprimée de tout programme valide, le programme résultant est soit invalide, soit a la même signification que le programme original ? Je veux dire une virgule syntaxiquement significative, bien sûr, la règle ne devrait pas s'appliquer à la suppression d'une virgule à l'intérieur d'une chaîne littérale ;-)

1 votes

@SteveJessop Hmm, je suppose que cela ne convient pas à cet exemple, n'est-ce pas. Parce que techniquement, il n'y a pas d'erreur, non ?

1 votes

En tant que concepteur de langage, si vous pensez que "omettre une virgule" est une faute de frappe courante, il est raisonnable de décider que vous ne créerez pas de situations où l'omission d'une virgule transforme un programme valide en un autre programme valide avec une signification différente. Votre exemple de code est une erreur si le programmeur avait l'intention d'utiliser une virgule, mais pas s'il ne l'a pas fait, le problème étant que le langage est défini de telle sorte que l'interpréteur ne peut pas savoir lequel des deux. Il existe d'autres cas dans Python où cela se produit, par exemple (0) != (0,) et chacun a ses raisons que GvR considère comme plus importantes.

6voto

user2357112 Points 37737

Il s'agit d'une concaténation implicite de chaînes de caractères. Elle ne se produit qu'avec les littéraux de chaîne, et non avec les variables ou autres expressions qui évaluent des chaînes de caractères. Il y avait autrefois une (minuscule) différence de performance, mais de nos jours, l'optimiseur de peephole devrait rendre les formes essentiellement équivalentes.

4voto

Hyperboreus Points 15985

Pour répondre à votre deuxième question : Il n'y a pas de différence du tout (du moins avec l'implémentation que j'utilise). En désassemblant les deux instructions, elles sont rendues comme suit LOAD_CONST STORE_FAST . Ils sont équivalents.

4 votes

C'est le cas dans CPython, mais afaik pas dans toutes les implémentations.

1 votes

@flornquake Merci pour votre contribution. J'ai mis à jour et quelque peu restreint ma réponse.

4voto

Trying2Learn Points 11

Vous pouvez utiliser %s car cela est plus efficace que d'utiliser le signe +.

>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'

(OR)


une autre méthode est .format

>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>>

1voto

shray Points 11

L'énoncé 3 ne fonctionne pas car lorsque vous concaténer deux expressions de chaîne pour créer une nouvelle chaîne, vous avez besoin de l'opérateur '+'.

alors que dans le cas des sting 1, 2 et 4, les littéraux adjacents séparés par des espaces blancs utilisent des conventions de citation différentes, ce qui les autorise à s'imprimer de la même manière que leur concaténation.

De plus, il n'y aura pas de différence de temps significative ou perceptible dans l'exécution de ces deux opérations.

%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)

o/p Le parcours le plus lent a pris 17,08 fois plus de temps que le plus rapide. Cela pourrait signifier qu'un résultat intermédiaire est mis en cache. 57.8 µs ± 92.5 µs par boucle (moyenne ± écart-type de 7 exécutions, 1 boucle chacune)

%%timeit -n 1
s3='ab' 'ba'
print(s3)

o/p L'exécution la plus lente a pris 4,86 fois plus de temps que la plus rapide. Cela pourrait signifier qu'un résultat intermédiaire est mis en cache. 25.7 µs ± 21 µs par boucle (moyenne ± écart-type de 7 exécutions, 1 boucle chacune)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X