Maison > Article > développement back-end > Trois options | Abandonnez la boucle for et rendez le code Python plus pythonique !
Pourquoi devriez-vous vous mettre au défi de ne pas écrire de boucle for dans votre code ? Parce que cela vous oblige à apprendre à utiliser une syntaxe ou des bibliothèques plus avancées et plus idiomatiques. L'article utilise Python comme exemple pour parler de nombreuses syntaxes que tout le monde a vues dans le code d'autres personnes mais qui les utilisent rarement eux-mêmes.
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 décrirai 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 son 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
Regardons 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 souhaitez simplement parcourir les éléments du tableau, c'est aussi possible Utilisez le même code que Generator Expression. result = (do_something_with(item) for item in item_list)
Si vous souhaitez mapper un tableau dans un autre tableau, appelez simplement la fonction map et vous pouvez utiliser une méthode de programmation plus avancée et plus pratique pour résoudre le problème. problème. Cette question.
doubled_list = map(lambda x: x * 2, old_list)
Si vous souhaitez réduire une séquence à une seule, utilisez réduire
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 bonnes pour une gestion plus simple 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]
Que se passe-t-il si vous passez à une fonction imbriquée :
results = [] for i in range(10): for j in range(i): results.append((i, j))
Changez en Compréhension de liste pour obtenir quelque chose 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]
us Utilisez des générateurs 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 le code ci-dessous.
Ne l'écrivez pas vous-même. itertools vous aidera 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 avez besoin. pour 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!