2017-07-16 2 views
2

J'ai créé une constante qui contient un peu d'art ASCII d'un triangle, comme celui-ci:Pourquoi cet art ASCII n'est-il pas imprimé sur plusieurs lignes alors qu'il s'agit d'une chaîne multiligne?

ascii_triangle ='''  /\ 
    /\ 
    / \ 
/ \ 
/  \ 
/__________\ ''' 

J'utilise ensuite ce que l'argument d'une fonction, donc je peux utiliser l'image dans une fonction (avec quelques-uns autre art ASCII et autres arguments). La fonction est pas important, mais le problème est que lorsque je tente de l'imprimer en utilisant

print(ascii_triangle) 

dans la fonction, la sortie ressemble à ceci:

 /  /  /  /  /   /__________\ 

Comment puis-je faire ressembler un vrai triangle?

+1

Veuillez regarder comment fournir un [mcve]. –

+1

Vous devez a) utiliser des chaînes brutes ('r ''' ') ou b) échapper le \ avec un autre \ -> \\ –

Répondre

4

Le ascii-art vous mis en ligne a une barre oblique inverse juste avant chaque saut de ligne. Cette barre oblique inversée, si elle n'est pas suivie par autre chose qu'un saut de ligne, est traitée comme line continuation character.

Observe:

In [118]: x = 'foo \ 
    ...: bar \ 
    ...: baz' 

In [119]: x 
Out[119]: 'foo bar baz' 

Dans l'exemple ci-dessus, il n'y a rien après la barre oblique inverse, alors python croit qu'il est une seule chaîne sans retour à la ligne. Le même traitement est donné même si vous avez une citation multiligne pour une chaîne.

Vous aurez besoin de ajouter un espace après le backslash, et faire de votre chaîne un littéral brut.

In [123]: ascii_triangle =r'''  /\ 
    ...: /\ 
    ...: / \ 
    ...: / \ 
    ...: /  \ 
    ...: /__________\ ''' 

In [124]: print(ascii_triangle) 
     /\ 
    /\ 
    / \ 
/ \ 
/  \ 
/__________\ 

Essayez d'ajouter un espace après la barre oblique inverse dans le premier exemple, et vous obtiendrez

SyntaxError: EOL while scanning string literal 

python Indiquant nécessite un devis multiligne pour la chaîne.