web-dev-qa-db-fra.com

Pourquoi% s est-il meilleur que + pour la concaténation?

Je comprends que nous devrions utiliser %s pour concaténer une chaîne plutôt que + en Python.

Je pourrais faire:

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 la concaténation avec un simple +. Ensuite, si vous regardez la chaîne de formatage, vous spécifiez les types, par exemple %s et %d et autres choses de ce genre. Je comprends qu'il pourrait être préférable d'être explicite sur le type.

Mais ensuite j'ai lu qu'en utilisant + pour la concaténation doit être évité même s'il est plus facile à taper. Y a-t-il une raison claire pour laquelle les chaînes doivent être concaténées de l'une de ces autres manières?

91
Niklas
  1. Lisibilité. La syntaxe de la chaîne de format est plus lisible, car elle sépare le style des données. De plus, en Python, la syntaxe %s Contraindra automatiquement tous les types non str en str; tandis que la concaténation ne fonctionne qu'avec str, et vous ne pouvez pas concaténer str avec int.

  2. Performance. Dans Python str est immuable, les chaînes gauche et droite doivent ê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 copiera (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 caractères, au lieu de seulement 40 caractères. Et les choses empirent comme le nombre et la taille de la chaîne augmente. Java optimise ce cas parfois en transformant la série de concaténation pour utiliser StringBuilder, mais CPython ne le fait pas.

  3. Pour certains cas d'utilisation, la bibliothèque de journalisation fournit une API qui utilise la chaîne de format pour créer la chaîne d'entrée de journal paresseusement (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 journal, elle n'a donc pas besoin de formater la chaîne.

93
Lie Ryan

Suis-je le seul à lire de gauche à droite?

Pour moi, en utilisant %s, c'est comme écouter des germanophones, où je dois attendre la fin d'une très longue phrase pour entendre le verbe.

Lequel de ces éléments est plus clair en un coup d'œil?

"your %s is in the %s" % (object, location)

ou

"your " + object + " is in the " + location  

Un exemple clarifiant l'argument de lisibilité:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(Notez que le deuxième exemple est non seulement plus lisible mais aussi plus facile à modifier, vous pouvez modifier le modèle sur une ligne et la liste des variables sur une autre)

Un autre problème 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.

13
Rainy

L'utilisation de + Devrait pas être évitée en général. Dans de nombreux cas, c'est la bonne approche. L'utilisation de %s Ou .join() n'est préférable que dans des cas particuliers, et c'est généralement assez évident quand c'est la meilleure solution.

Dans votre exemple, vous concaténez trois chaînes ensemble, et l'exemple utilisant + Est clairement le plus simple et le plus lisible, et donc 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:

print "Hello %s, welcome to the computer!" % name

Dans ce cas, en utilisant %s, Il est plus lisible car vous évitez de couper la première chaîne en plusieurs segments. Surtout si vous interpolez plusieurs valeurs.

.join() convient 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.

7
JacquesB

Étant donné que l'ordre des mots peut changer dans différentes langues, le formulaire avec %s est impératif si vous souhaitez prendre correctement en charge la traduction des chaînes dans votre logiciel.

2
martjno