Je comprends que nous devrions utiliser %s
pour concaténer une chaîne plutôt qu'en +
Python.
Je pourrais faire n'importe lequel de:
hello = "hello"
world = "world"
print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])
Mais pourquoi devrais-je utiliser autre chose que le +
? Il est plus rapide d’écrire une concaténation simple +
. Ensuite, si vous regardez la chaîne de formatage, vous spécifiez les types, par exemple %s
, %d
et autres. Je comprends qu'il pourrait être préférable d’être explicite sur le type.
Mais ensuite, j'ai lu que l'utilisation +
de la concaténation devrait être évitée même s'il est plus facile de taper. Existe-t-il une raison claire pour que les chaînes soient concaténées de l'une de ces manières?
%s
est pas concaténation, il est une spécification de conversion pour la mise en forme de chaîne dérivée de C deprintf(3)
. Il existe des cas d'utilisation de cet opérateur ou d'un opérateur de concaténation; que vous utilisez doit être basé sur le jugement de la situation, pas de dogme. Comme il est facile d'écrire le code, cela n'a aucune importance, car vous ne le ferez qu'une fois.print(f"{hello} {world}")
, a la lisibilité de la concaténation puisque les variables sont vues là où elles apparaissent dans la chaîne, et est plus rapide questr.format
.Réponses:
Lisibilité. La syntaxe de chaîne de format est plus lisible, car elle sépare le style des données. De plus, en Python, la
%s
syntaxe contraindra automatiquement tous les non-str
types àstr
; tandis que la concaténation fonctionne uniquement avecstr
, et vous ne pouvez pas concaténerstr
avecint
.Performance. En Python
str
est immuable, les chaînes gauche et droite doivent donc être copiées dans la nouvelle chaîne pour chaque paire de concaténation. Si vous concaténez quatre chaînes de longueur 10, vous copiez (10 + 10) + ((10 + 10) + 10) + (((10 + 10) + 10) + 10) = 90 caractères, au lieu de 40 caractères. personnages. Et les choses empirent de façon quadratique à mesure que le nombre et la taille de la chaîne augmentent. Java optimise parfois ce cas en transformant la série de concaténation à utiliserStringBuilder
, contrairement à CPython.Dans certains cas d'utilisation, la bibliothèque de journalisation fournit une API qui utilise une chaîne de format pour créer la chaîne d'entrée de journal lazily (
logging.info("blah: %s", 4)
). Ceci est idéal pour améliorer les performances si la bibliothèque de journalisation décide que l'entrée de journal actuelle sera supprimée par un filtre de journalisation, de sorte qu'il n'est pas nécessaire de formater la chaîne.la source
Suis-je le seul qui lit de gauche à droite?
Pour moi, utiliser,
%s
c'est comme écouter des locuteurs allemands, où je dois attendre la fin d'une très longue phrase pour entendre le verbe.Laquelle de celles-ci est plus claire en un coup d'œil?
ou
la source
n
décennies, mon esprit fonctionne aussi de cette façon ;-) Mais je maintiens toujours ma réponse, la seconde est plus claire et plus facile à lire, donc à maintenir. Et cela devient plus évident avec le plus de paramètres que vous avez. En fin de compte, s'il s'agit d'un one man show, optez pour ce que vous connaissez et avec lequel vous êtes à l'aise; s'il s'agit d'un effort d'équipe, appliquez la cohérence et les révisions de code; les gens peuvent s'y habituer.f"your {object} is in the {location}"
."your '" + object + "' is in the '" + location + "'"
... Je ne suis même pas sûr d'avoir tout compris tout à l'heure ...Un exemple expliquant l'argument de lisibilité:
(Notez que le deuxième exemple est non seulement plus lisible mais aussi plus facile à modifier, vous pouvez changer le modèle sur une ligne et la liste des variables sur une autre)
Un problème distinct est que le code% s est également converti en chaîne, sinon vous devez utiliser l'appel str (), qui est également moins lisible qu'un code% s.
la source
L'utilisation ne
+
doit pas être évitée en général. Dans de nombreux cas, c'est la bonne approche. Utiliser%s
ou.join()
ne sont préférables que dans des cas particuliers, et il est généralement tout à fait évident que ce soit la meilleure solution.Dans votre exemple, vous concaténez trois chaînes, et l'exemple que vous utilisez
+
est clairement le plus simple et le plus lisible, et par conséquent le recommandé.%s
ou.format()
sont utiles si vous souhaitez interpoler des chaînes ou des valeurs au milieu d'une chaîne plus grande. Exemple:Dans ce cas, son utilisation
%s
est plus lisible car vous évitez de couper la première chaîne en plusieurs segments. Surtout si vous interpolez plusieurs valeurs..join()
est approprié si vous avez une séquence de chaînes de taille variable et / ou si vous souhaitez concaténer plusieurs chaînes avec le même séparateur.la source
Étant donné que l'ordre des mots peut changer dans différentes langues, il
%s
est impératif d'utiliser un formulaire si vous souhaitez prendre en charge correctement la traduction des chaînes dans votre logiciel.la source