web-dev-qa-db-fra.com

Concaténation de chaînes sans opérateur '+'

Je jouais avec python et j'ai réalisé qu'il n'était pas nécessaire d'utiliser l'opérateur '+' pour concaténer des chaînes, à moins qu'il ne soit utilisé avec des valeurs.

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 la déclaration 3 ne fonctionne-t-elle pas comme la déclaration 1?
  2. Existe-t-il une différence technique telle que la vitesse de calcul, etc. entre les énoncés 1 et 2?
57
ibrahim

De la docs :

Plusieurs littéraux de chaîne adjacents (délimités par des espaces), utilisant éventuellement différentes conventions de citation, sont autorisés et leur signification est identique à leur concaténation. Ainsi, "bonjour" "monde" équivaut à "helloworld".


La déclaration 3 ne fonctionne pas parce que:

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

Notez que le titre du sous-en-tête dans la documentation est également "concaténation littérale de chaîne". Cela ne fonctionne que pour les littéraux de chaîne, pas pour les autres objets.


Il n'y a probablement pas de différence. Si c'est le cas, c'est probablement extrêmement petit et ne devrait préoccuper personne.


En outre, comprenez qu'il peut y avoir des dangers à ceci:

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

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

49
TerryA

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

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

(OU)


une autre méthode est .format

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

Pour répondre à votre deuxième question: il n’ya aucune différence (du moins avec l’implémentation que j’utilise). En désassemblant les deux instructions, elles sont rendues sous la forme LOAD_CONST STORE_FAST. Ils sont équivalents.

2
Hyperboreus

L'instruction 3 ne fonctionne pas comme lorsque vous concaténez deux expressions de chaîne pour créer une nouvelle chaîne, vous avez besoin d'un opérateur '+'.

alors que dans le cas des points 1,2 et 4, les littéraux adjacents séparés par des espaces blancs utilisent des conventions de citation différentes. Ils sont ensuite autorisés à les 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 2 opérations.

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

o/p La course la plus lente prenait 17,08 fois plus longtemps que la plus rapide. Cela pourrait signifier qu'un résultat intermédiaire est mis en cache. 57,8 µs ± 92,5 µs par boucle (moyenne ± dév. Normale de 7 cycles, 1 boucle chacun)

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

o/p La course la plus lente prenait 4.86 fois plus longtemps 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 passages, 1 boucle chacun)

1
shray

Il s'agit d'une concaténation littérale de chaîne implicite. Cela se produit uniquement avec des littéraux de chaîne, pas avec des variables ou d'autres expressions équivalentes à des chaînes. Il y avait une différence de performance (minuscule), mais de nos jours, l'optimiseur de judas doit rendre les formulaires essentiellement équivalents.

1
user2357112

Pourquoi l'énoncé 3 ne fonctionne-t-il pas alors que l'énoncé 1 le fait?

Parce que, dans la première déclaration, nous assignons une constante à une variable. L'affectation de variable est assez simple pour que nous puissions continuer à mettre plusieurs constantes dans une seule variable et que l'assignation sera toujours exécutée. Les termes "hello" et "world" sont deux constantes du même type. Donc, la déclaration a fonctionné.

Si nous faisons ce qui suit, nous aurons SyntaxError

string1 = "Hello" 1

La raison en est que nous avons fourni plusieurs constantes dans une seule affectation de variable. Ceci confuse python) et le renvoie comme une erreur.

La déclaration 3 concerne l’affectation d’une variable basée sur deux variables. Cela produira SyntaxError comme python ne sait pas ce qu’il peut faire avec 2 variables avant de l’affecter à la variable.

Y a-t-il une différence technique telle que la vitesse de calcul, etc. entre les énoncés 1 et 2?

Oui. La seule différence technique est la lisibilité plutôt que toute autre chose. La lisibilité est primordiale en Python. Pour un œil non exercé, "hello" "world" pourrait ressembler au compilateur qui ajouterait de l’espace aux chaînes. Ce qui n'est pas le cas.

Cependant,

"hello" + "world"

est explicite et normal. Presque toujours, Explicit vaut mieux qu'implicite.

0
thiruvenkadam