Maison  >  Article  >  développement back-end  >  Défi : Alternatives à l'implémentation de boucles en Python

Défi : Alternatives à l'implémentation de boucles en Python

WBOY
WBOYavant
2023-05-07 09:28:071155parcourir

挑战不再写Python for 循环

Cela fait un moment que j'ai commencé à explorer les étonnantes fonctionnalités du langage Python. Au début, je me suis lancé un défi dans le but de me permettre de pratiquer plus de fonctionnalités du langage Python que je n'aurais eu d'expérience en programmation avec d'autres langages de programmation. Cela rend les choses de plus en plus intéressantes ! Le code devient de plus en plus concis et le code semble plus structuré et standardisé. Je présenterai ces avantages ci-dessous.

La boucle for est généralement utilisée dans les scénarios d'utilisation suivants :

  • Pour extraire des informations dans une séquence.
  • Générez une séquence à partir d'une autre.
  • Écrire pour est devenu une habitude.

Heureusement, Python dispose déjà de nombreux outils pour vous aider à le faire, il vous suffit de changer d'avis et d'y penser sous un angle différent.

Quels avantages obtenez-vous en évitant d'écrire des boucles :

  • Moins de code
  • Meilleure lisibilité du code
  • Moins d'indentations (c'est toujours logique pour Python)

Jetons un coup d'œil à la structure du code ci-dessous :

# 1
with ...:
 for ...:
 if ...:
 try:
 except:
 else:

Dans cet exemple, nous avons affaire à plusieurs niveaux de code imbriqué, ce qui est difficile à lire. Cet exemple utilise plusieurs niveaux de code imbriqué. Ce que j'ai trouvé dans ce code, c'est l'utilisation aveugle de l'indentation pour mélanger la logique de gestion (avec, try-sauf) et la logique métier (pour, si). Si vous respectez la convention consistant à utiliser uniquement l'indentation pour la logique administrative, la logique métier principale doit être supprimée immédiatement.

  • "Les structures plates sont meilleures que les structures imbriquées" - Le Zen de Python

Vous pouvez utiliser les outils existants pour remplacer la boucle for

1 Compréhension de liste / expression génératrice

Jetons un coup d'œil à un exemple simple. Si vous souhaitez convertir un tableau en un autre :

result = []
for item in item_list:
 new_item = do_something_with(item)
 result.append(item)

Si vous aimez MapReduce, vous pouvez également utiliser map ou List Comprehension en Python :

result = [do_something_with(item) for item in item_list]

De même, si vous Si vous souhaitez uniquement parcourir les éléments de

dans le tableau, vous pouvez également utiliser la même expression de générateur de code.

result = (do_something_with(item) for item in item_list)

2. Fonction

Si vous souhaitez mapper un tableau à un autre tableau, appelez simplement la fonction map pour résoudre ce problème d'une manière de programmation plus avancée et plus pratique.

doubled_list = map(lambda x: x * 2, old_list)

Si vous souhaitez réduire une séquence à une seule, utilisez réduire

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

De plus, de nombreuses fonctions intégrées de Python utilisent des itérables :

>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> dict(zip(a,a))
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> str(a)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> sum(a)
45

3. Extraire des fonctions ou des générateurs

Les deux méthodes ci-dessus sont plus faciles à gérer. logique. Que diriez-vous d’une logique plus complexe ? En tant que programmeurs, nous écrivons des fonctions pour faire abstraction d'activités complexes. La même idée s’applique ici. Si vous écrivez comme ceci :

results = []
for item in item_list:
 # setups
 # condition
 # processing
 # calculation
 results.append(result)

Vous ajoutez évidemment trop de responsabilité à un bloc de code. Au lieu de cela, je vous suggère de faire :

def process_item(item):
 # setups
 # condition
 # processing
 # calculation
 return result
results = [process_item(item) for item in item_list]

Et si vous passez à une fonction imbriquée

results = []
for i in range(10):
 for j in range(i):
 results.append((i, j))

Changez pour la compréhension de liste et l'implémentation est comme ceci :

results = [(i, j)
for i in range(10)
for j in range(i)]

Si votre bloc de code doit enregistrer un état interne

# finding the max prior to the current item
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = []
current_max = 0
for i in a:
 current_max = max(i, current_max)
 results.append(current_max)
# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

Nous utilisons générateur Pour y parvenir :

def max_generator(numbers):
 current_max = 0
 for i in numbers:
 current_max = max(i, current_max)
 yield current_max
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = list(max_generator(a))
  • Les lecteurs peuvent demander "Attendez ! Vous avez utilisé une boucle for dans le générateur, en trichant ! Ne vous inquiétez pas, regardez à nouveau le code suivant.

Ne l'écrivez pas vous-même. itertools le fera vous aider L'implémentation de ce module est très simple. Je pense que ce module peut remplacer votre boucle for originale dans la plupart des scénarios. Par exemple, le dernier exemple peut être réécrit comme suit :

from itertools import accumulate
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
resutls = list(accumulate(a, max))

De plus, si vous souhaitez itérer la séquence combinée, vous vous devez utiliser product(), permutations(), combinaisons()

Conclusion

Dans la plupart des cas, vous n'avez pas besoin d'écrire des boucles for
  • Vous devriez éviter d'écrire des boucles for, ce qui rendra le code plus lisible. .Le sexe

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer