A screen with the Python download webpage.
Agence web » Actualités du digital » 6 erreurs de python à éviter lors du codage

6 erreurs de python à éviter lors du codage

En tant que nouveaux programmeurs, nous avons tous fait des erreurs. Mais certaines erreurs ne se produisent pas en raison de ne pas connaître la nature d'un langage de programmation. J'ai donc compilé certaines des erreurs les plus courantes que vous pourriez commettre lors de la programmation en Python.

6

Modification d'une liste tout en itérant

Modifier une liste de python pendant que vous en faites boucler peut ressembler à un raccourci intelligent, mais c'est un gotcha Python classique! Cette erreur sournoise peut conduire à un comportement inattendu, comme sauter des éléments ou se retrouver avec une liste complètement foirée.

Disons que nous avons une liste de nombres, et que nous voulons supprimer tous les chiffres de moins de 5. Cela semble simple, non?

        numbers = (1, 2, 6, 3, 7, 4, 8, 5)
print("Original list:", numbers)

for number in numbers:
   if number < 5:
       numbers.remove(number)

print("Modified list (oops!):", numbers)

Si vous exécutez ce code, vous constaterez que le numéro 2 reste sur la liste.

Mais pourquoi? Dans ce code, nous essayons d'itérer numbers et supprimer des éléments inférieurs à 5. Cependant, lorsque nous supprimons un élément, la liste rétrécit et les indices des éléments suivants changent.

Cela peut faire sauter la boucle sur les éléments. Par exemple, quand 1 est supprimé, 2 se déplacer dans 1la vieille position, mais le comptoir interne de la boucle a déjà évolué, sautant potentiellement 2.

Le moyen le plus sûr et le plus courant de modifier une liste en fonction de ses éléments est d'itérer une copie de la liste ou de créer une nouvelle liste avec uniquement les éléments que vous souhaitez conserver. Dans l'approche de copie, nous créons une copie superficielle de la liste avant d'itérer. De cette façon, vous pouvez supprimer les éléments de la liste d'origine sans affecter le processus d'itération.

        numbers = (1, 2, 6, 3, 7, 4, 8, 5)
print("Original list:", numbers)

for number in numbers(:):
   if number < 5:
       numbers.remove(number)

print("Modified list (fixed with copy):", numbers)

En utilisant numbers(:)nous créons un tranche de la numbers Liste, qui est une copie peu profonde. Le for Loop itère ensuite sur cette copie, entièrement indépendante de toutes les modifications que nous apportons à l'original numbers liste.

Souvent, une façon plus pythonique d'y parvenir consiste à créer une nouvelle liste ne contenant que les éléments que vous souhaitez conserver. Cette approche évite complètement la modification en place et est souvent plus efficace.

        numbers = (1, 2, 6, 3, 7, 4, 8, 5)
print("Original list:", numbers)

filtered_numbers = (number for number in numbers if number >= 5)
print("Filtered list (new list method):", filtered_numbers)

Dans ce code, nous utilisons la compréhension de la liste pour créer une nouvelle liste à partir de celle d'origine qui contient nos éléments souhaités. Cela maintient également la liste originale intacte.

5

Nommer les conflits

Le choix des variables et des noms de fichiers peut sembler un petit détail jusqu'à ce que Python se retourne et vous mord (au figuré.) Nommer mal les choses peut entraîner des bugs étranges, des fonctionnalités ombragées et des heures de confusion. Il existe deux façons courantes: en utilisant des mots clés Python ou des noms intégrés comme les vôtres, et nommer accidentellement vos scripts après des modules Python existants.

Python ne vous empêchera pas de nommer une variable list, strou même sum. Mais ce n'est pas parce que vous le pouvez.

        list = (1, 2, 3)
print(list)

Ce code s'exécutera sans aucun problème. Cependant, si vous ajoutez une autre ligne qui contient le list() Fonction Dans Python, vous obtenez une erreur.

        list = (1, 2, 3)
print(list)

list = list('123')

C'est parce que vous avez remplacé le list() fonction avec votre propre objet de liste. Lorsque vous essayez d'appeler list('123')Python pense que vous essayez d'appeler votre propre liste, pas la fonction intégrée. Donc, utilisez toujours des noms descriptifs qui ne se heurtent pas aux fonctionnalités principales de Python.

        numbers = (1, 2, 3)
converted = list('123')

Non seulement cela vous aidera à éviter d'utiliser des mots clés réservés, mais c'est aussi une bonne pratique pour la lisibilité et le débogage du code. Il en va de même pour nommer vos fichiers de script. Disons que vous créez un fichier nommé random.py Pour expérimenter avec des nombres aléatoires:

        
import random

print(random.randint(1, 10))

Mais lorsque vous exécutez ceci, vous verrez probablement une erreur se plaignant que « le module 'aléatoire' n'a pas d'attribut 'randint'. » Python importe votre propre fichier (random.py) au lieu du réel random Module de la bibliothèque standard. Bogue d'observation classique.

Évitez de nommer vos scripts après des modules existants comme random.py, math.py, os.pyou json.py. Et si vous le faites accidentellement, n'oubliez pas de supprimer le correspondant .pyc ou __pycache__ dossiers après renommager.

4

Arguments de fonction mutable

Python vous permet de définir des valeurs par défaut pour les arguments de fonction, ce qui est super pratique. Mais lorsque ces valeurs par défaut sont mutables (comme les listes ou les dictionnaires), vous entrez dans un piège à bogues sournois.

L'objet mutable par défaut n'est créé qu'une seule fois, lorsque la fonction est définie, pas à chaque fois qu'elle s'appelle. Cela signifie que s'il est modifié, ce changement reste pour l'appel suivant.

        def add_item_to_list(item, item_list=()):
   item_list.append(item)
   return item_list

print(add_item("apple"))
print(add_item("banana"))

Lorsque vous exécutez ce code, vous pouvez vous attendre à ce que chaque appel add_item_to_list() Pour commencer par une liste fraîche et vide si vous n'en fournissez pas. Cependant, la sortie montrera quelque chose d'inattendu:

Nous avons appelé la fonction deux fois. Alors pourquoi "apple" Toujours là lors du deuxième appel? La liste item_list n'est créé qu'une seule fois, donc chaque appel à la fonction continue de modifier la même liste. Cela conduit à un comportement surprenant et très buggy. Pour résoudre ce problème, vous pouvez utiliser None comme par défaut et créez la liste dans la fonction:

        def add_item_to_list(item, item_list=None):
   if item_list is None:
       item_list = ()
   item_list.append(item)
   return item_list

print(add_item("apple"))
print(add_item("banana"))

En défautant à Noneune nouvelle liste est créée à chaque fois que la fonction est appelée.

3

Gestion des fichiers dans le mauvais sens

Travailler avec des fichiers dans Python est assez facile. Mais il y a une erreur courante qui peut se faufiler dans votre code. Ne fermement pas le fichier. Cela peut sembler inoffensif, mais laisser des fichiers ouverts peut entraîner des fuites de mémoire, une corruption de fichiers ou des fichiers verrouillés qui ne sont pas accessibles par d'autres programmes.

        file = open('data.txt', 'r')
content = file.read()

print(content)

Laisser les fichiers ouverts peut causer de graves problèmes. Il peut même empêcher le fichier d'être supprimé ou modifié par d'autres processus. C'est pourquoi vous devez toujours vous assurer de fermer le fichier après avoir terminé vos opérations. Vous pouvez le faire en utilisant le close() fonction.

        file = open('data.txt', 'r')
content = file.read()

print(content)
file.close()

Une autre meilleure pratique consiste à utiliser Python with instruction, qui s'occupe automatiquement de la fermeture du fichier pour vous.

        with open('data.txt', 'r') as file:
     content = file.read()
print(content)

Le with Block gère tout le nettoyage des coulisses. Dès que vous quittez le bloc, Python ferme le fichier pour vous. Cela vous permet de ne pas vous soucier de fermer manuellement le fichier vous-même.

2

Tout importer à partir d'un module

En tant que débutant, il est tentant de simplement gifler un from module import * Au sommet de votre script et appelez-le un jour. Mais à mesure que votre code se développe, ce raccourci devient une recette de catastrophe.

        from math import *
from custom_math import *

print(sqrt(16))

Et si les deux math et custom_math définir une fonction appelée sqrt()? Lequel est appelé? Python ne vous le dit pas. Il remplace silencieusement le précédent.

Vous pourriez utiliser une fonction complètement différente sans vous en rendre compte. De plus, dans les grandes bases de code, le débogage devient un cauchemar dans les grandes bases de code. Vous perdez la trace d'où viennent les fonctions ou les classes. C'est pourquoi vous devriez être explicite avec vos importations.

        import math
import custom_math

print(math.sqrt(16))
print(custom_math.sqrt(16))

Ou même comme ceci:

        from math import sqrt as m_sqrt
from custom_math import sqrt as c_sqrt

print(m_sqrt(16))
print(c_sqrt(16))

Explicite est mieux que implicite (une idée de base du zen de Python.) Vous savez toujours ce que vous utilisez et d'où il vient.

1

Manipulation des exceptions appropriée

Même le code le plus soigneusement conçu peut rencontrer des problèmes inattendus. Ceux-ci sont appelés exceptions dans Python. Les gérer gracieusement est ce qui rend votre programme robuste. Cependant, de nombreux débutants abordent la gestion des exceptions avec une mentalité « fourre-tout », en utilisant large except clauses. Cela pourrait faire taire l'erreur pour l'instant, mais cela laisse votre code fragile, déroutant et difficile à déboguer.

        try:
   result = 10 / 0
except:
   print("Something went wrong!")

Cela attrape tout. Même les erreurs que vous ne vous attendiez pas ou que vous ne vouliez pas gérer. Erreurs de syntaxe, interruptions du clavier, fautes de frappe, importations brisées. Python va les avaler tous avec ce générique except. Ce n'est pas idéal. Au lieu de cela, soyez précis sur ce que vous attrapez:

        try:
   result = 10 / 0
except ZeroDivisionError:
   print("You can't divide by zero!")

Vous n'atteignez que l'erreur que vous attendez. Si quelque chose d'autre se passe mal, Python l'élèvera toujours. Vous n'ignorez donc pas silencieusement les vrais bugs. Vous pouvez également gérer plusieurs exceptions intelligemment:

        try:
   value = int(input("Enter a number: "))
   result = 10 / value
except ValueError:
   print("That's not a valid number!")
except ZeroDivisionError:
   print("You can't divide by zero!")

Éviter except: par lui-même. Si vous devez prendre toutes les exceptions (rarement), utilisez except Exception: et le gérez toujours soigneusement. En gérant spécifiquement les exceptions, votre code devient plus prévisible, plus facile à déboguer et capable de fournir des commentaires plus significatifs.


En évitant ces erreurs, vous introdurez moins d'erreurs, ce qui signifie moins de débogage de votre code Python. Si vous êtes nouveau sur Python et que vous cherchez des ressources, il existe de nombreux jeux qui enseignent Python. En dehors de cela, vous pouvez également réaliser des projets comme un tracker de dépenses ou créer des scripts de base.

★★★★★