python-3.x interpolation - ¿Cómo usar la nueva línea '\ n' en f-string para formatear la salida en Python 3.6?




print function (5)

Me gustaría saber cómo dar formato a este caso de forma Pythonic con f-strings:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

El problema es que '\' no se puede usar dentro de una f-string. Rendimiento esperado:

Winners are:
Adam
Bob
Cyril

Answers

Las otras respuestas dan ideas sobre cómo colocar el carácter de nueva línea en un campo de cadena de caracteres. Sin embargo, yo diría que para el ejemplo que dio el OP (que puede o no ser indicativo del caso de uso real de OP), ninguna de estas ideas debería ser utilizada.

El punto entero de usar f-strings es aumentar la legibilidad del código. No hay nada que puedas hacer con las cadenas de caracteres que no puedas hacer con el format . Considere cuidadosamente si hay algo más legible acerca de esto (si pudiera hacerlo):

f"Winners are:\n{'\n'.join(names)}"

...o esto:

newline = '\n'
f"Winners are:\n{newline.join(names)}"

...o esto:

"Winners are:\n{chr(10).join(names)}"

contra esto:

"Winners are:\n{}".format('\n'.join(names))

La última forma es al menos tan legible, si no más.

En resumen: no use un martillo cuando necesite un destornillador solo porque tiene uno nuevo y brillante. El código se lee mucho más a menudo de lo que está escrito.

Para otros casos de uso, sí, es posible que la idea chr(10) o la idea de newline sean apropiadas. Pero no por el dado.


No necesita f-strings u otros formateadores para imprimir una lista de cadenas con un separador. Simplemente pase el argumento de la palabra clave sep para print() :

names = ['Adam', 'Bob', 'Cyril']
print("Winners are:", *names, sep="\n")

Salida:

Winners are:
Adam
Bob
Cyril

Dicho esto, usar str.format() aquí sería posiblemente más simple y más legible que cualquier solución de cadena de caracteres f:

print("Winners are:\n{}".format("\n".join(names))

Usted no puede Las barras invertidas no pueden aparecer dentro de las llaves {} ; al hacerlo, se obtiene un SyntaxError :

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

Esto se especifica en el PEP para f-strings:

Las barras diagonales inversas pueden no aparecer dentro de las partes de expresión de las cadenas f, [...]

Una opción es asignar '\n' a un nombre y luego .join sobre eso dentro de la cadena de caracteres; Es decir, sin usar un literal:

names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

Resultados en:

Winners are:
Adam
Bob
Cyril

Otra opción, según lo especificado por @wim, es usar chr(10) para obtener \n devuelto y luego unirse allí. f"Winners are:\n{chr(10).join(names)}"

Otro más, por supuesto, es '\n'.join antemano y luego agregue el nombre en consecuencia:

n = "\n".join(names)
text = f"Winners are:\n{n}"

lo que resulta en la misma salida.

Nota:

Esta es una de las pequeñas diferencias entre f -strings y str.format . En este último, siempre se puede usar la puntuación concedida para desempaquetar un dictado alocado correspondiente que contiene esas claves:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(Por favor no hagas esto)

En el primero, la puntuación no está permitida porque no puede tener identificadores que los utilicen.

Aparte: Definitivamente optaría por print o format , como las otras respuestas sugieren como alternativa. Las opciones que he dado solo se aplican si, por alguna razón, debes usar f-strings.

El hecho de que algo sea nuevo, no significa que deba intentarlo todo ;-)


Como no lo han dicho otros, no puede usar barras diagonales invertidas en f-strings, pero puede evitar esto usando os.linesep (aunque tenga en cuenta que esto no será \n en todas las plataformas, y no se recomienda a menos que lea / escriba archivos binarios; véanse los comentarios de Rick ):

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

O quizás de una manera menos legible, pero garantizada para ser \n , con chr() :

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril

Las otras respuestas ya lo explicaron bien, pero me gustaría ofrecer otro experimento que ilustra la naturaleza de los objetos de rango:

>>> r = range(5)
>>> for i in r:
        print(i, 2 in r, list(r))

0 True [0, 1, 2, 3, 4]
1 True [0, 1, 2, 3, 4]
2 True [0, 1, 2, 3, 4]
3 True [0, 1, 2, 3, 4]
4 True [0, 1, 2, 3, 4]

Como puede ver, un objeto de rango es un objeto que recuerda su rango y se puede usar muchas veces (incluso mientras se itera sobre él), no solo un generador de una sola vez.







python python-3.x newline python-3.6 f-string