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