Maison > Article > développement back-end > Défi : Alternatives à l'implémentation de boucles en Python
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 :
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 :
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.
Vous pouvez utiliser les outils existants pour remplacer la boucle for
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)
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
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))
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 forCe 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!