paint-brush
11 trucs et astuces pour écrire un meilleur code Pythonpar@pragativerma
2,264 lectures
2,264 lectures

11 trucs et astuces pour écrire un meilleur code Python

par Pragati Verma8m2022/08/16
Read on Terminal Reader
Read this story w/o Javascript

Trop long; Pour lire

Python utilise généralement une boucle `for` pour itérer sur un objet itérable. Mais il existe un moyen plus simple et plus pythonique de le faire en utilisant `enumerate() au lieu d'une boucle 'for'. La compréhension de liste au lieu de boucles for brutes est un moyen de créer des listes basées sur les listes existantes. Il peut être utilisé pour trier les éléments dans une liste ou une séquence triée (tuple, ensemble, ensemble gelé) ou une collection (ensemble gelé) La syntaxe d'une compréhension de liste ressemble à ceci : 'HackerNoon'

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 11 trucs et astuces pour écrire un meilleur code Python
Pragati Verma HackerNoon profile picture


Voici 11 trucs et astuces qui vous aideront à écrire un meilleur code Python et à devenir un meilleur programmeur :


1. Itérer avec enumerate à la place ou range(len(x))

En Python, nous utilisons généralement une boucle for pour parcourir un objet itérable. Une boucle for en Python utilise une itération basée sur la collection, c'est-à-dire que Python affecte l'élément suivant d'un itérable à la variable de boucle à chaque itération. Le cas d'utilisation habituel d'une boucle for est le suivant :


 values = ["a", "b", "c"] for value in values: print(value) # a # b # c


Maintenant, si en plus de la valeur, vous souhaitez également imprimer l'index, vous pouvez le faire comme ceci :


 index = 0 for value in values: print(index, value) index += 1 # 0 a # 1 b # 2 c


ou une autre façon courante de le faire est d'utiliser range(len(x)) :


 for index in range(len(values)): value = values[index] print(index, value) # 0 a # 1 b # 2 c


Cependant, il existe un moyen plus simple et plus pythonique d'itérer sur des objets itérables en utilisant enumerate() . Il est utilisé dans une boucle for presque de la même manière que vous utilisez la manière habituelle, mais au lieu de mettre l'objet itérable directement après in la boucle for , ou de l'utiliser comme range(len(values)) , vous le mettez à l'intérieur les parenthèses de enumerate() comme indiqué ci-dessous :


 for count, value in enumerate(values): print(count, value) # 0 a # 1 b # 2 c


Nous pouvons également définir un argument de start pour enumerate() comme indiqué ci-dessous :


 for count, value in enumerate(values, start=1): print(count, value) # 1 a # 2 b # 3 c


La fonction enumerate() renvoie deux variables :

  • le nombre de l'itération courante
  • la valeur de l'item à l'itération courante


Tout comme les variables de boucle dans une boucle for , les variables de boucle peuvent être nommées n'importe quoi, par exemple, nous pouvons appeler index et value et elles fonctionneront toujours. enumerate() est plus efficace qu'une boucle for car elle vous évite d'avoir à vous rappeler d'accéder à la valeur à l'intérieur de la boucle et de l'utiliser correctement, puis n'oubliez pas d'avancer la valeur de la variable de boucle, tout est géré automatiquement par Python .


2. Utilisez la compréhension de liste au lieu de boucles for brutes

La compréhension de liste est un moyen plus simple et élégant de définir et de créer des listes basées sur les listes existantes. Il s'agit simplement d'une seule ligne de code composée de crochets contenant l'expression qui est exécutée de manière répétée à chaque itération. Par conséquent, ils sont plus efficaces en termes de temps et d'espace que les boucles et transforment des instructions itératives en une seule ligne de code.


La syntaxe habituelle d'une compréhension de liste ressemble à ceci :


 newList = [ expression(element) for element in oldList if condition ]


Voici un exemple de compréhension de liste dans le code :


 # Using list comprehension to iterate through loop List = [character for character in 'HackerNoon'] # Displaying list print(List) # Output # ['H', 'a', 'c', 'k', 'e', 'r', 'N', 'o', 'o', 'n']


3. Trier les itérables complexes avec sorted()

La fonction Python sorted() trie les éléments d'un objet itérable dans un ordre spécifique (croissant ou décroissant) et les renvoie sous forme de liste triée. Il peut être utilisé pour trier une séquence (chaîne, tuple, liste) ou une collection (ensemble, dictionnaire, ensemble gelé) ou tout autre itérateur.


La syntaxe de la fonction sorted() est la suivante :


 sorted(iterable, key=None, reverse=False)


La fonction sorted() prend au maximum trois paramètres :

  • iterable : il peut s'agir de n'importe quel itérateur
  • clé : c'est un argument facultatif qui sert de clé pour la comparaison de tri.
  • reverse : C'est aussi un argument facultatif qui est utilisé pour spécifier une liste triée inversée comme sortie


4. Stockez des valeurs uniques avec des ensembles

Un ensemble Python stocke une seule copie des valeurs en double. Par conséquent, il peut être utilisé pour rechercher des valeurs uniques dans une liste. Par exemple:


 list_inp = [100, 75, 100, 20, 75, 12, 75, 25] set_res = set(list_inp) print("The unique elements of the input list using set():\n") list_res = (list(set_res)) for item in list_res: print(item)


Ainsi, la sortie du programme ci-dessus ressemblerait à ceci :


 The unique elements of the input list using set(): 25 75 100 20 12


5. Économisez de la mémoire avec les générateurs

La fonction de base du générateur est d'évaluer les éléments à la demande. C'est très similaire à la syntaxe pour la compréhension de liste, où au lieu de crochets, nous utilisons des parenthèses.


Prenons un exemple où nous voulons imprimer le carré de tous les nombres pairs d'une liste :


 myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("The given list is:", myList) mygen = (element ** 2 for element in myList if element % 2 == 0) print("Elements obtained from the generator are:") for ele in mygen: print(ele)


La sortie du code ci-dessus ressemblerait à ceci :


 The given list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Elements obtained from the generator are: 4 16 36 64 100


Cela dit, leur syntaxe est assez similaire à la compréhension de liste, vous devez vous demander en quoi elle est différente de la compréhension de liste ou d'ensemble. Contrairement à la compréhension de liste ou d'ensemble, la compréhension de générateur n'initialise aucun objet. Par conséquent, vous pouvez utiliser la compréhension du générateur au lieu de la compréhension des listes ou des ensembles pour réduire les besoins en mémoire du programme.


6. Définissez les valeurs par défaut dans les dictionnaires avec .get() et .setdefault()


La méthode .setdefault() permet de définir dict[key]=default si la clé n'est pas déjà dans dict.


La syntaxe de .setdefault() ressemble à ceci :


 dict.setdefault(key, default=None)


Voici un exemple d'extrait de code pour comprendre comment utiliser .setdefault() :


 a_dictionary = {"a": 1, "b": 2, "d": 4} a_dictionary.setdefault("c", 3) print(a_dictionary)


La sortie du code ci-dessus ressemblerait à :


 {'a': 1, 'b': 2, 'd': 4, 'c': 3}


La même chose peut également être obtenue en utilisant la méthode .get() en passant une valeur par défaut pour la clé, comme vous pouvez le voir ci-dessous :


 a_dictionary = {"a": 1, "b": 2, "d": 4} print(a_dictionary.get("c", 3)) print(a_dictionary)


La sortie du code ci-dessus ressemblerait à ceci :


 3 {'a': 1, 'b': 2, 'd': 4}


7. Compter les objets hachables avec collections.Counter

Le module Collections prend en charge les types de données de conteneur hautes performances (en plus des types intégrés list, dict et tuple) et contient une variété de structures de données utiles pour stocker des informations en mémoire.


Un compteur est un conteneur qui enregistre le nombre de fois où des valeurs égales sont ajoutées.

Il peut être utilisé pour implémenter les mêmes algorithmes que d'autres langages utilisent des structures de données de sac ou multi-ensembles pour implémenter.


Les collections d'importation rendent les éléments des collections disponibles en tant que :

 import collections


Puisque nous n'utiliserons que le compteur, nous pouvons simplement faire ceci :


 from collections import Counter


Il peut être utilisé comme suit :


 import collections c = collections.Counter('abcdaab') for letter in 'abcde': print '%s : %d' % (letter, c[letter])


La sortie du code ci-dessus ressemblerait à ceci :


 a : 3 b : 2 c : 1 d : 1 e : 0


8. Formater les chaînes avec f-Strings (Python 3.6+)

Les chaînes f, également appelées "littéraux de chaîne formatés", sont une nouvelle façon plus pythonique de formater les chaînes, prise en charge par Python 3.6+. Ils constituent un moyen plus rapide, plus lisible, plus concis et moins sujet aux erreurs de formatage de chaîne en Python.


Comme le nom "f-string" l'indique, ce sont des littéraux de chaîne qui ont un f au début et des accolades contenant des expressions qui seront remplacées par leurs valeurs au moment de l'exécution, puis formatées à l'aide du protocole __format__ .


Les f-strings peuvent être utilisés comme suit :


 name = "Eric" age = 74 print(f"Hello, {name}. You are {age}.") # 'Hello, Eric. You are 74.'


9. Concaténer des chaînes avec .join()

En Python, nous pouvons utiliser la méthode .join() pour concaténer une liste de chaînes en une seule chaîne. La syntaxe habituelle de cette méthode ressemble à ceci :


 'String to insert'.join([List of strings])


Il peut être utilisé de plusieurs façons - si vous utilisez la chaîne vide ““ , [Liste de chaînes] est simplement concaténée, et si vous utilisez une virgule, une chaîne délimitée par des virgules est créée. Lorsque le caractère de saut de ligne \n est utilisé, un saut de ligne est ajouté après chaque chaîne. Voir l'exemple ci-dessous :


 l = ['aaa', 'bbb', 'ccc'] s = ''.join(l) print(s) # aaabbbccc s = ','.join(l) print(s) # aaa,bbb,ccc s = '-'.join(l) print(s) # aaa-bbb-ccc s = '\n'.join(l) print(s) # aaa # bbb # ccc


10. Fusionner les dictionnaires avec {**d1, **d2} (Python 3.5+)

Le moyen le plus simple de fusionner des dictionnaires consiste à utiliser l'opérateur de décompression ( ** ). La syntaxe de cette méthode ressemble à ceci :


 {**dict1, **dict2, **dict3}


Voici un exemple pour mieux comprendre cette méthode :


 d1 = {'k1': 1, 'k2': 2} d2 = {'k3': 3, 'k4': 4} print({**d1, **d2}) # {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}


11. Simplifiez les instructions if avec if x in list

Supposons que nous ayons une liste avec les couleurs primaires rouge, vert et bleu. Et quelque part dans notre code, nous avons une nouvelle variable avec une couleur, donc c = rouge. Ensuite, nous verrons s'il s'agit de l'une de nos couleurs primaires. Bien sûr, nous pourrions vérifier cela par rapport à chaque élément de notre liste comme suit :


 colors = ["red", "green", "blue"] c = "red" # cumbersome and error-prone if c == "red" or c == "green" or c == "blue": print("is main color")


Cependant, cela peut prendre beaucoup de temps et nous pouvons facilement faire des erreurs, comme si nous avions une faute de frappe ici pour le rouge. Il est plus simple et de loin préférable d'utiliser simplement l'expression if x in list :


 colors = ["red", "green", "blue"] c = "red" # better: if c in colors: print("is main color")


Conclusion

Python est un langage de programmation largement utilisé et en utilisant les trucs et astuces ci-dessus, vous pouvez devenir un meilleur programmeur Python.


J'espère que cet article a été utile. Continue de lire!