Perché% s è meglio di + per la concatenazione?

82

Capisco che dovremmo usare %s per concatenare una stringa anziché + in Python.

Potrei fare qualsiasi di:

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])

Ma perché dovrei usare qualcosa di diverso da + ? È più veloce scrivere la concatenazione con un semplice + . Quindi se si guarda la stringa di formattazione, si specificano i tipi ad es. %s e %d e così via. Capisco che potrebbe essere meglio essere espliciti riguardo al tipo.

Ma poi ho letto che usare + per la concatenazione dovrebbe essere evitato anche se è più facile da digitare. C'è una chiara ragione per cui le stringhe dovrebbero essere concatenate in uno di questi altri modi?

    
posta Niklas Rosencrantz 07.12.2015 - 11:33
fonte

5 risposte

76
  1. La leggibilità. La sintassi della stringa di formato è più leggibile, poiché separa lo stile dai dati. Inoltre, in Python, la sintassi %s costringerà automaticamente tutti i tipi non str a str ; mentre la concatenazione funziona solo con str , e non puoi concatenare str con int .

  2. Prestazioni. In Python str è immutabile, quindi le stringhe sinistra e destra devono essere copiate nella nuova stringa per ogni coppia di concatenazione. Se concatenate quattro stringhe di lunghezza 10, copierete (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 caratteri, anziché solo 40 personaggi. E le cose peggiorano quadraticamente man mano che aumenta il numero e la dimensione della stringa. Java ottimizza questo caso alcune volte trasformando la serie di concatenazioni per utilizzare StringBuilder , ma CPython non lo fa.

  3. Per alcuni casi d'uso, la libreria di registrazione fornisce un'API che utilizza la stringa di formato per creare pigramente la stringa di registrazione ( logging.info("blah: %s", 4) ). Questo è ottimo per migliorare le prestazioni se la libreria di logging ha deciso che la voce di registro corrente verrà scartata da un filtro di log, quindi non è necessario formattare la stringa.

risposta data 07.12.2015 - 12:11
fonte
45

Sono l'unico a leggere da sinistra a destra?

Per me, usare %s è come ascoltare i relatori tedeschi, dove devo aspettare fino alla fine di una frase molto lunga per sentire quale sia il verbo.

Quale di questi è più chiaro a colpo d'occhio?

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

o

"your " + object + " is in the " + location  
    
risposta data 09.12.2015 - 16:49
fonte
10

Un esempio di chiarimento dell'argomento di leggibilità:

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)

(Nota che il secondo esempio non è solo più leggibile ma anche più facile da modificare, puoi cambiare il modello su una riga e l'elenco delle variabili su un'altra)

Un problema distinto è che anche il codice% s viene convertito nella stringa, altrimenti devi usare la chiamata str () che è anche meno leggibile di un codice% s.

    
risposta data 08.12.2015 - 18:16
fonte
5

L'utilizzo di + dovrebbe non essere evitato in generale. In molti casi è l'approccio corretto. L'utilizzo di %s o .join() è preferibile solo in casi particolari e di solito è abbastanza ovvio quando sono la soluzione migliore.

Nel tuo esempio stai concatenando tre stringhe insieme, e l'esempio usando + è chiaramente il più semplice e più leggibile, e quindi raccomandato.

%s o .format() sono utili se vuoi interpolare stringhe o valori nel medio di una stringa più grande. Esempio:

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

In questo caso, usando %s è più leggibile poiché eviti di tagliare la prima stringa in più segmenti. Soprattutto se stai interpolando più valori.

.join() è appropriato se hai una sequenza di stringhe di dimensioni variabili e / o vuoi concatenare più stringhe con lo stesso separatore.

    
risposta data 09.12.2015 - 08:56
fonte
2

Poiché l'ordine delle parole può cambiare in diverse lingue, il modulo con %s è indispensabile se vuoi supportare correttamente la traduzione di stringhe nel tuo software.

    
risposta data 15.12.2017 - 08:53
fonte

Leggi altre domande sui tag