L'art d'écrire des boucles en Python





La boucle for



est l'outil de flux de contrôle le plus basique dans la plupart des langages de programmation. Par exemple, une simple boucle for



C ressemble à ceci :



int i;
for (i=0;i<N;i++)
{
  //do something
}
      
      





Il n'y a pas de meilleure façon d'écrire for



une boucle C. Dans les cas complexes, vous devez généralement écrire des boucles imbriquées laides ou définir de nombreuses variables auxiliaires (comme i



dans le code ci-dessus).



Heureusement, les choses sont plus pratiques en Python. Il existe de nombreuses astuces dans ce langage pour écrire des boucles plus gracieuses qui nous facilitent la vie. En Python, il est tout à fait possible d'éviter les boucles imbriquées et les variables auxiliaires, et nous pouvons même personnaliser la boucle nous-mêmes for



.



Cet article vous guidera à travers les astuces de bouclage Python les plus utiles. J'espère que cela vous aidera à découvrir la beauté de cette langue.



Obtenez des valeurs et des indices en même temps



Un exemple courant d'utilisation d'une boucle for



consiste à obtenir des indices et des valeurs à partir d'une liste. Quand j'ai commencé à apprendre Python, j'ai écrit mon code de cette façon :



for i in range(len(my_list)):
    print(i, my_list[i])
      
      





Cela a fonctionné, bien sûr. Mais ce n'est pas une solution de style Python. Quelques mois plus tard, j'ai appris l'implémentation standard de style Python :



for i, v in enumerate(my_list):
    print(i, v)
      
      





Comme nous pouvons le voir, la fonction intégrée enumerate



nous facilite la vie.



Comment éviter les boucles imbriquées avec la fonction Product



Les boucles imbriquées sont un vrai casse-tête. Ils peuvent réduire la lisibilité de votre code et le rendre plus difficile à comprendre. Par exemple, l' interruption des boucles imbriquées n'est généralement pas facile à mettre en œuvre. Nous devons savoir où la boucle la plus interne a été interrompue, la deuxième boucle interne la plus haute, et ainsi de suite.



Heureusement, Python a une fonction product



intégrée impressionnante itertools



. Nous pouvons l'utiliser pour éviter d'écrire de nombreuses boucles imbriquées.



Voyons à quel point c'est utile avec un exemple simple :



list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a in list_a:
    for b in list_b:
        for c in list_c:
            if a + b + c == 2077:
                print(a, b, c)
# 70 2000 7
      
      





Comme on peut le voir, il faut trois boucles imbriquées pour obtenir trois nombres de trois listes dont la somme est 2077. Le code n'est pas très joli.



Essayons maintenant d'utiliser une fonction product



.



from itertools import product

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a, b, c in product(list_a, list_b, list_c):
    if a + b + c == 2077:
        print(a, b, c)
# 70 2000 7
      
      





Comme on peut le voir, grâce à l'utilisation de la fonction product



, un seul cycle suffit.



Étant donné que la fonction product



génère un produit direct des données itérables d'entrée, elle nous permet d'éviter les boucles imbriquées dans de nombreux cas.



Utiliser le module Itertools pour écrire de belles boucles



En fait, une fonction product



n'est que la pointe de l'iceberg. Si vous apprenez le module Python intégré itertools



, un tout nouveau monde s'ouvre devant vous. Cette boîte à outils contient de nombreuses méthodes utiles pour couvrir nos besoins de bouclage. Une liste complète d'entre eux peut être trouvée dans la documentation officielle . Voyons quelques exemples.



Comment créer une boucle sans fin



Il existe au moins trois façons de créer une boucle infinie :



1. À l'aide d'une fonction count



:



natural_num = itertools.count(1)
for n in natural_num:
    print(n)
# 1,2,3,...
      
      





2. Fonction cycle



:



many_yang = itertools.cycle('Yang')
for y in many_yang:
    print(y)
# 'Y','a','n','g','Y','a','n','g',...
      
      





3. Par la fonction repeat



:



many_yang = itertools.repeat('Yang')
for y in many_yang:
    print(y)
# 'Yang','Yang',...
      
      





Combiner plusieurs itérateurs en un seul



La fonction chain()



vous permet de combiner plusieurs itérateurs en un seul.



from itertools import chain

list_a = [1, 22]
list_b = [7, 20]
list_c = [3, 70]

for i in chain(list_a, list_b, list_c):
    print(i)
# 1,22,7,20,3,70
      
      





Sélectionnez les éléments en double adjacents



La fonction est groupby



utilisée pour sélectionner des éléments dupliqués adjacents dans un itérateur et les joindre.



from itertools import groupby

for key, group in groupby('YAaANNGGG'):
    print(key, list(group))
# Y ['Y']
# A ['A']
# a ['a']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']
      
      





Comme indiqué ci-dessus, des symboles similaires adjacents sont connectés ensemble. De plus, nous pouvons dire à la fonction groupby



comment déterminer l'identité de deux éléments :



from itertools import groupby

for key, group in groupby('YAaANNGGG', lambda x: x.upper()):
    print(key, list(group))
# Y ['Y']
# A ['A', 'a', 'A']
# N ['N', 'N']
# G ['G', 'G', 'G']
      
      





Personnaliser le cycle



Après avoir examiné les exemples ci-dessus, réfléchissons aux raisons pour lesquelles les boucles for



Python sont si flexibles et gracieuses. Autant que je sache, cela est dû au fait que nous pouvons utiliser des for



fonctions dans l'itérateur de boucle . Dans tous les exemples ci-dessus, l'itérateur utilise simplement des fonctions spéciales. Toutes les astuces ont le même schéma :



for x in function(iterator)
      
      





Le module intégré lui-même n'implémente itertools



que les fonctions les plus courantes pour nous. Si nous oublions une fonction ou ne trouvons pas celle dont nous avons besoin, nous pouvons simplement l'écrire nous-mêmes. Pour être plus précis, ces fonctions sont des générateurs . C'est pourquoi nous pouvons générer des boucles infinies avec eux.



Fondamentalement, nous pouvons personnaliser la boucle for



comme nous le ferions avec un générateur personnalisé.



Regardons un exemple simple :



def even_only(num):
    for i in num:
        if i % 2 == 0:
            yield i


my_list = [1, 9, 3, 4, 2, 5]
for n in even_only(my_list):
    print(n)
# 4
# 2
      
      





Comme vous pouvez le voir dans l'exemple ci-dessus, nous avons défini un générateur appelé even_only



. Si nous utilisons ce générateur dans une boucle for, l'itération ne se produira que pour les nombres pairs de la liste.



Bien entendu, cet exemple n'est qu'une explication. Il existe d'autres façons de faire la même chose, comme l'utilisation de la vue en liste .



my_list = [1, 9, 3, 4, 2, 5]
for n in (i for i in my_list if not i % 2):
    print(n)
# 4
# 2
      
      





Production



La tâche de création de boucles en Python peut être résolue de manière très flexible et gracieuse. Pour écrire des boucles simples et pratiques, nous pouvons utiliser des outils intégrés ou même définir nous-mêmes des générateurs.






Publicité



Serveur fiable à louer , créez votre propre configuration en quelques clics et commencez à travailler en une minute. Tout fonctionnera sans problème et avec un temps de disponibilité très élevé !



Rejoignez notre chat Telegram .






All Articles