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

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

WBOY
Libérer: 2023-05-07 09:28:07
avant
1190 Les gens l'ont consulté

挑战不再写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:
Copier après la connexion

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)
Copier après la connexion

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

Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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]
Copier après la connexion

Et si vous passez à une fonction imbriquée

results = []
for i in range(10):
 for j in range(i):
 results.append((i, j))
Copier après la connexion

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)]
Copier après la connexion

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]
Copier après la connexion

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))
Copier après la connexion
  • 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))
Copier après la connexion

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!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal