Por que% s é melhor que + para concatenação?

82

Entendo que devemos usar %s para concatenar uma string em vez de + no Python.

Eu poderia fazer qualquer um:

hello = "hello"
world = "world"

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

Mas por que devo usar algo diferente de + ? É mais rápido escrever concatenação com um simples + . Então, se você observar a string de formatação, especifique os tipos, por exemplo %s e %d e tal. Eu entendo que poderia ser melhor ser explícito sobre o tipo.

Mas então eu li que usar + para concatenação deve ser evitado mesmo que seja mais fácil de digitar. Existe uma razão clara para que as strings sejam concatenadas de uma outra maneira?

    
por Niklas Rosencrantz 07.12.2015 / 11:33
fonte

5 respostas

76
  1. Legibilidade. A sintaxe da string de formato é mais legível, pois separa o estilo dos dados. Além disso, em Python, a sintaxe %s forçará automaticamente qualquer não str types para str ; enquanto a concatenação funciona apenas com str e não é possível concatenar str com int .

  2. Desempenho. Em Python, str é imutável, portanto, as strings esquerda e direita devem ser copiadas para a nova string para cada par de concatenações. Se você concatenar quatro strings de comprimento 10, você estará copiando (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 caracteres, em vez de apenas 40 personagens. E as coisas pioram quadraticamente à medida que o número e o tamanho da string aumentam. Java otimiza este caso algumas vezes, transformando a série de concatenação para usar StringBuilder , mas o CPython não.

  3. Para alguns casos de uso, a biblioteca de criação de log fornece uma API que usa string de formato para criar a string de entrada de log com lentidão ( logging.info("blah: %s", 4) ). Isso é ótimo para o desempenho aprimorado se a biblioteca de registro decidir que a entrada de log atual será descartada por um filtro de log, portanto, não é necessário formatá-la.

por 07.12.2015 / 12:11
fonte
45

Eu sou o único que lê da esquerda para a direita?

Para mim, usar %s é como ouvir falantes de alemão, onde tenho que esperar até o final de uma frase muito longa para ouvir o que é o verbo.

Qual desses é mais claro em uma rápida olhada?

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

ou

"your " + object + " is in the " + location  
    
por 09.12.2015 / 16:49
fonte
10

Um exemplo de argumento de legibilidade:

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)

(Observe que o segundo exemplo não é apenas mais legível, mas também mais fácil de editar; você pode alterar o modelo em uma linha e a lista de variáveis em outra)

Uma questão separada é que o código% s também converte para a string, caso contrário você terá que usar a chamada str (), que também é menos legível que um código% s.

    
por 08.12.2015 / 18:16
fonte
5

O uso de + não deve ser não evitado em geral. Em muitos casos, é a abordagem correta. O uso de %s ou .join() só é preferível em casos específicos, e geralmente é bastante óbvio quando eles são a melhor solução.

No seu exemplo, você está concatenando três strings juntas, e o exemplo usando + é claramente o mais simples e mais legível e, portanto, o recomendado.

%s ou .format() são úteis se você quiser interpolar strings ou valores no meio de uma string maior. Exemplo:

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

Nesse caso, usar %s é mais legível, já que você evita cortar a primeira string em vários segmentos. Especialmente se você estiver interpolando vários valores.

.join() é apropriado se você tiver uma sequência de strings de tamanho variável e / ou desejar concatenar várias strings com o mesmo separador.

    
por 09.12.2015 / 08:56
fonte
2

Como a ordem das palavras pode mudar em diferentes idiomas, o formulário com %s é imperativo se você quiser suportar adequadamente a tradução de strings em seu software.

    
por 15.12.2017 / 08:53
fonte