La concaténation de chaîne sans opérateur"+"
Je jouais avec python et j'ai réalisé que nous n'avez pas besoin d'utiliser l'opérateur " + " pour concaténer des chaînes, sauf si elle est utilisée directement.
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:
- Pourquoi déclaration 3 ne fonctionne pas lors de la déclaration 1 n'?
- Est-il une différence technique telles que le calcul de la vitesse etc. entre la déclaration 1 et 2?
- c'est juste similaire à C/C++ où
"hello " "world"
automatiquement concaténées - Il y a un rapport de bug sur ce comportement, mais elle a été rejetée parce que c'est par le design: legacy.python.org/dev/peps/pep-3126
- Pylint a un avertissement pour certains cas où ce langage est sujette à erreur maintenant:
implicit-str-concat-in-sequence
. Disponible depuis Pylint 2.2: pylint.pycqa.org/en/stable/whatsnew/2.2.html
Vous devez vous connecter pour publier un commentaire.
De la docs:
Déclaration 3 ne fonctionne pas car:
Notez que le titre de la sous-en-tête dans les docs est "littéral de chaîne de concaténation" de trop. Cela ne fonctionne que pour les littéraux de chaîne, pas d'autres objets.
Il n'y a probablement pas de différence. Si il l'est, c'est probablement extrêmement minuscules et rien de ce que tout le monde devrait s'en inquiéter.
Aussi, de comprendre qu'il peut y avoir des dangers pour cela:
Ceci est un exemple parfait d'où Erreurs ne doivent jamais passer sous silence. Que faire si je voulais
"bill"
à l'argumentbaz
? J'ai forgotton une virgule, mais aucune erreur n'est générée. Au lieu de cela, la concaténation a eu lieu.(0) != (0,)
, et chacun a ses raisons que la GvR considérés comme plus importants.1 - 1
et1 , - 1
sont différents. Fondamentalement, sensible au contexte opérateurs de conduire à de tels exemples, et la juxtaposition, en effet, tourne limites de jeton dans le contexte sensible opérateurs. La concaténation de chaîne est particulièrement erreur facile à faire, car il est assez commun d'introduire des retours à la ligne (en séparé par des virgules des listes de chaînes de caractères. Si vous avez écritfoo(1, <newline> -1)
alors vous auriez en effet, le manque de capacité de la langue à dire quand vous partez au large de la virgule."a""b"
et"a"'b'
beau travail pour donner"ab"
. Il est intéressant GvR choisi de copier ce comportement de C etc. comme c'est un seul+
caractère pour le rendre explicite.Pour répondre à votre deuxième question: Il n'y a pas de différence (au moins avec l'application que j'utilise). Démonter les deux déclarations, ils sont rendus comme
LOAD_CONST STORE_FAST
. Ils sont équivalents.Vous pouvez utiliser
%s
que c'est plus efficace que d'utiliser le signe+.(OU)
une méthode plus est
.format
Cela est implicite littéral de chaîne de concaténation. Il se produit uniquement avec les littéraux de chaîne, pas de variables ou d'autres expressions qui correspondent à des chaînes de caractères. Il y a une (petite) différence de performances, mais ces jours-ci, le judas de l'optimiseur devrait rendre les formes essentiellement équivalent.
Déclaration 3 ne fonctionne pas lorsque vous concaténer deux chaînes de caractères des expressions pour créer une nouvelle chaîne vous avez besoin d'un opérateur"+".
tandis qu'en cas de piqûre 1,2 et 4, à côté des littéraux séparés par des espaces blancs utilisent différents citant des conventions.Par conséquent, ils sont autorisés à faire leur impression même que leur enchaînement.
aussi, il ne sera pas significatif ou notable différence de temps dans l'exécution de ces 2 opérations.
o/p
Le plus lent exécuter pris 17.08 fois plus long que le plus rapide. Cela pourrait signifier qu'un résultat intermédiaire est en train d'être mis en cache.
De 57,8 µs ± 92.5 µs par boucle (moyenne ± std. dev. de 7 pistes, 1 boucle de chaque)
o/p
Le plus lent exécuter pris de 4,86 fois plus long que le plus rapide. Cela pourrait signifier qu'un résultat intermédiaire est en train d'être mis en cache.
25.7 µs ± 21 µs par boucle (moyenne ± std. dev. de 7 pistes, 1 boucle de chaque)
Pourquoi déclaration 3 ne fonctionne pas lors de la déclaration 1 n'?
Parce que, dans le premier énoncé, nous l'affectation d'une constante à une variable. Affectation de Variable est assez simple telle que l'on peut mettre plusieurs constantes à une seule variable et la mission va encore passer à travers. Les termes
"hello"
et"world"
sont deux constantes de même type. Ainsi, la déclaration travaillé.Si nous faisons ce qui suit, nous allons obtenir
SyntaxError
La raison en est que nous avons fourni plusieurs constantes dans une seule affectation de variable. Cette confusion, python et de les jeter comme une erreur.
L'état 3 est tout au sujet de l'affectation d'une variable en fonction de deux variables. Ceci va produire
SyntaxError
que python ne sais pas ce qu'il peut faire avec 2 variables avant de l'affecter à la variable.Est-il une différence technique telles que le calcul de la vitesse etc. entre la déclaration 1 et 2?
Oui. La seule différence technique est la lisibilité plutôt qu'autre chose. La lisibilité est le plus important dans Python. Pour un œil non averti,
"hello" "world"
pourrait ressembler le compilateur pourrait ajouter de l'espace nécessaire pour les chaînes de caractères. Ce qui n'est pas le cas.Cependant,
est explicite et normal. Presque toujours, Explicite est mieux qu'implicites.