Python >> Tutoriel Python >  >> Python

Python une ligne à plusieurs lignes

Pour diviser une ligne en plusieurs lignes en Python, utilisez une parenthèse ouvrante dans la ligne que vous souhaitez diviser. Maintenant, Python attend la parenthèse fermante dans l'une des lignes suivantes et l'expression est évaluée à travers les limites de ligne. Comme alternative, vous pouvez également utiliser la barre oblique inverse \ juste devant le saut de ligne pour échapper au caractère de saut de ligne.

Après avoir publié un article sur la façon de condenser plusieurs lignes en une seule ligne de code Python, de nombreux Finxters ont demandé : Comment diviser une longue ligne en plusieurs lignes en Python ? Cet article vous montre la meilleure façon de diviser une longue ligne en plusieurs lignes pour améliorer la lisibilité et désencombrer votre code.

Problème :Étant donné une longue ligne de code Python. Comment le diviser en plusieurs lignes ?

Il existe plusieurs façons de diviser cela en plusieurs lignes. Commençons par un aperçu :

Exercice :Exécutez le code. Quelle est la sortie ? Modifiez la méthode 3 et réécrivez-la en une seule ligne !

Nous allons maintenant plonger dans chacune de ces méthodes.

Méthode 1 :Continuation de ligne implicite :utilisez des parenthèses pour éviter les barres obliques inverses de saut de ligne

Le PEP 8 - Style Guide soutient que la meilleure façon de diviser les longues lignes en plusieurs lignes de code est d'utiliser la continuation de ligne implicite en utilisant des parenthèses. Une parenthèse ouvrante signale à Python que l'expression n'est pas encore terminée. Ainsi, l'interpréteur Python continue de chercher dans la ligne suivante pour fermer l'expression actuellement ouverte. De cette façon, vous pouvez réécrire n'importe quelle ligne Python en une ligne multiligne en utilisant simplement une ou plusieurs paires de parenthèses.

Voici la déclaration originale du guide de style PEP 8 (c'est moi qui souligne) :

Avez-vous besoin d'un exemple de continuation de ligne implicite ? Le voici :

# Long Line
a = list(zip(['Alice', 'Bob', 'Liz', 'Ann'], [18, 24, 19, 16]))

# Implicit Line Continuation
b = list(zip(['Alice', 'Bob', 'Liz', 'Ann'],
             [18, 24, 19, 16]))

print(a)
# [('Alice', 18), ('Bob', 24), ('Liz', 19), ('Ann', 16)]

print(b)
# [('Alice', 18), ('Bob', 24), ('Liz', 19), ('Ann', 16)]

La longue ligne a = list(zip(['Alice', 'Bob', 'Liz', 'Ann'], [18, 24, 19, 16])) zippe deux listes pour obtenir le résultat [('Alice', 18), ('Bob', 24), ('Liz', 19), ('Ann', 16)] . Vous pouvez réécrire ceci sur plusieurs lignes en utilisant les parenthèses existantes. Notez qu'il est bon d'aligner hiérarchiquement les lignes en Python. Dans notre exemple, les deux listes sont alignées lors de la création de l'instruction multiligne pour affecter la variable b .

Rappelez-vous  :vous pouvez toujours couper les lignes si un crochet, une parenthèse ou un bracelet ouvert n'a pas été fermé !

Méthode 2 :continuation de ligne explicite :utilisez la barre oblique inverse de saut de ligne \

Cependant, que se passe-t-il si vous ne voulez pas introduire de nouvelles parenthèses dans votre expression ? Pouvez-vous toujours diviser une ligne en plusieurs lignes ?

La réponse est oui! Utilisez simplement la barre oblique inverse de saut de ligne \ que vous pouvez appeler continuation de ligne explicite . Avec la barre oblique inverse, vous pouvez casser à n'importe quelle position de votre expression. Techniquement, le caractère barre oblique inverse "échappe" au caractère de nouvelle ligne qui suit immédiatement après. En échappant le caractère de nouvelle ligne, il perd sa signification et Python l'ignore tout simplement. De cette façon, vous n'avez pas à introduire de nouvelles parenthèses.

Voici un exemple minimal qui montre la flexibilité avec laquelle vous pouvez casser de nouvelles lignes de cette façon :

a = 1 + 2 + 3 + 4 - 5 * 2

b = 1 \
    + 2 + \
    3 + 4\
    - 5 *\
    2

print(a)
# 0

print(b)
# 0

Voir le code désordonné dans l'exemple précédent peut vous amener à demander :

Est-ce qu'un saut de ligne doit être avant ou après un opérateur binaire ?

Je vais donner la réponse suivante basée sur le PEP 8 Style Guide (surlignés par moi) :

Pendant des décennies, le style recommandé était de casser après les opérateurs binaires . Mais cela peut nuire à la lisibilité de deux manières :

  • les opérateurs ont tendance à être dispersés sur différentes colonnes à l'écran, et
  • chaque opérateur est déplacé de son opérande vers la ligne précédente.

Ici, l'œil doit faire un travail supplémentaire pour savoir quels éléments sont ajoutés et lesquels sont soustraits :

# Wrong:
results = (variable1 +
          variable2 +
          (variable3 - variable4) -
          variable5 -
          variable6)

Pour résoudre ce problème de lisibilité, les mathématiciens et leurs éditeurs suivent la convention opposée .

Donald Knuth explique la règle traditionnelle dans sa série Computers and Typesetting :"Bien que les formules dans un paragraphe se cassent toujours après les opérations et les relations binaires, les formules affichées se cassent toujours avant les opérations binaires" [3].

Ainsi, le code suivant est proposé :

# Correct:
results = (variable1
           + variable2
           + (variable3 - variable4)
           - variable5
           - variable6)

Vous pouvez faire les deux en Python mais préférez la seconde pour améliorer la lisibilité de votre code !

Méthode 3 :rompre une chaîne en utilisant une chaîne multiligne avec des guillemets triples

Exemple :Supposons que vous ayez la longue chaîne suivante de Roméo et Juliette :

s = 'Mistress! what, mistress! Juliet! fast, I warrant her, she:\n Why, lamb! why, lady! fie, you slug-a-bed!\n Why, love, I say! madam! sweet-heart! why, bride!\n What, not a word? you take your pennyworths now;\n Sleep for a week; for the next night, I warrant'

Notez le caractère de saut de ligne dans la chaîne :c'est vraiment une chaîne multi-lignes ! Pouvez-vous réécrire ceci en plusieurs lignes pour améliorer la lisibilité ?

Vous pouvez restructurer les chaînes en utilisant les guillemets triples qui vous permettent de définir une chaîne multiligne sans le caractère de saut de ligne '\n' dans la chaîne. Cela améliore considérablement la lisibilité des chaînes multilignes ! Voici un exemple :

s1 = 'Mistress! what, mistress! Juliet! fast, I warrant her, she:\n Why, lamb! why, lady! fie, you slug-a-bed!\n Why, love, I say! madam! sweet-heart! why, bride!\n What, not a word? you take your pennyworths now;\n Sleep for a week; for the next night, I warrant'

# MULTI-LINE
s2 = '''Mistress! what, mistress! Juliet! fast, I warrant her, she:
 Why, lamb! why, lady! fie, you slug-a-bed!
 Why, love, I say! madam! sweet-heart! why, bride!
 What, not a word? you take your pennyworths now;
 Sleep for a week; for the next night, I warrant'''

print(s1 == s2)
# True

Ce sont deux manières de définir la même chaîne. Si vous les comparez, le résultat est True . Cependant, la deuxième façon est beaucoup plus lisible et devrait être préférée !