Oi Pedro,
Como eu sei qual \n é qual? Qual foi escrito pelo usuário e qual foi escrito pelo computador na hora do 'enter'?
A pergunta é a respeito de ambiguidade, certo?
A maneira de evitar ambiguidade está ligada a como representamos (no caso o Python representa) objetos diferentes, que são exibidos, as vezes, de maneira semelhante.
Antes de começar, para evitar ambiguidade...
Vou chamar tem newline
o caractere que tem o efeito de mudar de linha.
newline
é o caractere gravado quando teclamos ENTER
.
Vou chamar de barra_n
o string de comprimento 2 "\"+"n". barra_n
é o string gravado quando teclamos "\" e depois teclamos "n".
Assim, newline
é um caractere e barra_n
é formado por 2 caracteres.
Se me permite, vou reformular a sua pergunta da maneira que eu a entendi:
Como o Python faz a distinção entre o caractere newline
(teclei ENTER
) e e o string barra_n
?
A sua preocupação é legitima.
Vejamos o que o Python tem dizer a respeito.
% python
Python 3.6.1 (default, Sep 7 2017, 16:36:03)
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> newline = "\n"
>>> len(newline) # 1 caractere
1
>>> print("xx"+newline+"yy") # exibe xx, muda de linha, exibe yy
xx
yy
>>> barra = "\\"
>>> barra
'\\'
>>> n = "n"
>>> barra_n = barra + n
>>> barra_n
'\\n'
>>> print(barra_n)
\n
>>> newline
'\n'
>>> barra_n
'\\n'
>>> print(newline)
>>> print(barra_n)
\n
>>>
Conclusão 1. o caractere newline
é representado por apenas um símbolo que o Python exibe, as vezes, como "\n" e que é exibido por print()
pelo efeito de mudança de linha.
Conclusão 2. o string "barra_n" é representado internamente pelo string como "\\n" e exibido por print()
como "\n".
Hmm, devo dizer que acho se você ignorar tudo isso e escrever o seu programa de uma maneira ingênua, é bem capaz que tudo de certo como você gostaria.
Os projetistas de linguagens de programação levam muitas coisas em consideração nas suas decisões de projeto.
Decisões de projeto é algo que vocês deverão exercitar nas próximas semanas.
Bem... tem mais uns testes a seguir. Hmm... talvez vocês devessem para de ler aqui e continuar o que estavam fazendo.
# crio um arquivo arq.bla com 2 newlines, 3 linhas e um substring "\"+"n"
% echo -e "xx\nyyy\\\nzzz\nwww" > arq.bla
# exibo o conteúdo do arquivo (nada nesta mão, nada nesta mão e ...)
% more arq.bla
xx
yyy\nzzz
www
# note o substring "\" + "n" entre yyy e zzz, como seria digitado em um programa
% python # vamos ver o que o Python tem dizer a respeito
Python 3.6.1 (default, Sep 7 2017, 16:36:03)
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fin = open("arq.bla","r") # abre arquivo para leitura
>>> s = fin.read() # s é string com o conteúdo do arquivo (= seq. de caracteres)
>>> fin.close() # feche o arquivo (não esquecer ou usar with)
>>> s # note como o substring "\" + "n" é representado pelo Python em s
'xx\nyyy\\nzzz\nwww'
>>> len(s)
15
>>> for i in range(len(s)): # vamos ver o conteúdo de s, caractere a caractere
... print("s[%d] = '%c'"%(i,s[i]))
...
s[0] = 'x'
s[1] = 'x'
s[2] = '
'
s[3] = 'y'
s[4] = 'y'
s[5] = 'y'
s[6] = '\'
s[7] = 'n'
s[8] = 'z'
s[9] = 'z'
s[10] = 'z'
s[11] = '
'
s[12] = 'w'
s[13] = 'w'
s[14] = 'w'
>>> # s[2] e s[11] contém o caractere newline
Conclusão 3. Olhando apenas o valores exibidos de dois objetos é muitas vezes difícil saber se são iguais.
Olhem por exemplo o EP11.
Vendo apenas (1,2),
exibido por print()
, não sei dizer se o objeto é uma tupla de dois int
ou é um Ponto2D
.