One place for hosting & domains

      Expressions

      Utiliser Grep et les expressions régulières pour rechercher des modèles de texte en Linux


      Introduction

      grep est l’une des commandes les plus pratiques dans un environnement de terminaux Linux. L’accronyme grep signifie « global regular expression print » (rechercher globalement les correspondances avec l’expression régulière). Cela signifie que vous pouvez utiliser grep pour voir si l’entrée qu’il reçoit correspond à un modèle spécifié. Apparemment trivial, ce programme est extrêmement puissant. Sa capacité à trier les entrées en fonction de règles complexes fait qu’il est couramment utilisé dans de nombreuses chaînes de commande.

      Au cours de ce tutoriel, vous allez explorer les options de la commande grep. Ensuite, vous allez approfondir vos connaissances dans l’utilisation des expressions régulières qui vous permettront d’effectuer des recherches plus avancées.

      Launch an Interactive Terminal!

      Utilisation de base

      Au cours de ce tutoriel, vous allez utiliser grep pour rechercher plusieurs mots et plusieurs phrases dans GNU General Public License version 3.

      Si vous utilisez un système Ubuntu, vous pouvez trouver le fichier dans le dossier /usr/share/common-licenses. Copiez-le dans votre répertoire home :

      • cp /usr/share/common-licenses/GPL-3 .

      Si vous êtes sur un autre système, utilisez la commande curl pour en télécharger une copie :

      • curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

      Vous allez également utiliser le fichier de licence BSD de ce tutoriel. Sous Linux, vous pouvez utiliser la commande suivante pour le copier dans votre répertoire home :

      • cp /usr/share/common-licenses/BSD .

      Si vous êtes sur un autre système, créez le fichier en utilisant la commande suivante :

      • cat << 'EOF' > BSD
      • Copyright (c) The Regents of the University of California.
      • All rights reserved.
      • Redistribution and use in source and binary forms, with or without
      • modification, are permitted provided that the following conditions
      • are met:
      • 1. Redistributions of source code must retain the above copyright
      • notice, this list of conditions and the following disclaimer.
      • 2. Redistributions in binary form must reproduce the above copyright
      • notice, this list of conditions and the following disclaimer in the
      • documentation and/or other materials provided with the distribution.
      • 3. Neither the name of the University nor the names of its contributors
      • may be used to endorse or promote products derived from this software
      • without specific prior written permission.
      • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      • SUCH DAMAGE.
      • EOF

      Maintenant que vous avez les fichiers, vous pouvez commencer à travailler avec grep.

      Dans sa forme la plus basique, vous pouvez utiliser grep pour trouver les correspondances avec des modèles littéraux dans un fichier texte. Cela signifie que si vous passez une commande grep pour rechercher un mot, le système imprimera chaque ligne du fichier qui contient le mot en question.

      Exécutez la commande suivante pour utiliser grep et trouver ainsi toutes les lignes qui contiennent le mot GNU :

      Le premier argument, GNU, est le modèle que vous recherchez alors que le second, GPL-3, est le fichier saisi dans lequel vous souhaitez faire votre recherche.

      La sortie affichera chacune des lignes qui contient le texte modèle :

      Output

      GNU GENERAL PUBLIC LICENSE The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to Developers that use the GNU GPL protect your rights with two steps: "This License" refers to version 3 of the GNU General Public License. 13. Use with the GNU Affero General Public License. under version 3 of the GNU Affero General Public License into a single ... ...

      Sur certains systèmes, le modèle que vous recherchez sera mis en surbrillance dans la sortie.

      Options courantes

      Par défaut, grep recherchera le modèle exact spécifié dans le fichier d'entrée et renverra les lignes qu'il trouvera. Vous pouvez rendre ce comportement plus pratique en ajoutant quelques balises facultatives à grep.

      Si vous souhaitez que grep ignore la « case » de votre paramètre de recherche et que vous recherchez des variations à la fois en majuscule et en minuscule, vous pouvez spécifier l'option -i ou --ignore-case.

      Recherchez chaque instance du mot license (en majuscule, minuscule ou les deux) dans le même fichier qu'auparavant avec la commande suivante :

      Les résultats incluent : LICENSE, license et License :

      Output

      GNU GENERAL PUBLIC LICENSE of this license document, but changing it is not allowed. The GNU General Public License is a free, copyleft license for The licenses for most software and other practical works are designed the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you (1) assert copyright on the software, and (2) offer you this License "This License" refers to version 3 of the GNU General Public License. "The Program" refers to any copyrightable work licensed under this ... ...

      S'il y avait une instance avec LiCeNsE, elle aurait également été renvoyée.

      Si vous souhaitez trouver toutes les lignes qui ne contiennent pas le modèle spécifié, vous pouvez utiliser l'option -v ou --invert-match.

      Recherchez chaque ligne qui ne contient pas le mot the dans la licence BSD en exécutant la commande suivante :

      Vous verrez la sortie suivante :

      Output

      All rights reserved. Redistribution and use in source and binary forms, with or without are met: may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

      Étant donné que vous n'avez pas précisé l'option « ignorer case », les deux derniers éléments ont été renvoyés comme ne comportant pas le mot the.

      Il vous sera souvent utile de connaître le numéro de la ligne sur laquelle les correspondances sont trouvées. Pour se faire, vous pouvez utiliser l'option -n ou --line-number. Ré-exécutez l'exemple précédent en ajoutant la balise précédente :

      Vous verrez le texte suivant :

      Output

      2:All rights reserved. 3: 4:Redistribution and use in source and binary forms, with or without 6:are met: 13: may be used to endorse or promote products derived from this software 14: without specific prior written permission. 15: 16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

      Vous pouvez maintenant référencer le numéro des lignes dans le cas où vous souhaiteriez modifier chacune des lignes qui ne contient pas the. Cela est particulièrement pratique lorsque vous travaillez avec un code source.

      Expressions régulières

      Au cours de l'introduction, vous avez appris que grep signifiait « rechercher globalement les correspondances avec l'expression rationnelle ». Une « expression régulière » est une chaîne de texte qui décrit un modèle de recherche spécifique.

      La manière dont les diverses applications et langages de programmation implémentent les expressions régulières est légèrement différente. Au cours de ce tutoriel, vous allez uniquement aborder un petit sous-ensemble de la façon dont grep décrit ses modèles.

      Correspondances littérales

      Dans les exemples précédents de ce tutoriel, lorsque vous avez recherché les mots GNU et the, en réalité, vous avez recherché les expressions régulières de base qui correspondaient à la chaîne exacte de caractères GNU et the. Les modèles qui spécifient exactement les caractères à mettre en correspondance se nomment « literals » car ils correspondent littéralement au modèle, character-for-character.

      Il est plus facile de les considérer comme une correspondance à une chaîne de caractères plutôt qu'à un mot. La distinction deviendra plus importante à mesure que les modèles que vous aborderez seront plus complexes.

      La correspondance se fera sur tous les caractères alphabétiques et numériques (ainsi que certains autres caractères) littéralement à moins qu'un autre mécanisme d'expression ne vienne la modifier.

      Correspondances avec les ancres

      Les ancres sont des caractères spéciaux qui spécifient à quel endroit de la ligne une correspondance est considérée comme valable.

      Par exemple, en utilisant des ancres, vous pouvez spécifier que vous souhaitez uniquement obtenir les lignes qui comportent GNU tout au début de la ligne. Pour cela, vous pouvez utiliser la balise ^ avant la chaîne littérale.

      Exécutez la commande suivante pour rechercher le fichier GPL-3 et trouver les lignes où GNU se trouve au tout début d'une ligne :

      Vous verrez apparaître les deux lignes suivantes :

      Output

      GNU General Public License for most of our software; it applies also to GNU General Public License, you may choose any version ever published

      De la même façon, vous devez utiliser l'ancre $ à la fin d'un modèle pour indiquer que la correspondance ne sera valable que si elle se trouve à la fin d'une ligne.

      Cette commande permettra de faire la correspondance avec chaque ligne se terminant par le mot and dans le fichier GPL-3 :

      Vous verrez la sortie suivante :

      Output

      that there is no warranty for this free software. For both users' and The precise terms and conditions for copying, distribution and License. Each licensee is addressed as "you". "Licensees" and receive it, in any medium, provided that you conspicuously and alternative is allowed only occasionally and noncommercially, and network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and provisionally, unless and until the copyright holder explicitly and receives a license from the original licensors, to run, modify and make, use, sell, offer for sale, import and otherwise run, modify and

      Correspondance avec tout caractère

      Dans les expressions régulières, le caractère du point (.) signifie que tout caractère individuel peut exister à l'endroit spécifié.

      Par exemple, pour trouver toute correspondance dans le fichier GPL-3 qui contient deux caractères et puis la chaine cept, vous devez utiliser le modèle suivant :

      Vous verrez la sortie suivante :

      Output

      use, which is precisely where it is most unacceptable. Therefore, we infringement under applicable copyright law, except executing it on a tells the user that there is no warranty for the work (except to the License by making exceptions from one or more of its conditions. form of a separately written license, or stated as exceptions; You may not propagate or modify a covered work except as expressly 9. Acceptance Not Required for Having Copies. ... ...

      Comme vous pouvez le voir, la sortie affiche des instances à la fois de accept et except ainsi que des variations des deux mots. Le modèle devrait également trouver les correspondances avec z2cept s'il y en avait.

      Expressions entre parenthèses

      En plaçant un groupe de caractères entre parenthèses ([ et ]), vous pouvez spécifier que le caractère qui se trouve à cette position peut être l'un des caractères du groupe entre parenthèses.

      Par exemple, pour trouver les lignes qui en contiennent too ou two, vous devez spécifier ces variations succinctement en utilisant le modèle suivant :

      La sortie montre que les deux variations existent dans le fichier :

      Output

      your programs, too. freedoms that you received. You must make sure that they, too, receive Developers that use the GNU GPL protect your rights with two steps: a computer network, with no transfer of a copy, is not conveying. System Libraries, or general-purpose tools or generally available free Corresponding Source from a network server at no charge. ... ...

      La notation des parenthèses vous offre quelques options intéressantes. Vous pouvez utiliser un modèle qui trouve toutes les correspondances sauf les caractères entre parenthèses en commençant la liste de caractères entre parenthèses par un ^

      Dans cet exemple, nous trouverons le modèle .ode mais ne fera pas correspondre le modèle code :

      Voici la sortie qui s'affichera :

      Output

      1. Source Code. model, to give anyone who possesses the object code either (1) a the only significant mode of use of the product. notice like this when it starts in an interactive mode:

      Notez que dans la seconde ligne renvoyée, il y a, en fait, le mot code. Il ne s'agit pas d'un échec de l'expression régulière ou de grep. Au contraire, cette ligne a été renvoyée car plus tôt dans la ligne, le système a trouvé le modèle mode qui se trouve dans le mot model. La ligne a été renvoyée car il y avait une instance qui correspond au modèle.

      Une autre des fonctionnalités utiles des parenthèses est que vous pouvez spécifier une gamme de caractères au lieu de saisir chaque caractère disponible individuellement.

      Ainsi, si vous le souhaitez, vous pouvez trouver toutes les lignes qui commencent par une lettre majuscule avec le modèle suivant :

      Voici la sortie que vous verrez :

      Output

      GNU General Public License for most of our software; it applies also to States should not allow patents to restrict development and use of License. Each licensee is addressed as "you". "Licensees" and Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an System Libraries, or general-purpose tools or generally available free Source. User Product is transferred to the recipient in perpetuity or for a ... ...

      À cause de certains des problèmes de tri hérités, il est souvent plus juste d'utiliser les catégories de caractères POSIX à la place des gammes de caractères que vous venez d'utiliser.

      Il existe plusieurs caractères qui sont en-dehors du champ de ce guide, mais voici un exemple qui accomplira la même procédure que celle de l'exemple précédent en utilisant la catégorie de caractères [:upper:] dans un sélectionneur de parenthèses :

      • grep "^[[:upper:]]" GPL-3

      La sortie sera la même qu'auparavant.

      Répéter le modèle Zero ou More Times

      Enfin, l'un des méta-caractères les plus couramment utilisés est l'astérisque ou *, qui signifie « répétez le caractère précédent ou l'expression zero ou more times ».

      Pour trouver chaque ligne dans le fichier GPL-3 qui contient des parenthèses d'ouverture et de fermeture, avec seulement des lettres et des espaces uniques entre les deux, utilisez l'expression suivante :

      • grep "([A-Za-z ]*)" GPL-3

      Vous verrez la sortie suivante :

      Output

      Copyright (C) 2007 Free Software Foundation, Inc. distribution (with or without modification), making available to the than the work as a whole, that (a) is included in the normal form of Component, and (b) serves only to enable use of the work with that (if any) on which the executable work runs, or a compiler used to (including a physical distribution medium), accompanied by the (including a physical distribution medium), accompanied by a place (gratis or for a charge), and offer equivalent access to the ... ...

      Jusqu'à présent, vous avez utilisé les points, les astérisques et d'autres caractères dans vos expressions. Cependant, vous aurez parfois besoin de rechercher ces caractères spécifiques.

      Éviter le méta-caractères

      Parfois, vous aurez besoin de trouver un point ou une parenthèse d'ouverture en tant que tel, tout particulièrement lorsque vous travaillerez avec un code source ou des fichiers de configuration. Étant donné que ces caractères ont une signification spéciale dans les expressions régulières, vous devez « échapper » ces caractères pour indiquer à grep que vous ne souhaitez pas utiliser leur signification spéciale dans ce cas.

      Vous pouvez éviter des caractères en utilisant un caractère de barre oblique inverse () devant le caractère qui devrait normalement avoir une signification spéciale.

      Par exemple, pour trouver toutes les lignes qui commencent par une lettre majuscule et se termine par un point, utilisez l'expression suivante qui évite le point final afin qu'elle représente un point littéral et non pas le sens habituel « any character » :

      Voici la sortie qui s'affichera :

      Output

      Source. License by making exceptions from one or more of its conditions. License would be to refrain entirely from conveying the Program. ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SUCH DAMAGES. Also add information on how to contact you by electronic and paper mail.

      Prenons maintenant en considération d'autres options d'expressions régulières.

      Expressions régulières étendues

      La commande grep prend en charge un langage d'expression plus vaste en utilisant la balise -E ou en appelant la commande egrep au lieu de grep.

      Ces options vous donne la possibilité d'utiliser des « expressions régulières étendues ». Les expressions régulières étendues incluent tous les méta-caractères de base ainsi que les méta-caractères supplémentaires qui permettent d'exprimer des caractères plus complexes.

      Regroupement

      L'une des capacités les plus utiles qu'offrent les expressions régulières étendues est la possibilité de regrouper des expressions ensemble et de les manipuler ou d'y faire référence en tant qu'une seule unité.

      Groupez les expressions ensemble à l'aide de parenthèses. Si vous souhaitez utiliser des parenthèses sans utiliser des expressions régulières étendues, vous pouvez les éviter avec la barre oblique inverse pour activer cette fonctionnalité.

      Les trois expressions suivantes se valent en termes de fonctionnalité :

      • grep "(grouping)" file.txt
      • grep -E "(grouping)" file.txt
      • egrep "(grouping)" file.txt

      Alternance

      Tout comme les expressions entre parenthèses peuvent spécifier différents choix possibles de correspondance avec des caractères uniques, l'alternance vous permet de spécifier des correspondances alternatives pour les chaînes de caractères ou ensembles d'expression.

      Pour indiquer une alternance, utilisez le caractère de barre droite |. Ils sont souvent utilisés dans des regroupements entre parenthèses pour spécifier qu'une sur deux ou plusieurs des possibilités devraient être considérées comme une correspondance.

      La commande suivante trouvera soit GPL ou General Public Licence dans le texte :

      • grep -E "(GPL|General Public License)" GPL-3

      Le résultat ressemblera à ce qui suit :

      Output

      The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you Developers that use the GNU GPL protect your rights with two steps: For the developers' and authors' protection, the GPL clearly explains authors' sake, the GPL requires that modified versions be marked as have designed this version of the GPL to prohibit the practice for those ... ...

      Avec l'alternance, vous pouvez faire votre sélection entre plus de deux options en ajoutant des choix supplémentaires dans le groupe de sélection séparé par des caractères supplémentaires de barre oblique (|).

      Quantificateurs

      Comme le méta-caractère * qui correspond au caractère précédent ou au caractère défini sur zero ou more times, d'autres méta-caractères disponibles dans des expressions régulières étendues permettent de spécifier le nombre d'événements.

      Pour trouver une correspondance de caractère zero ou one times, vous pouvez utiliser le ? . Cela rend le caractère ou les ensembles de caractères précédents optionnels, par essence.

      La commande suivante cherche les correspondances de copyright et right en plaçant copy dans un groupe optionnel :

      • grep -E "(copy)?right" GPL-3

      Vous verrez la sortie suivante :

      Output

      Copyright (C) 2007 Free Software Foundation, Inc. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License "Copyright" also means copyright-like laws that apply to other kinds of ...

      Le caractère + correspond à l'apparition une ou plusieurs fois d'une expression. Il est presque similaire au méta-caractère *, mais avec le caractère +, l'expression doit correspondre au moins une fois.

      L'expression suivante correspond à la chaîne free plus un ou plusieurs caractères qui ne sont pas des caractères d'espacement :

      • grep -E "free[^[:space:]]+" GPL-3

      Vous verrez la sortie suivante :

      Output

      The GNU General Public License is a free, copyleft license for to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to When we speak of free software, we are referring to freedom, not have the freedom to distribute copies of free software (and charge for you modify it: responsibilities to respect the freedom of others. freedomss that you received. You must make sure that they, too, receive protecting users' freedom to change the software. The systematic of the GPL, as needed to protect the freedom of users. patents cannot be used to render the program non-free.

      Spécifier la répétition de correspondance

      Pour spécifier le nombre de fois qu'une correspondance est répétée, utilisez les caractères d'accolade ({ et }). Ces caractères vous permettent de spécifier avec exactitude un numéro, une plage ou une limite supérieure ou inférieure pour le nombre de fois qu'une correspondance à une expression est trouvée.

      Utilisez l'expression suivante pour trouver toutes les lignes dans le fichier GPL-3 qui contiennent trois voyelles :

      • grep -E "[AEIOUaeiou]{3}" GPL-3

      Chaque ligne renvoyée contient un mot avec trois voyelles :

      Output

      changed, so that their problems will not be attributed erroneously to authors of previous versions. receive it, in any medium, provided that you conspicuously and give under the previous paragraph, plus a right to possession of the covered work so as to satisfy simultaneously your obligations under this

      Pour trouver la correspondance avec tous les mots qui ont entre 16 et 20 caractères, utilisez l'expression suivante :

      • grep -E "[[:alpha:]]{16,20}" GPL-3

      Vous verrez la sortie suivante :

      Output

      certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. c) Prohibiting misrepresentation of the origin of that material, or

      Seules les lignes contenant des mots de cette longueur s'afficheront.

      Conclusion

      grep est une fonctionnalité pratique pour trouver des modèles dans des fichiers ou la hiérarchie du système de fichiers. Il est donc conseiller de passer un peu de temps pour se familiariser avec ses options et sa syntaxe.

      Les expressions régulières sont encore plus versatiles et peuvent être utilisées avec plusieurs programmes populaires. Par exemple, de nombreux éditeurs de texte implémentent des expressions régulières pour rechercher et remplacer du texte.

      En outre, la plupart des langages de programmation modernes utilisent des expressions régulières pour exécuter des procédures sur des données spécifiques. Une fois que vous aurez compris les expressions régulières, vous pourrez transférer ces connaissances sur plusieurs tâches informatiques courantes, de la recherche avancée dans votre éditeur de texte à la validation des entrées de l'utilisateur.



      Source link

      How To Use Assignment Expressions in Python


      The author selected the COVID-19 Relief Fund to receive a donation as part of the Write for DOnations program.

      Introduction

      Python 3.8, released in October 2019, adds assignment expressions to Python via the := syntax. The assignment expression syntax is also sometimes called “the walrus operator” because := vaguely resembles a walrus with tusks.

      Assignment expressions allow variable assignments to occur inside of larger expressions. While assignment expressions are never strictly necessary to write correct Python code, they can help make existing Python code more concise. For example, assignment expressions using the := syntax allow variables to be assigned inside of if statements, which can often produce shorter and more compact sections of Python code by eliminating variable assignments in lines preceding or following the if statement.

      In this tutorial, you will use assignment expressions in several examples to produce concise sections of code.

      Prerequisites

      To get the most out of this tutorial, you will need:

      Using Assignment Expressions in if Statements

      Let’s start with an example of how you can use assignment expressions in an if statement.

      Consider the following code that checks the length of a list and prints a statement:

      some_list = [1, 2, 3]
      if (list_length := len(some_list)) > 2:
          print("List length of", list_length, "is too long")
      

      If you run the previous code, you will receive the following output:

      Output

      List length of 3 is too long

      You initialize a list named some_list that contains three elements. Then, the if statement uses the assignment expression ((list_length := len(some_list)) to bind the variable named list_length to the length of some_list. The if statement evaluates to True because list_length is greater than 2. You print a string using the list_length variable, which you bound initially with the assignment expression, indicating the the three-element list is too long.

      Note: Assignment expressions are a new feature introduced in Python 3.8. To run the examples in this tutorial, you will need to use Python 3.8 or higher.

      Had we not used assignment expression, our code might have been slightly longer. For example:

      some_list = [1, 2, 3]
      list_length = len(some_list)
      if list_length > 2:
          print("List length of", list_length, "is too long")
      

      This code sample is equivalent to the first example, but this code requires one extra standalone line to bind the value of list_length to len(some_list).

      Another equivalent code sample might just compute len(some_list) twice: once in the if statement and once in the print statement. This would avoid incurring the extra line required to bind a variable to the value of len(some_list):

      some_list = [1, 2, 3]
      if len(some_list) > 2:
          print("List length of", len(some_list), "is too long")
      

      Assignment expressions help avoid the extra line or the double calculation.

      Note: Assignment expressions are a helpful tool, but are not strictly necessary. Use your judgement and add assignment expressions to your code when it significantly improves the readability of a passage.

      In the next section, we’ll explore using assignment expressions inside of while loops.

      Using Assignment Expressions in while Loops

      Assignment expressions often work well in while loops because they allow us to fold more context into the loop condition.

      Consider the following example that embeds a user input function inside the while loop condition:

      while (directive := input("Enter text: ")) != "stop":
          print("Received directive", directive)
      

      If you run this code, Python will continually prompt you for text input from your keyboard until you type the word stop. One example session might look like:

      >>> while (directive := input("Enter text: ")) != "stop":
      ...     print("Received directive", directive)
      ...
      Enter text: hello
      Received directive hello
      Enter text: example
      Received directive example
      Enter text: stop
      >>>
      

      The assignment expression (directive := input("Enter text: ")) binds the value of directive to the value retrieved from the user via the input function. You bind the return value to the variable directive, which you print out in the body of the while loop. The while loop exits whenever the you type stop.

      Had you not used an assignment expression, you might have written an equivalent input loop like:

      directive = input("Enter text: ")
      while directive != "stop":
          print("Received directive", directive)
          directive = input("Enter text: ")
      

      This code is functionally identical to the one with assignment expressions, but requires four total lines (as opposed to two lines). It also duplicates the input("Enter text: ") call in two places. Certainly, there are many ways to write an equivalent while loop, but the assignment expression variant introduced earlier is compact and captures the program’s intention well.

      So far, you’ve used assignment expression in if statements and while loops. In the next section, you’ll use an assignment expression inside of a list comprehension.

      Using Assignment Expressions in List Comprehensions

      We can also use assignment expressions in list comprehensions. List comprehensions allow you to build lists succinctly by iterating over a sequence and potentially adding elements to the list that satisfy some condition. Like list comprehensions, we can use assignment expressions to improve readability and make our code more concise.

      Consider the following example that uses a list comprehension and an assignment expression to build a list of multiplied integers:

      def slow_calculation(x):
          print("Multiplying", x, "*", x)
          return x * x
      
      [result for i in range(3) if (result := slow_calculation(i)) > 0]
      

      If you run the previous code, you will receive the following:

      Output

      Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 2 * 2 [1, 4]

      You define a function named slow_calculation that multiplies the given number x with itself. A list comprehension then iterates through 0, 1, and 2 returned by range(3). An assignment expression binds the value result to the return of slow_calculation with i. You add the result to the newly built list as long as it is greater than 0. In this example, 0, 1, and 2 are all multiplied with themselves, but only the results 1 (1 * 1) and 4 (2 * 2) satisfy the greater than 0 condition and become part of the final list [1, 4].

      The slow_calculation function isn’t necessarily slow in absolute terms, but is meant to illustrate an important point about effeciency. Consider an alternate implementation of the previous example without assignment expressions:

      def slow_calculation(x):
          print("Multiplying", x, "*", x)
          return x * x
      
      [slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]
      

      Running this, you will receive the following output:

      Output

      Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 1 * 1 Multiplying 2 * 2 Multiplying 2 * 2 [1, 4]

      In this variant of the previous code, you use no assignment expressions. Instead, you call slow_calculation up to two times: once to ensure slow_calculation(i) is greater than 0, and potentially a second time to add the result of the calculation to the final list. 0 is only multiplied with itself once because 0 * 0 is not greater than 0. The other results, however, are doubly calculated because they satisfy the greater than 0 condition, and then have their results recalculated to become part of the final list [1, 4].

      You’ve now combined assignment expressions with list comprehensions to create blocks of code that are both efficient and concise.

      Conclusion

      In this tutorial, you used assignment expressions to make compact sections of Python code that assign values to variables inside of if statements, while loops, and list comprehensions.

      For more information on other assignment expressions, you can view PEP 572—the document that initially proposed adding assignment expressions to Python.

      You may also want to check out our other Python content on our topic page.



      Source link