Eu entendo que devemos usar %s
para concatenar uma string em vez de +
em Python.
Eu poderia fazer qualquer um dos seguintes:
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 outra coisa senão a +
? É mais rápido escrever concatenação com um simples +
. Então, se você observar a sequência de formatação, especifique os tipos, por exemplo, %s
e assim por diante %d
. Entendo que seria melhor ser explícito sobre o tipo.
Mas então li que o uso +
para concatenação deve ser evitado, mesmo que seja mais fácil digitar. Existe uma razão clara para que as seqüências de caracteres devam ser concatenadas de uma dessas outras maneiras?
%s
não é para concatenação, é uma especificação de conversão para formatação de string derivada de C'sprintf(3)
. Existem casos para usar esse ou um operador de concatenação; que você usa deve basear-se no julgamento da situação, não no dogma. O quão fácil é escrever o código é totalmente irrelevante, porque você fará isso apenas uma vez.print(f"{hello} {world}")
, tem legibilidade de concatenação, pois as variáveis são vistas onde ocorrem na cadeia e são mais rápidas questr.format
.Respostas:
Legibilidade. A sintaxe da string de formato é mais legível, pois separa o estilo dos dados. Além disso, no Python, a
%s
sintaxe coagirá automaticamente qualquerstr
tipo nãostr
; enquanto a concatenação funciona apenas comstr
, e você não pode concatenarstr
comint
.Atuação. No Python
str
é imutável, portanto, a string esquerda e direita devem ser copiadas para a nova string para cada par de concatenação. Se você concatenar quatro cadeias de comprimento 10, 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 corda aumentam. O Java otimiza esse caso algumas vezes, transformando a série de concatenação em usoStringBuilder
, mas o CPython não.Para alguns casos de uso, a biblioteca de log fornece uma API que usa a sequência de formato para criar a sequência de entrada de log lazily (
logging.info("blah: %s", 4)
). Isso é ótimo para melhorar o desempenho se a biblioteca de logs decidir que a entrada de log atual será descartada por um filtro de log, portanto, não é necessário formatar a string.fonte
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 destes é mais claro à primeira vista?
ou
fonte
n
décadas, minha mente funciona assim também ;-) Mas ainda mantenho minha resposta, a segunda é mais clara e fácil de ler, portanto, de manter. E isso se torna mais aparente quanto mais parâmetros você tiver. No final, se for um show de um homem, vá com o que você está familiarizado e confortável; se for um esforço de equipe, imponha análises de consistência e código; as pessoas podem se acostumar com qualquer um.f"your {object} is in the {location}"
."your '" + object + "' is in the '" + location + "'"
... Eu nem tenho certeza se eu tenho esse direito agora ...Um exemplo que esclarece o argumento de legibilidade:
(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 na outra)
Um problema separado é que o código% s também se converte na string, caso contrário, é necessário usar a chamada str () que também é menos legível do que o código% s.
fonte
O uso não
+
deve ser evitado em geral. Em muitos casos, é a abordagem correta. Usar ou são preferíveis apenas em casos específicos, e geralmente é bastante óbvio quando eles são a melhor solução.%s
.join()
No seu exemplo, você está concatenando três strings juntas, e o exemplo usando
+
é claramente o mais simples e legível, e, portanto, o recomendado.%s
ou.format()
são úteis se você deseja interpolar cadeias ou valores no meio de uma cadeia maior. Exemplo:Nesse caso
%s
, é mais legível, pois você evita dividir a primeira string em vários segmentos. Especialmente se você estiver interpolando vários valores..join()
é apropriado se você tiver uma sequência de tamanho variável de seqüências de caracteres e / ou quiser concatenar várias seqüências de caracteres com o mesmo separador.fonte
Como a ordem das palavras pode mudar em diferentes idiomas, o formulário
%s
é obrigatório se você deseja oferecer suporte adequado à tradução de strings no seu software.fonte