Почему \ n работает только в строке f при печати? - PullRequest
4 голосов
/ 26 апреля 2019

Я работаю над школьным заданием для python / pandas и хотел опробовать f строк, что казалось очень удобным способом форматирования.

После прочтения документации я понял, что не могу использовать \ n для форматирования вывода. Для этого кода:

    f"Shape of dataset:\n {df.shape} (rows, columns)\n"

Я получаю этот вывод:

Out[38]: 'Shape of dataset:\n (270792, 11) (rows, columns)\n'

Это именно то, что я ожидал после прочтения документации.

Но тогда, когда я окружаю его print(), как таковой:

print(f"Shape of dataset:\n {df.shape} (rows, columns)\n")

Я выгляжу так, как я хотел:

Shape of dataset:
 (270792, 11) (rows, columns)

Я знаю, что мог бы просто использовать обычное форматирование, но мне любопытно, почему это так. Это то, что компонент строки f игнорируется из-за print?

Ответы [ 2 ]

8 голосов
/ 26 апреля 2019

Это не только для f-строк. Вот результат в ответе QPython на моем телефоне:

>> "\nhello\n" 
'\nhello\n'

Если вы введете строку в REPL, escape-символы (например, \ n) останутся как есть. Они только «выражены», когда явно print исключен. Даже если P в REPL означает «печать», REPL, очевидно, использует другой механизм для печати или вручную экранирует символы перед печатью, чтобы сохранить их.

Это может быть полезно при проверке строк, так как слегка «невидимые» символы, такие как переводы строк и табуляции, могут быть трудно обнаружить при выводе на печать.

3 голосов
/ 26 апреля 2019

Ниже приведены несколько примеров, иллюстрирующих тот момент, когда при вводе строки в Repl Python / IPython отображается форма repr строки.Неважно, какой форматировщик строк вы используете (f-строки или .format()).Тем не менее, когда вы print это, он форматируется и экранирует символы, такие как переводы строк, табуляции и т. Д.

In [18]: f"a\nb\n"
Out[18]: 'a\nb\n'

In [19]: print(f"a\nb\n")
a
b


In [20]: f"a\tb\tc"
Out[20]: 'a\tb\tc'

In [21]: print(f"a\tb\tc")
a       b       c

In [22]: a = 1

In [23]: b=2

In [24]: "a={}\nb={}".format(a,b)
Out[24]: 'a=1\nb=2'

In [25]: print("a={}\nb={}".format(a,b))
a=1
b=2

In [26]: "a={}\tb={}".format(a,b)
Out[26]: 'a=1\tb=2'

In [27]: print("a={}\tb={}".format(a,b))
a=1     b=2

Python предоставляет функцию repr () , которая показывает печатное представлениеобъект.Все операторы без print выше используют это внутри консоли Python / IPython.Существует также функция str () , которая форматирует объект.Внутренне, когда вы печатаете строку, сначала применяется str (), которая форматирует строку.

In [29]: print(repr(f"a\tb\tc"))
'a\tb\tc'

In [30]: print(str(f"a\tb\tc"))
a       b       c
...