Eu gostaria de saber como formatar este caso de uma forma pitônica com f-strings:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
O problema é que '\'
não pode ser usado dentro das {...}
partes da expressão de uma string f. Saída esperada:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmed
fonte
fonte
f"Winners are:\n{chr(10).join(names)}"
Respostas:
Você não pode. Barras invertidas não podem aparecer dentro das chaves
{}
; fazer isso resulta emSyntaxError
:Isso é especificado no PEP para f-strings:
Uma opção é atribuir
'\n'
a um nome e depois.join
dentro daf
-string; ou seja, sem usar um literal:Resulta em:
Outra opção, conforme especificado por @wim, é usar
chr(10)
para obter o\n
retorno e, em seguida, ingressar nele.f"Winners are:\n{chr(10).join(names)}"
Outra, é claro, é
'\n'.join
antes e depois adicionar o nome de acordo:que resulta na mesma saída.
Nota:
Esta é uma das pequenas diferenças entre
f
-strings estr.format
. No último, você sempre pode usar pontuação concedida que um ditado maluco correspondente é descompactado que contém essas chaves:(Por favor, não faça isso.)
No primeiro caso, a pontuação não é permitida porque você não pode ter identificadores que os utilizem.
À parte: eu definitivamente optaria por
print
ouformat
, como as outras respostas sugerem como alternativa. As opções que dei se aplicam apenas se você precisar, por algum motivo, usar strings f.Só porque algo é novo, não significa que você deva tentar fazer tudo com ele ;-)
fonte
Você não precisa de f-strings ou outros formatadores para imprimir uma lista de strings com um separador. Basta usar o
sep
argumento de palavra - chave paraprint()
:Resultado:
Dito isso, usar
str.join()
/str.format()
here seria, sem dúvida, mais simples e mais legível do que qualquer solução alternativa de string f:fonte
print(*dir(some_object), sep='\n')
ouprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. BTW,print()
pode ser usado para gravar em qualquer arquivo (especificado com ofile
argumento,sys.stdout
por padrão).Você não pode usar barras invertidas em strings f como outros disseram, mas você pode contornar isso usando
os.linesep
(embora observe que isso não será\n
em todas as plataformas e não é recomendado a menos que leia / grave arquivos binários; veja os comentários de Rick ):Ou talvez de uma forma menos legível, mas garantidamente
\n
, comchr()
:fonte
os.linesep
é uma boa ideia ao escrever um texto.os.linesep
serve apenas para leitura ou leitura e escrita em modo binário . Sei que funcionará da mesma forma neste caso, mas é um mau hábito começar. Mas, novamente: eu não fui o downvote. A advertência é boa o suficiente para mim. :)As outras respostas fornecem ideias sobre como colocar o caractere de nova linha em um campo de string f. No entanto, eu argumentaria que, para o exemplo dado pelo OP (que pode ou não ser indicativo do caso de uso real do OP), nenhuma dessas idéias deve ser realmente usada.
O objetivo de usar strings f é aumentar a legibilidade do código. Não há nada que você possa fazer com as cordas F que você não possa fazer
format
. Considere cuidadosamente se há algo mais legível sobre isso (se você pudesse fazer isso):...ou isto:
...ou isto:
vs. isto:
A última forma é pelo menos tão legível, se não mais.
Resumindo: não use um martelo quando precisar de uma chave de fenda só porque você tem uma nova brilhante. O código é lido com muito mais frequência do que escrito.
Para outros casos de uso, sim, é possível que a
chr(10)
ideia ounewline
ideia seja apropriada. Mas não para aquele dado.fonte