Python Mastery From Absolute Beginner To FR
Python Mastery From Absolute Beginner To FR
NIBEDITA Sahu
2.2. Opérateurs
3.1. Listes
3.1. Listes
3.2. Tuples
3.3. Dictionnaires
Opérations en série
7.1. Créer et importer des modules | 7.2. Travailler avec des paquets
Exploration des modules couramment utilisés (os, sys, math, random, etc.)
Drapeaux en question
Techniques de débogage
Points supplémentaires :
19.3. Versionnement du code et collaboration (Git, GitHub)
Annexe : [[370]]
Solutions :
Ressources :
Fin de la description :
Préface :
Bienvenue sur le site "Python Mastery : Du débutant absolu au
professionnel" ! Si vous tenez ce livre entre vos mains, il y a de fortes
chances que vous ayez une curiosité insatiable pour la programmation
Python, un langage qui a captivé le monde de la technologie et de
l'innovation. Que vous fassiez vos premiers pas dans le monde passionnant
de la programmation ou que vous cherchiez à affiner vos compétences,
vous êtes au bon endroit.
L'aventure de la maîtrise de Python peut être à la fois exaltante et
difficile, mais n'ayez crainte : ce livre est votre fidèle compagnon pour le
chemin à parcourir. En tant que passionné de technologie, auteur et
programmeur Python, j'ai moi-même parcouru ce chemin et je suis ravi de
partager mes connaissances et mes expériences avec vous.
Dans ces pages, nous nous embarquerons dans une aventure qui
couvrira tout le spectre de la programmation Python, depuis ses éléments
fondamentaux jusqu'au domaine des techniques avancées. Tout au long de
ce livre, j'ai pour objectif de nourrir votre compréhension, en vous
encourageant à penser comme un véritable expert de Python plutôt que de
mémoriser des lignes de code.
Attendez-vous à plonger dans des projets du monde réel, en explorant
des applications pratiques qui renforceront votre apprentissage et
enflammeront votre créativité. Lorsque vous atteindrez le dernier chapitre,
vous aurez la confiance nécessaire pour relever des défis de codage
complexes, développer vos projets et contribuer à la dynamique
communauté Python.
Rappelez-vous que le voyage vers la maîtrise de Python ne consiste pas
seulement à atteindre une destination ; il s'agit de la joie d'apprendre et de
la satisfaction de découvrir de nouvelles possibilités à chaque ligne de code
que vous écrivez.
Alors, sans plus attendre, embarquons ensemble pour ce voyage enrichissant.
Libérons tout le potentiel de Python et profitons des possibilités infinies
qu'il offre au bout de nos doigts.
Bon codage !
Nibedita Sahu
Description :
Exploitez tout le potentiel de Python grâce à ce guide complet et
captivant qui vous emmène dans un voyage passionnant, du débutant
absolu au professionnel chevronné ! Que vous soyez totalement novice ou
que vous ayez déjà une certaine expérience de la programmation, ce livre
est conçu pour vous doter des compétences et des connaissances
nécessaires pour exceller dans la programmation Python.
POURQUOI CE LIVRE SE D É M A R Q U E :
1. Apprentissage pas à pas : Le livre suit une approche structurée,
vous guidant pas à pas à travers les concepts de Python, ce qui rend
l'apprentissage facile et agréable.
2. Des projets concrets : Acquérir une expérience pratique en
construisant des projets concrets qui consolideront votre
compréhension et vous prépareront à relever de véritables défis en
matière de codage.
3. La maîtrise, pas la mémorisation : Mettant l'accent sur la
compréhension plutôt que sur la mémorisation, ce livre vous permet
de penser comme un expert Python, ce qui vous permet de créer vos
solutions de manière créative.
CE QUI REND CE LIVRE UNIQUE :
1. Au-delà de l'essentiel : Bien qu'il commence par les bases, ce livre
ne s'arrête pas là. Vous vous plongerez dans des sujets Python
avancés afin d'affiner vos compétences et d'élargir vos horizons.
2. Une couverture approfondie : Des types de données fondamentaux
aux algorithmes complexes, pour une compréhension approfondie
des capacités de Python.
3. Des explications claires : Les concepts complexes sont décomposés
en termes simples, ce qui rend les sujets les plus complexes
accessibles et faciles à comprendre.
À QUI S'ADRESSE CE LIVRE :
1. Les programmeurs en herbe : Si vous êtes novice en programmation,
ce livre vous servira de guide amical, vous introduisant à Python avec
facilité et clarté.
2. Les codeurs intermédiaires : Pour ceux qui connaissent les bases de
Python, ce livre offre l'opportunité parfaite d'améliorer vos
compétences et d'explorer des techniques avancées.
3. Les passionnés de technologie : Que vous souhaitiez développer
des applications web, analyser des données ou automatiser des
tâches, Python est la porte d'entrée vers un monde de possibilités, et
ce livre en est la clé.
Nibedita Sahu
Chapitre 1. Maîtrise de Python (feuille de route complète)
Python est un langage de programmation polyvalent et puissant, connu
pour sa simplicité et sa lisibilité. Depuis ses débuts modestes jusqu'à ce
qu'il devienne l'un des langages les plus populaires, Python a acquis une
immense popularité en raison de sa facilité d'utilisation, de ses
bibliothèques étendues et de ses applications très variées.
Ce chapitre peut être un peu long car je couvre un large éventail de
sujets. De plus, à la fin, j'expliquerai quelles sont les possibilités de carrière
après avoir acquis une bonne maîtrise de Python. Il y a encore beaucoup de
choses à explorer.
Alors, patience, attention et finissons-en.
Sautons dans le vif du sujet !
1. Les bases de Python
Les bases de Python font référence aux concepts fondamentaux et à la
syntaxe du langage de programmation Python. Elles comprennent des
sujets tels que les variables, les types de données, les opérateurs, le flux de
contrôle (instructions if, boucles), les fonctions, les modules, les
entrées/sorties, la gestion des fichiers et la gestion des exceptions. La
compréhension de ces bases est essentielle pour écrire et comprendre
efficacement le code Python.
En Python, les variables sont utilisées pour stocker des valeurs de données
et peuvent contenir différents types de données tels que des nombres
(entiers, flottants), des chaînes de caractères et des booléens. Les
opérateurs sont utilisés pour effectuer des opérations sur les variables et les
données, telles que les opérations arithmétiques (+, -, *, /), les
comparaisons (==, <, >) et les opérations logiques (and, or, not).
c) Fonctions et modules :
Les fonctions sont des blocs de code réutilisables qui exécutent des tâches
spécifiques. Elles permettent d'organiser le code et de le rendre plus
modulaire. Les modules sont des fichiers contenant du code Python, y
compris des fonctions et des variables, qui peuvent être importés et utilisés
dans d'autres programmes.
d) Entrée/sortie et traitement des fichiers :
Python fournit des fonctions intégrées pour gérer les opérations d'entrée et
de sortie. Ces fonctions vous permettent de prendre en compte les données
de l'utilisateur, d'afficher les résultats et de travailler avec des fichiers. La
manipulation de fichiers implique l'ouverture, la lecture, l'écriture et la
fermeture de fichiers à l'aide d'objets fichiers et de méthodes spécifiques.
2. Structures de données
Les structures de données sont des conteneurs ou des formats utilisés
pour organiser et stocker efficacement les données. Elles offrent différentes
façons de stocker, de manipuler et d'accéder aux éléments de données.
Voici les explications relatives aux structures de données spécifiques :
b) Ensembles et contre-ensembles :
c) Tableaux (NumPy) :
NumPy est une bibliothèque en Python qui introduit les tableaux, qui sont
similaires aux listes mais optimisés pour les opérations mathématiques et le
traitement efficace de grands ensembles de données. Les tableaux
permettent d'effectuer rapidement des opérations par éléments et de réaliser
des calculs vectoriels.
b) Opérations régulières :
Dans la POO, une classe est un plan ou un modèle qui définit la structure et
le comportement des objets. Elle encapsule les données et les méthodes. Un
objet, d'une manière différente, est une instance d'une classe. Il représente
une entité spécifique avec un état et un comportement qui lui sont propres.
b) Héritage et polymorphisme :
6. Modules et paquets
Les modules et les paquets sont des éléments essentiels de la
programmation modulaire dans de nombreux langages de programmation,
y compris Python. Ils sont
permettent d'organiser et de réutiliser le code en le divisant en fichiers et en
répertoires distincts.
import my_package.my_module
mon_package.mon_module.ma_fonction()
# Changez en fonction de votre paquetage et de votre module.
Globalement, les modules et les paquets permettent d'organiser le code,
d'améliorer la réutilisation du code et de rendre le processus de
développement plus efficace et plus facile à gérer.
Les blocs try-except sont utilisés pour attraper et gérer les exceptions. Le
code contenu dans le bloc try est exécuté et si une exception survient, elle
est capturée par un bloc except qui correspond au type d'exception
spécifique. Cela permet de contrôler la gestion des erreurs, comme
l'affichage d'un message d'erreur, l'enregistrement de l'exception ou
l'adoption d'autres mesures pour remédier à l'erreur et assurer le bon
fonctionnement du programme.
8. Programmation fonctionnelle
La programmation fonctionnelle est un paradigme de programmation
qui met l'accent sur l'utilisation de fonctions pures, où la sortie est
uniquement déterminée par l'entrée.
et n'a pas d'effets secondaires. Il s'attache à considérer le calcul comme
l'évaluation de fonctions mathématiques et promeut l'immutabilité et les
fonctions d'ordre supérieur.
a) Fonctions lambda :
9. Itérateurs et générateurs
Les itérateurs et les générateurs sont des fonctionnalités de Python qui
permettent une itération efficace et contrôlée sur une séquence d'éléments.
a) Protocoles d'itération :
classe MyIterator :
def iter ( self) :
return self
my_iter = MyIterator()
for item in my_iter :
print(item)
"""
Si vous voulez le
passer 'def next
(self) :
passer
Les générateurs sont un type d'itérateur qui peut être créé à l'aide d'une
syntaxe spéciale avec le mot-clé "yield". Ils permettent de définir une
fonction qui se comporte comme un itérateur, générant des valeurs à la
volée sans les stocker en mémoire. Les générateurs sont utiles lorsqu'il
s'agit de séquences importantes ou infinies.
def my_generator() :
yield 1
rendement 2
rendement 3
gen = my_generator()
for item in gen :
print(item)
# Sortie
1
2
3
10. Décorateurs
Les décorateurs en Python sont un moyen de modifier ou d'améliorer le
comportement des fonctions ou des classes sans modifier directement leur
code source.
a) Décorateurs de fonctions :
Les décorateurs de fonctions sont des fonctions qui prennent une autre
fonction en entrée et en renvoient une version modifiée. Ils constituent un
moyen pratique d'ajouter des fonctionnalités supplémentaires aux
fonctions, telles que la journalisation, la synchronisation ou la validation
des entrées, en enveloppant la fonction d'origine d'un code supplémentaire.
def decorator(func) :
def wrapper() :
# Code supplémentaire avant d'appeler la fonction
originale result = func()
# Code supplémentaire après l'appel de la fonction
d'origine return result
retour de l'enveloppe
@decorator
def ma_fonction() :
# Code de la fonction
d'origine Résultat du
retour
b) Décorateurs de classe :
def decorator(cls) :
# Modifier les attributs ou le comportement
de la classe return cls
@decorator
classe
MyClass :
# Définition de la
classe pass
a) os :
import os
# Renommer un fichier
os.rename('old_file.txt', 'new_file.txt')
b) sys :
import sys
# Obtenir les arguments de la ligne de
commande arguments = sys.argv
# Terminer le programme
sys.exit()
c) mathématiques :
import maths
# Calculer le logarithme
logarithme = math.log(10, 2)
d) aléatoire :
import random
# Génère un entier aléatoire
random_number = random.randint(1, 10)
a) SQL (SQLite) :
importer pdb
def ma_fonction() :
x=5
y=2
résultat = x / (y - 2)
retour résultat
pdb.set_trace()
result = my_function()
print(result)
Les tests unitaires sont une méthode permettant de tester des unités ou des
composants individuels d'un logiciel afin de s'assurer qu'ils fonctionnent
correctement. Le module "unittest" de Python fournit un cadre pour
l'écriture et l'exécution de tests unitaires. Il permet de définir des cas de
test, des fonctions de test et des assertions pour vérifier les résultats
attendus.
import unittest
def add_numbers(x, y) :
retour x + y
classe MonTest(unittest.TestCase) :
def test_addition(self) :
result = add_numbers(3, 4)
self.assertEqual(result, 7)
Une classe de cas de test est définie avec une fonction de test qui vérifie si
la fonction "add_numbers" renvoie le résultat attendu à l'aide de l'assertion
"self.assertEqual()". L'exécution du script permet d'exécuter les tests et de
communiquer les résultats.
a) timeit :
b) cProfil :
Python fournit des modules intégrés comme "venv" et des outils externes
comme "conda" pour créer et gérer des environnements virtuels. Ces outils
permettent aux développeurs de mettre en place des environnements isolés
avec des versions et des paquets Python spécifiques, ce qui leur permet de
travailler sur différents projets sans interférence.
b) Installation et gestion des paquets :
Les outils de gestion de paquets tels que pip sont utilisés pour installer,
mettre à niveau et gérer les paquets externes et les dépendances dans un
environnement virtuel. Pip simplifie le processus d'ajout de nouveaux
paquets à un projet, en veillant à ce que les bibliothèques requises soient
facilement utilisables.
b) Documentation :
Développeur/ingénieur logiciel :
Scientifique de données :
Ingénieur de données :
Ingénieur DevOps :
Développeur Web :
Les cadres web de Python, tels que Django et Flask, permettent aux
développeurs de créer des applications web dynamiques, évolutives et
sécurisées. La maîtrise de Python vous permet d'acquérir les compétences
nécessaires pour développer une logique de backend, gérer des bases de
données et créer des API web robustes.
Professionnel de la cybersécurité :
2.2. Opérateurs
2. Cordes :
Les chaînes de caractères sont utilisées pour représenter des données
textuelles en Python. Elles sont placées entre guillemets simples (') ou
doubles ("). Les chaînes sont immuables, ce qui signifie qu'une fois
définies, leurs valeurs ne peuvent pas être modifiées. Cependant, de
nouvelles chaînes peuvent être créées en manipulant des chaînes
existantes.
# Cordes
name = "Nibedita Sahu" # assigner une valeur de chaîne à
name message = 'Hello, ' + name + '!' # concaténer des
chaînes print(name) # Output : Nibedita Sahu
print(message) # Sortie : Bonjour, Nibedita Sahu !
3. Listes :
Les listes sont un type de données polyvalent en Python qui peut
contenir une collection de valeurs. Elles sont ordonnées et mutables, ce qui
signifie que des éléments peuvent être ajoutés, supprimés ou modifiés. Les
listes sont définies en plaçant entre crochets ('[]') des valeurs séparées par
des virgules.
# Listes
numbers = [1, 2, 3, 4, 5] # définition d'une liste de nombres
fruits = ['apple', 'banana', 'orange'] # définition d'une liste de
chaînes mixed = [1, 'apple', 3.14, True] # une liste avec des
types de données mixtes print(numbers) # Sortie : [1, 2, 3, 4, 5]
print(fruits) # Sortie : ['apple', 'banana', 'orange']
print(mixed) # Sortie : [1, 'apple', 3.14, True]
print(fruits + nombres)
# Sortie : ['apple', 'banana', 'orange', 1, 2, 3, 4, 5]
4. Tuples :
Les tuples sont similaires aux listes, mais ils sont immuables, ce qui
signifie que leurs éléments ne peuvent pas être modifiés après leur création.
Les tuples sont définis en plaçant entre parenthèses ('()') des valeurs
séparées par des virgules.
# Tuples
point = (3, 4) # définition d'un tuple représentant un point 2D
person = ('Nibe', 20, '[email protected]') # définition d'un tuple représentant les
informations d'une personne
print(personne)
# Sortie : ('Nibe', 20, '[email protected]')
print(point) # Sortie : (3, 4)
print(point+personne)
# Sortie : (3, 4, 'Nibe', 20, '[email protected]')
5. Dictionnaires :
Les dictionnaires sont utilisés pour stocker des paires clé-valeur.
Chaque valeur est associée à une clé unique, qui peut être utilisée pour
accéder à la valeur correspondante.
Les dictionnaires sont définis en entourant les paires clé-valeur d'accolades ("{}").
# Dictionnaires
student = {'name' : 'Nibedita Sahu', 'age' : 20, 'grade' :
'A'} # définition d'un dictionnaire représentant un
étudiant print(student)
# Output : {'name' : 'Nibedita Sahu', 'age' : 20, 'grade' : 'A' }
Les variables peuvent être utilisées dans des expressions pour effectuer
des opérations et stocker les résultats. Elles peuvent également être
réaffectées à de nouvelles valeurs. Voici un exemple illustrant l'utilisation
des variables :
# Utilisation de la
variable radius = 5
pi = 3,14
print(radius) # Sortie : 5
# Calcul de la surface d'un cercle
area = pi * (radius ** 2)
print(area) # Output : 78.5
# Mise à jour de la valeur du rayon
radius radius = 7
print(radius) # Sortie : 7
# Calcul de la nouvelle surface du
cercle new_area = pi * (radius ** 2)
print(new_area) # Sortie : 153.86
Dans l'extrait de code ci-dessus, nous avons une variable entière "x"
avec une valeur de 5 et une variable chaîne "y" avec une valeur de "10".
Pour effectuer l'addition, nous convertissons "x" en un nombre flottant à
l'aide de la fonction "float()" et "y" en un nombre entier à l'aide de la
fonction "int()". Après la conversion, nous additionnons les deux variables
et stockons le résultat dans la variable "z". Enfin, nous imprimons la valeur
de "z", qui est de 15,0.
Python supporte le typage dynamique, ce qui signifie que nous pouvons
changer le type d'une variable en lui assignant une valeur d'un type
différent. Cette flexibilité nous permet d'écrire un code concis et souple.
Cependant, il est important de manipuler les conversions de type avec
précaution afin d'éviter des résultats inattendus ou des erreurs.
Outre les types de données de base dont nous avons parlé
précédemment, Python propose plusieurs types de données spécialisés et
des modules qui étendent ses fonctionnalités.
Parmi les plus notables, on peut citer
6. Jeux :
Les ensembles sont utilisés pour stocker une collection d'éléments
uniques. Ils sont définis en plaçant des valeurs séparées par des virgules
entre accolades ("{}"). Les ensembles sont utiles pour des tâches telles que
la suppression des doublons d'une liste ou la vérification efficace de
l'appartenance.
# Sets
fruits = {"pomme", "banane", "orange"}
fruits.add("mangue") # ajout d'un élément à
l'ensemble print(fruits)
# Sortie : {'apple', 'mango', 'orange', 'banana'}
7. Booléens :
Les booléens représentent les valeurs de vérité Vrai et Faux. Ils sont
souvent utilisés dans les instructions conditionnelles et le flux de contrôle.
Les comparaisons et les opérations logiques produisent des valeurs
booléennes.
# Booléens
is_raining = True
is_sunny = False
if is_raining :
print("Prenez un parapluie.")
else :
print("C'est bon !") if
not is_sunny :
print("Portez une
veste") else :
print("Suivez votre mode !")
# Sortie :
# Prendre un
parapluie. # Porter
une veste.
# Essayez vous-même en modifiant le code!😊
8. Modules :
Python propose une vaste collection de modules qui offrent des
fonctionnalités supplémentaires par rapport aux types intégrés. Les
modules sont des bibliothèques de code qui peuvent être importées et
utilisées dans vos programmes Python. Parmi les modules les plus
populaires, citons "math" pour les opérations mathématiques, "random"
pour la génération de nombres aléatoires et "datetime" pour travailler avec
des dates et des heures.
# Modules
importés math
Rayon = 5
circonférence = 2 * math.pi * rayon
# utilise le module mathématique pour calculer la
circonférence print(circumference) # Sortie :
31.41592653589793
Soyez attentif à la portée des variables : Les variables ont des portées
différentes, telles que locale et globale. Il est essentiel de comprendre
la portée des variables pour éviter les conflits de noms et s'assurer que
les variables sont accessibles là où elles sont nécessaires.
3. Opérateurs de comparaison :
Les opérateurs de comparaison sont utilisés pour comparer des valeurs
et renvoyer un résultat booléen (vrai ou faux). Ces opérateurs sont
pratiques lorsqu'il s'agit de prendre des décisions ou d'effectuer des
opérations conditionnelles.
# égal au
résultat = 5 ==
5
print(result) # Sortie : True
# Pas égal à
résultat = 5 != 5
print(result) # Sortie : False
# Plus grand que
résultat = 10 > 5
print(result) # Sortie : True
# Inférieur ou égal à
résultat = 3 <= 2
print(result) # Sortie : Faux
4. Opérateurs logiques :
Les opérateurs logiques nous permettent de combiner plusieurs
conditions et d'effectuer des opérations logiques telles que AND, OR et
NOT. Ils sont largement utilisés dans la prise de décision et les
instructions de flux de contrôle.
# Opérateur AND
result = True and False
print(result) # Sortie : Faux
# Opérateur OR
result = True or False
print(result) # Sortie : True
# Opérateur NOT
result = not True
print(result) # Sortie : Faux
6. Opérateurs d'identité :
Les opérateurs d'identité sont utilisés pour comparer les emplacements
mémoire de deux objets. Ces opérateurs vérifient si deux variables font
référence au même objet ou non. Les deux opérateurs d'identité en Python
sont "is" et "is not".
# est
l'opérateur x
= [1, 2, 3]
y=x
résultat = y est x
print(result) # Sortie : True
# n'est pas un opérateur
x = [1, 2, 3]
y = [1, 2, 3]
result = y is not x print(result)
# Output :
Vrai
7. Opérateurs Bitwise :
Les opérateurs bitwise effectuent des opérations sur des bits individuels
de nombres binaires. Ces opérateurs sont utiles dans les scénarios où vous
devez manipuler des données à un niveau inférieur.
# Bitwise AND
result = 5 & 3
print(result) # Sortie : 1
# Bitwise OR
résultat = 5 | 3
print(result) # Sortie : 7
# Bitwise XOR
résultat = 5 ^ 3
print(result) # Sortie : 6
# Bitwise NOT
résultat = ~5
print(result) # Sortie : -6
# Décalage bit à bit vers la
gauche
result = 5 << 1 print(result)
# Output :
10 # Bitwise Right Shift
résultat = 5 >> 1
print(résultat)# Sortie :
2
Priorité de l'opérateur :
La priorité des opérateurs fait référence à l'ordre dans lequel les opérateurs
sont évalués dans une expression. Python suit des règles spécifiques pour la
préséance des opérateurs afin de
garantissent que les expressions sont évaluées correctement. Il est essentiel
de comprendre ces règles pour éviter des résultats inattendus. Comme :
Il est important de noter que vous pouvez utiliser des parenthèses pour
ignorer la priorité par défaut et spécifier explicitement l'ordre d'évaluation
dans les expressions complexes.
Surcharge de l'opérateur :
classe Vector :
def init (self, x, y) :
self.x = x
self.y = y
# Utilisation
v1 = Vecteur(1,
2) v2 =
Vecteur(3, 4) v3
= v1 + v2
print(v3.x, v3.y) # Sortie : 4 6
Ici, nous avons défini l'élément ' add pour ajouter deux objets 'vector'
ensemble. Nous avons également implémenté la méthode ' eq pour
comparer l'égalité de deux objets 'vector' à l'aide de l'opérateur '=='. Ceci
illustre la puissance de la surcharge des opérateurs en Python.
Si vous n'avez pas compris cet exemple, ne vous inquiétez pas. Pour
l'instant, jetez-y un coup d'œil et essayez de comprendre son
fonctionnement et ses utilisations. Nous allons explorer chaque élément
étape par étape. Nous allons lentement, car la compréhension est également
importante. Si nous procédons sans connaître les bases, nous serons
confrontés à des problèmes à l'avenir. Il n'y a pas lieu de s'inquiéter de ce
que vous ne comprenez pas pour l'instant. Il suffit de prendre les codes, de
les essayer, de faire quelques changements et d'obtenir des erreurs. Vous
obtiendrez alors celles que vous n'obteniez pas auparavant.😅
a) si l'énoncé :
âge = 20
si âge >= 18 :
print("You are eligible to vote.") #
voter.
Ici, l'instruction "if" vérifie si la variable "age" est supérieure ou égale à
18. Si la condition est vraie, il imprime le message "Vous avez le droit de
voter". Sinon, il passe au bloc de code suivant.
b) sinon l'énoncé :
âge = 15
si âge >= 18 :
print("Vous avez le droit de
vote") else :
print("You are not yet eligible to vote.") #
de vote.
c) elif statement :
score = 85
if score >= 90 :
print("Votre note est A.")
elif score >= 80 :
print("Votre note est B.")
elif score >= 70 :
print("Votre note est C.")
else :
print("Votre note est D.")
2. Boucles
Les boucles sont utilisées pour répéter un bloc de code plusieurs fois.
Elles nous permettent d'effectuer des tâches itératives et de traiter les
données plus efficacement.
Python propose deux principaux types de boucles : les boucles "for" et les boucles
"while".
a) pour la boucle :
# Sortie
pomme
banane
orange
b) boucle while :
compte = 0
while count < 5 :
print(count)
count += 1
# Sortie :
0
1
2
3
4
"""
Ici, si vous ne l'incrémentez pas de 1 (count += 1), alors
il lancera continuellement 0 0 0 0 0... jusqu'à ce que vous
l'arrêtiez. Lorsque vous l'arrêterez, il dira
"KeyboardInterrupt". Ne faites pas cela, sinon votre système
risque de se planter aussi !
"""
a) pause :
nombres = [1, 2, 3, 4, 5]
pour nombre dans
nombres :
si nombre == 3 :
break
print(nombre)
# Sortie :
1
2
# sortie :
1
2
3
4
5
# Modifiez le code et essayez vous-même, obtenez des erreurs et voyez à quel point c'est excitant !
Dans cet extrait de code, la boucle se termine lorsqu'elle rencontre le nombre
3. Prenez ce code, voyez ce qu'il exécute, puis faites des changements de
votre propre chef, c'est normal d'avoir des erreurs, c'est un autre moment
quand vous résolvez quelque chose de votre propre chef après avoir obtenu
des erreurs. Vous pouvez modifier selon vos besoins et vous amuser ! 😀
b) continuer :
nombres = [1, 2, 3, 4, 5]
pour nombre dans
nombres :
si nombre == 3 :
continue
print(nombre)
# sortie :
1
2
4
5
Dans cet extrait de code, lorsque la boucle atteint le nombre 3, elle ignore
l'instruction "print" et passe à l'itération suivante.
c) passer :
Dans cet extrait de code, l'instruction "pass" est utilisée pour indiquer
qu'aucune action n'est nécessaire lorsque la condition est vraie. Si le
nombre est inférieur ou égal à 5, l'instruction "print" est exécutée.
Dans cet extrait de code, nous avons imbriqué des instructions "if",
"elif" et "else" à l'intérieur de l'instruction "if" extérieure. En fonction de la
valeur de "grade", le bloc de code correspondant sera exécuté. Cela
démontre la flexibilité et l'expressivité du flux de contrôle en Python.
5. Le flux de contrôle dans les applications réelles
Le flux de contrôle est un concept fondamental qui joue un rôle crucial
dans diverses applications du monde réel.
Explorons quelques scénarios dans lesquels le flux de contrôle est couramment
utilisé !
# Sortie :
Somme des nombres pairs
: 30 Somme des nombres
impairs : 25
Dans cet extrait de code, la boucle "for" parcourt chaque nombre de la liste
"numbers". L'instruction "if" vérifie si le nombre est pair ou impair et
calcule la somme en conséquence. Enfin, elle imprime la somme des
nombres pairs et la somme des nombres impairs.
pause :
Poursuivre :
# Sortie :
Nibe
Dita
NS
2. Fonctions d'appel :
Une fois que nous avons défini une fonction, nous pouvons l'appeler
plusieurs fois dans notre programme. L'appel d'une fonction exécute les
instructions contenues dans son bloc et renvoie le résultat, le cas échéant.
Voici comment nous appelons la fonction "add_numbers" de tout à l'heure :
result = add_numbers(5, 7)
print(result) # Output :
12
2. Importation de modules :
Pour utiliser les fonctions définies dans un module, nous devons
l'importer dans notre script actuel. Python propose plusieurs façons
d'importer des modules :
result = math_operations.add_numbers(5, 7)
print(result) # Output : 12
result = add_numbers(5, 7)
print(result) # Output :
12
result = add(5, 7)
print(result) # Sortie : 12
5. Importations de modules :
N'importez que les fonctions ou classes nécessaires d'un module pour
éviter d'encombrer l'espace de noms. Si un module contient un grand
nombre de fonctions, l'importation de fonctions spécifiques peut améliorer
la lisibilité du code et éviter les conflits de noms potentiels.
6. Réutilisation des modules :
Lors de la création de modules, il faut s'efforcer d'obtenir une grande
réutilisabilité. Veillez à ce que le module puisse être utilisé dans différents
contextes sans être étroitement lié à des parties spécifiques du programme.
Créez des modules avec des limites claires et des interfaces bien définies.
Dans cette section, nous avons appris à connaître les fonctions et les modules.
Les fonctions et les modules sont des concepts fondamentaux de
Python qui contribuent grandement à l'organisation, à la réutilisation et à la
maintenance du code. En utilisant des fonctions, nous pouvons décomposer
des problèmes complexes en éléments plus petits et plus faciles à gérer,
tandis que les modules nous permettent d'organiser le code connexe en
unités réutilisables.
Le respect des meilleures pratiques, telles que le choix de noms
descriptifs, la création de fonctions modulaires et concises et la
documentation adéquate du code, contribue à améliorer la collaboration, la
lisibilité du code et la facilité de maintenance.
L'exploitation de la puissance des fonctions et des modules en Python
permet aux développeurs d'écrire un code propre, modulaire et efficace, ce
qui favorise de meilleures pratiques de développement logiciel et accélère
le processus de développement. Alors, faites des fonctions et des modules
vos alliés dans la programmation Python, et libérez leur potentiel pour
créer des solutions élégantes et robustes.
2.5. ENTRÉE/SORTIE ET TRAITEMENT DES
FICHIERS
Python, connu pour sa simplicité et sa polyvalence, offre un large éventail
de fonctionnalités pour gérer les opérations d'entrée/sortie et la
manipulation des fichiers. Que vous soyez un débutant faisant ses premiers
pas dans la programmation ou un développeur expérimenté cherchant à
rafraîchir ses connaissances, cette section vous servira de guide complet
pour comprendre et utiliser les concepts d'entrée/sortie et de manipulation
de fichiers en Python.
Avant d'entrer dans les détails, examinons brièvement ce que les
entrées/sorties (E/S) et la gestion des fichiers impliquent dans le contexte
de la programmation.
Comprendre les entrées/sorties et le traitement des fichiers :
Les entrées/sorties (E/S) désignent la communication entre un
programme et son environnement externe, tel que l'utilisateur, les fichiers
ou les ressources réseau. En Python, les E/S sont essentielles pour interagir
avec les utilisateurs, lire des données dans des fichiers, écrire des données
dans des fichiers et effectuer diverses opérations sur les flux d'entrée et de
sortie.
La gestion des fichiers, quant à elle, se concentre spécifiquement sur la
lecture et l'écriture dans les fichiers. Les fichiers constituent un mécanisme
de stockage persistant, qui permet de stocker et d'extraire des données lors
de l'exécution de différents programmes.
Lecture des données de l'utilisateur :
Commençons par l'un des aspects les plus fondamentaux des E/S : la
lecture des entrées utilisateur. La fonction "input" de Python vous permet de
demander des informations à l'utilisateur et de stocker la valeur fournie dans
une variable.
name = input("Veuillez saisir votre nom : ")
print("Hello, " + name + " ! Welcome to our program.")
# Input : Veuillez saisir votre nom : NS
# Sortie : Bonjour, NS ! Bienvenue dans notre programme.
# Sortie :
Nom : NS
Age : 20
# Ici, nous avons utilisé "\n" : C'est ce qu'on appelle un
caractère de nouvelle ligne. # Ça a l'air bien, alors j'ai
ajouté : faites comme vous voulez ! 😅
5. La clause finale :
Un autre aspect essentiel de la gestion des exceptions en Python est la
clause "finally". Elle vous permet de spécifier le code qui doit être exécuté
sans tenir compte des exceptions.
qu'une exception se produise ou non. Cela permet de s'assurer que les
opérations de nettoyage nécessaires sont effectuées, telles que la fermeture
des fichiers ou la libération des ressources.
essayer :
# Code susceptible de soulever une
exception except ExceptionType :
# Code de gestion des
exceptions enfin :
# Code à exécuter sans tenir compte des exceptions
3.2. Tuples
3.3. Dictionnaires
1. Création de listes :
Pour créer une liste en Python, il suffit de placer les éléments entre
crochets.
fruits = ['pomme', 'banane', 'orange']
Dans l'extrait de code ci-dessus, nous avons créé une liste appelée
"fruits" contenant trois chaînes : "pomme", "banane" et "orange".
liste_vide = []
2. Accès aux éléments de la liste :
Il est possible d'accéder aux éléments de la liste en utilisant
l'indexation. L'index représente la position d'un élément dans la liste, à
partir de 0 pour le premier élément. Pour accéder à un élément spécifique,
vous pouvez utiliser la notation entre crochets.
fruits = ['pomme', 'banane', 'orange']
print(fruits[0]) # Sortie : pomme
print(fruits[1]) # Sortie : banane
print(fruits[2]) # Sortie : orange
Dans l'extrait de code ci-dessus, nous avons créé une liste imbriquée
appelée "matrix" dont chaque élément est lui-même une liste. L'accès à des
éléments individuels dans la liste imbriquée implique l'utilisation de
plusieurs indices.
6. Compréhension de listes :
Les compréhensions de listes constituent un moyen concis de créer de
nouvelles listes basées sur des listes existantes. Elles vous permettent de
combiner des boucles et des instructions conditionnelles en une seule ligne
de code.
nombres = [1, 2, 3, 4, 5]
carrés = [x ** 2 for x in numbers]
print(carrés) # Sortie : [1, 4, 9, 16, 25]
noms[1][0] = 'N'
# Erreur : Les chaînes de caractères sont immuables
# Erreur de type : l'objet 'str' ne prend pas en charge l'affectation d'éléments
2. Concaténation :
Les tuples peuvent être concaténés à l'aide de l'opérateur "+", ce qui
crée un nouveau tuple contenant les éléments combinés.
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
concatenated_tuple = tuple1 + tuple2
print(concatenated_tuple) # Output : (1, 2, 3, 4, 5,
6)
3. Multiplication :
Les tuples peuvent être multipliés par un nombre entier, ce qui donne
un nouveau tuple avec des éléments répétés.
mon_tuple = (1, 2)
multiplied_tuple = mon_tuple *
3
print(multiplied_tuple) # Sortie : (1, 2, 1, 2, 1, 2)
3. Tuples imbriqués :
Les tuples peuvent être imbriqués dans d'autres tuples, ce qui permet
de créer des structures de données complexes. Cette imbrication peut se
faire à n'importe quel niveau, ce qui permet de représenter avec
souplesse des données hiérarchiques ou multidimensionnelles.
nested_tuple = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
print(nested_tuple[1]) # Sortie : (4, 5, 6)
print(nested_tuple[1][2]) # Sortie : 6
4. Comparaison de tuple :
Les tuples prennent en charge les opérations de comparaison, telles que
l'égalité (==), l'inégalité (!=), plus grand que (>), moins grand que (<), etc.
La comparaison s'effectue de gauche à droite jusqu'à ce qu'une incohérence
soit détectée ou que la fin du n-uplet soit atteinte.
tuple1 = (1, 2, 3)
tuple2 = (1, 2, 4)
print(tuple1 == tuple2) # Sortie : False
print(tuple1 < tuple2) # Sortie : True
print(tuple1 > tuple2) # Sortie : Faux
my_tuple = (1, 2, 2, 3, 4, 2)
print(my_tuple.count(2)) # Sortie : 3
print(my_tuple.index(3)) # Sortie : 3
5. Conversion de type :
Les n-uplets peuvent être convertis en d'autres structures de données à
l'aide de fonctions de conversion intégrées. Par exemple, "list(my_tuple)"
convertit un tuple en liste, et "set(my_tuple)" le convertit en ensemble.
Cette flexibilité permet à
pour une interconversion transparente entre différentes structures de
données selon les exigences de votre programme.
En vous plongeant dans le monde des tuples, vous avez acquis une base
solide pour comprendre leurs propriétés, leurs opérations et leurs cas
d'utilisation. Vous possédez désormais les connaissances nécessaires pour
exploiter efficacement les tuples dans vos programmes Python, que ce soit
pour regrouper des données connexes, créer des structures de données
légères ou passer plusieurs arguments à des fonctions. Les tuples offrent
l'immuabilité, l'ordre et la compatibilité avec diverses fonctionnalités de
Python, ce qui en fait un outil inestimable pour tout développeur Python.
N'oubliez pas que la pratique est la clé de la maîtrise des tuples et des
autres structures de données. L'intégration régulière des tuples dans vos
exercices et projets de codage permettra non seulement de renforcer votre
compréhension, mais aussi d'améliorer vos compétences générales en
matière de programmation Python.
3.3. DICTIONNAIRES
Les structures de données jouent un rôle essentiel dans la programmation
informatique, car elles nous permettent de stocker, d'organiser et d'extraire
des données de manière efficace. Parmi ces structures, les dictionnaires se
distinguent comme l'une des options les plus polyvalentes et les plus
puissantes. Dans cette section, nous allons nous pencher sur les
dictionnaires en tant que structure de données en Python, comprendre leurs
propriétés uniques, leur fonctionnement et leurs applications pratiques. Que
vous soyez un débutant ou un programmeur expérimenté, ce guide vous
aidera à comprendre les principes fondamentaux des dictionnaires et à
exploiter tout leur potentiel.
Comprendre les dictionnaires
En Python, un dictionnaire est une collection qui contient des paires
clé-valeur. Contrairement aux listes ou aux tableaux, où l'on accède aux
éléments à l'aide d'indices entiers, les dictionnaires nous permettent
d'accéder aux éléments à l'aide des clés qui leur sont associées. Imaginez
un dictionnaire comme un véritable dictionnaire de langue, où les mots
(clés) ont des significations correspondantes (valeurs).
La création d'un dictionnaire est simple en Python. Vous utilisez des
accolades "{}" et séparez chaque paire clé-valeur par deux points ':'.
# Création d'un dictionnaire des notes des élèves
student_grades = {'Nibedita' : 85, 'Tushar' : 82, 'Salil' : 88, 'Mayukh' : 91}
Notez que si vous tentez d'accéder à une clé qui n'existe pas dans le
dictionnaire, Python lèvera une exception "KeyError". Pour éviter cela,
vous pouvez utiliser la méthode "get()", qui renvoie une valeur par défaut si
la clé n'est pas trouvée.
# Utilisons get() pour accéder à une clé en toute
sécurité bidisha_grade =
student_grades.get('Bidisha', 'N/A')
print(bidisha_grade) # Sortie : 'N/A'
Pour ajouter une nouvelle entrée au dictionnaire, il faut attribuer une valeur à une
nouvelle clé :
# Sortie :
Nibedita 89
Tushar 82
Salil 88
Mayukh 91
Nibe 94
Suppression d'entrées :
Pour supprimer une paire clé-valeur d'un dictionnaire, vous pouvez
utiliser le mot-clé "del" suivi de la clé :
print(student_grades)
# Sortie :
{'Nibedita' : 89, 'Tushar' : 82, 'Salil' : 88, 'Mayukh' : 91, 'Nibe' :
94} # Suppression de 'Nibe' :
del student_grades['Nibe']
print(student_grades)
# Output : {'Nibedita' : 89, 'Tushar' : 82, 'Salil' : 88, 'Mayukh' : 91}
Dictionnaires imbriqués :
Les dictionnaires peuvent être imbriqués dans d'autres dictionnaires, ce
qui permet de créer des structures de données complexes. Cela est utile
pour traiter des données hiérarchiques.
# Dictionnaires
imbriqués
student_details = {
Nibe" : {'age' : 20, 'major' : 'Mathematics'},
Dita : {'age' : 21, 'major' : 'Data Science'}
}
print(student_details['Nibe']['major']) # Output : 'Mathématiques'
2. Compréhension du dictionnaire :
Similaire à la compréhension de liste, la compréhension de
dictionnaire fournit un moyen concis de créer des dictionnaires basés
sur des objets itérables. Elle consiste à spécifier des paires clé-valeur et
une condition facultative.
nombres = [1, 2, 3, 4, 5]
carrés = {x : x ** 2 for x in numbers}
print(squares) # Sortie : {1 : 1, 2 : 4, 3 : 9, 4 : 16, 5 : 25}
1. Tri de dictionnaires :
5. Vues du dictionnaire :
Les vues de dictionnaire fournissent des vues dynamiques et en temps
réel des clés, des valeurs ou des paires clé-valeur d'un dictionnaire. Elles
reflètent toutes les modifications apportées au dictionnaire.
student_grades = {'Nibedita' : 85, 'Tushar' : 82, 'Salil' : 88, 'Mayukh' : 91}
keys_view = student_grades.keys()
values_view = student_grades.values()
items_view = student_grades.items()
# Modifier le dictionnaire
student_grades['Bidisha'] = 81
print(keys_view)
# Sortie : dict_keys(['Nibedita', 'Tushar', 'Salil', 'Mayukh', 'Bidisha'])
print(values_view)
# Output : dict_values([85, 82, 88, 91, 81])
print(items_view)
# Output : dict_items([('Nibedita', 85), ('Tushar', 82), ('Salil', 88), ('Mayukh', 91), ('Bidisha', 81)])
2. Suppression d'éléments :
Pour supprimer un élément d'un ensemble, nous pouvons utiliser la
méthode "remove()". Si l'élément n'est pas trouvé dans l'ensemble, une
"KeyError" est levée. Il est également possible d'utiliser la méthode
"discard()", qui ne soulève pas d'erreur si l'élément n'est pas présent.
fruits = {"pomme", "banane", "orange"}
fruits.remove("banane")
print(fruits) # Sortie : {'apple', 'orange'}
fruits = {"apple", "banana", "orange"}
fruits.remove("cherry")
print(fruits) # Sortie : KeyError : 'cherry'
fruits = {"apple", "banana", "orange"}
fruits.discard("cherry")
print(fruits) # Sortie : {'orange', 'pomme', 'banane'}
3. Opérations mathématiques :
Les ensembles prennent en charge diverses opérations mathématiques
telles que l'union, l'intersection et la différence. Ces opérations peuvent être
effectuées à l'aide de méthodes ou d'opérateurs intégrés.
#Union :
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1.union(set2)
print(union_set) # Sortie : {1, 2, 3, 4, 5}
Intersection :
set1 = {1, 2, 3}
set2 = {3, 4, 5}
intersection_set = set1.intersection(set2)
print(intersection_set) # Sortie : {3}
Différence :
set1 = {1, 2, 3}
set2 = {3, 4, 5}
difference_set = set1.difference(set2)
print(difference_set) # Sortie : {1, 2}
2. Opérations mathématiques :
Les ensembles peuvent être utilisés pour effectuer des opérations
mathématiques, telles que la recherche des éléments communs entre deux
ensembles, la recherche des éléments distincts, etc. Ces opérations sont très
efficaces avec les ensembles.
3. Test d' adhésion :
Les ensembles permettent de vérifier rapidement si un élément est
présent dans une collection. C'est utile lorsque l'on travaille avec de
grands ensembles de données et que l'on a besoin de rechercher
rapidement des valeurs spécifiques.
2. Éléments immuables :
En Python, les ensembles ne peuvent contenir que des éléments
immuables, tels que des nombres, des chaînes de caractères et des tuples.
Les objets mutables tels que les listes et les dictionnaires ne peuvent pas
être des éléments d'un ensemble. En effet, les ensembles utilisent le
hachage pour déterminer rapidement l'unicité et les objets mutables
peuvent modifier leur valeur de hachage, ce qui entraîne un comportement
inattendu.
3. Jeux gelés :
Bien que les ensembles soient mutables, Python fournit également une
variante immuable intégrée appelée "frozen sets". Les ensembles gelés
peuvent être créés à l'aide de la fonction "frozenset()" et possèdent les
mêmes propriétés que les ensembles, à l'exception du fait qu'ils ne peuvent
pas être modifiés une fois créés. Les ensembles gelés sont utiles dans les
situations où vous avez besoin d'une collection immuable d'éléments
uniques.
nombres = frozenset([1, 2, 3, 4])
print(numbers) # Sortie : frozenset({1, 2, 3, 4})
# Sortie :
Forme : (2, 3)
Nombre de dimensions : 2
Taille : 6
Type de données : int32
Taille de chaque élément (en octets)
: 4 Taille totale du tableau (en octets)
: 24
Dans l'exemple ci-dessus, nous créons un tableau 2D "arr", puis nous
imprimons ses attributs. Nous pouvons voir que la forme du tableau est '(2,
3)', ce qui indique qu'il comporte 2 lignes et 3 colonnes. Le tableau a 2
dimensions, un total de 6 éléments, et chaque élément est de type 'int64'. La
taille de chaque élément est de 8 octets et la taille totale du tableau est de
48 octets.
Indexation et découpage des tableaux
Accéder aux éléments d'un tableau et les manipuler est une
opération courante lorsqu'on travaille avec des tableaux. Dans
NumPy, nous pouvons utiliser des techniques d'indexation et de
découpage pour récupérer des éléments spécifiques ou des sous-
ensembles d'un tableau.
L'indexation dans NumPy commence à partir de 0, comme dans les
autres langages de programmation. Nous pouvons accéder aux éléments
d'un tableau 1D en utilisant leur index, et aux éléments d'un tableau 2D en
utilisant les index des lignes et des colonnes.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print("Premier élément :",
arr[0]) print("Dernier élément
:", arr[-1]) # Sortie :
Premier élément : 1
Dernier élément : 5
Nous pouvons également attribuer des étiquettes d'index personnalisées aux éléments
de la série.
# Créer une série avec des étiquettes d'index
personnalisées scores = pd.Series([90, 85,
92, 99, 81],
index=['Nibedita', 'Tushar', 'Salil', 'Mayukh', 'Bidisha'])
# Accès aux éléments à l'aide d'étiquettes d'index
personnalisées print(scores['Tushar']) #
Résultat : 85 print(scores['Salil']) # Sortie : 92
print(scores['Mayukh'])# Sortie : 99
Cadres de données
Un DataFrame est une structure de données bidimensionnelle étiquetée,
similaire à un tableau dans une base de données relationnelle ou un tableur.
Il se compose de lignes et de colonnes, chaque colonne pouvant contenir
différents types de données. Les DataFrames sont très efficaces pour la
manipulation et l'analyse de données structurées.
Pour créer un DataFrame, nous pouvons utiliser la fonction
'pd.DataFrame()' de Pandas.
import pandas as pd
# Créer un DataFrame des informations sur les frères et sœurs
data = {'Name' : ['Nibedita', 'Tushar', 'Salil', 'Mayukh',
'Bidisha'], 'Age' : [20, 18, 23, 26, 20],
Hobby' : ['Problem Solving', 'Gaming', 'Gaining New Insights', 'Programming', 'Sleeping']}
df = pd.DataFrame(data)
Sortie :
'r' : Mode lecture (par défaut). Il permet de lire les données d'un
fichier existant. 'w' : Mode écriture. Il permet de créer un nouveau
fichier ou d'écraser le fichier existant.
Soyez prudent car cela effacera le contenu du fichier.
'a' : Mode annexe. Il crée un nouveau fichier s'il n'existe pas ou ajoute
des données à un fichier existant.
'x' : Mode de création exclusif. Il crée un nouveau fichier, mais si le
fichier existe déjà, l'opération échoue.
'b' : Mode binaire. Il est utilisé avec d'autres modes comme 'rb' ou
'wb' pour traiter des données binaires (images, audio, etc.).
't' : Mode texte (par défaut). Il est utilisé avec d'autres modes comme 'rt'
ou 'wt' pour traiter les données textuelles.
"""
Il lira et imprimera le contenu ligne par ligne et nous pourrons
utiliser strip() pour supprimer les caractères de retour à la ligne
supplémentaires.
"""
Dossiers d'écriture :
L'écriture de fichiers en Python est également réalisée avec la fonction
'open()', mais cette fois nous utilisons le mode écriture ('w') ou le mode
annexe ('a'). Il convient d'être prudent lors de l'utilisation du mode écriture,
car il efface le contenu existant du fichier. Pour éviter toute perte
accidentelle de données, nous envisageons d'utiliser le mode append.
# Ouvrir le fichier en mode
écriture file_name = "output.txt"
with open(nom_du_fichier, 'w') as file :
file.write("Hello, this is a sample text.\N")
file.write("Writing data to a file is easy!\N")
# Il écrira des données dans le fichier.
Dans ce code, nous ouvrons le fichier "output.txt" en mode écriture
("w") et utilisons la méthode "write()" pour ajouter des données au fichier.
Notez l'utilisation du caractère de retour à la ligne ("\n") pour commencer
une nouvelle ligne après chaque écriture.
Ajout aux fichiers :
Pour ajouter des données à un fichier existant, utilisez le mode append
('a') au lieu du mode write ('w'). Cela garantit que le contenu existant est
préservé et que les nouvelles données sont ajoutées à la fin du fichier.
# Ouvrir le fichier en mode annexe
file_name = "output.txt"
avec open(nom_du_fichier, 'a') comme fichier :
file.write("Ces données sont ajoutées au
fichier.\n") # Cela ajoutera des données au
fichier.
N'oubliez pas de toujours fermer les fichiers après les avoir manipulés
afin d'éviter les problèmes potentiels liés au verrouillage des fichiers et à la
gestion des ressources. L'instruction "with" garantit la fermeture correcte
des fichiers, mais si vous optez pour l'approche traditionnelle, veillez à
appeler explicitement la méthode "close()".
Comprendre le traitement des fichiers en Python est une compétence
précieuse pour tout programmeur. Que vous travailliez avec de petits
fichiers texte ou de grands ensembles de données, les capacités de
manipulation de fichiers de Python offrent un éventail d'outils permettant de
gérer efficacement divers scénarios. En maîtrisant ces techniques, vous
pouvez lire et écrire efficacement des données dans des fichiers, ce qui rend
vos applications plus polyvalentes et plus robustes.
4.2. FORMATS DE FICHIERS CSV ET JSON
La gestion des fichiers est un aspect fondamental de la programmation qui
nous permet de lire et d'écrire des données dans des fichiers. Elle joue un
rôle crucial dans le traitement de divers types de données, et deux formats
de fichier populaires pour le stockage de données structurées sont CSV
(Comma Separated Values) et JSON (JavaScript Object Notation).
Les deux formats ont leurs propres atouts et cas d'utilisation, ce qui en fait
des outils essentiels pour le traitement, le stockage et l'échange de données.
Dans cet article, nous allons explorer les formats de fichiers CSV et JSON,
leurs différences, leurs avantages et la manière de les utiliser en Python.
1. Comprendre les CSV (Comma Separated Values)
CSV est un format de fichier simple et largement utilisé pour stocker
des données tabulaires. Il représente les données sous forme de texte brut,
où chaque ligne du fichier correspond généralement à une ligne, et les
valeurs de la ligne sont séparées par des virgules ou d'autres délimiteurs
tels que des tabulations ou des points-virgules. Les fichiers CSV peuvent
être facilement créés et modifiés à l'aide d'applications de feuilles de calcul
courantes telles que Microsoft Excel ou Google Sheets.
Avantages du CSV :
Simplicité : Les fichiers CSV ont une structure simple, ce qui les rend
faciles à créer, à lire et à modifier manuellement ou par programme.
Compatibilité : Les fichiers CSV peuvent être importés et exportés par
un large éventail d'applications logicielles, ce qui les rend hautement
interopérables.
Léger : Les fichiers CSV ne consomment pas beaucoup d'espace
disque, ce qui les rend adaptés aux grands ensembles de données.
Avantages de JSON :
Types de données :
CSV est limité en termes de types de données.
Facilité de lecture :
Cas d'utilisation :
Le format CSV est bien adapté aux données tabulaires simples, telles
que les feuilles de calcul, les journaux et les exportations de bases de
données.
JSON est idéal pour le stockage et l'échange de structures de données
complexes, telles que les configurations, les réponses aux API et les
données transmises entre les applications web et les serveurs.
Traitement de données tabulaires simples telles que des feuilles de calcul ou des
bases de données.
Les données sont relativement plates et ne nécessitent pas de structures
imbriquées ou complexes.
Vous avez besoin d'un format léger et simple pour le stockage des données.
CSV et JSON sont tous deux des formats de fichier utiles pour traiter
des données structurées en Python. Alors que CSV convient pour les
données tabulaires à structure simple, JSON se distingue lorsqu'il s'agit de
données complexes et imbriquées.
Comprendre les différences entre ces formats et leurs avantages respectifs
peut vous aider à prendre des décisions éclairées lorsqu'il s'agit de stocker,
de traiter et d'échanger des données dans vos applications Python. N'oubliez
jamais de suivre les meilleures pratiques pour une manipulation efficace des
fichiers et de garantir l'intégrité des données afin de créer des programmes
robustes et fiables.
5. Manipulation de cordes :
5.1. OPÉRATIONS SUR LES CHAÎNES DE CARACTÈRES
2. Longueur de la chaîne
Pour connaître la longueur d'une chaîne de caractères, vous pouvez
utiliser la fonction intégrée "len()". Elle renvoie le nombre de caractères de
la chaîne, espaces compris.
name = "Bidisha"
length = len(name)
print(length) # Sortie : 7
4. Trancher
Le découpage permet d'extraire une partie d'une chaîne de caractères.
Pour ce faire, on utilise l'opérateur des deux points ':'. La syntaxe du
découpage est 'string[start:stop]', où 'start'
est l'indice du premier caractère à inclure, et 'stop' est l'indice du premier
caractère à exclure.
name = "Salil"
partial_name = name[2:5]
print(nom_partiel) # Sortie : lil
Ou si vous pouvez le faire :
name = "Mayukh"
partial_name = name[1:-2]
print(nom_partiel) # Sortie : ayu
Ces méthodes renvoient une nouvelle chaîne dont tous les caractères ont
été convertis en minuscules ou en majuscules, respectivement.
uppercase_text = text.upper()
print(uppercase_text) # Sortie : HELLO, WORLD !
5.2. strip(), lstrip() et rstrip() :
5.3. split() :
date = "2023-07-31"
jour_mois_année = date.split("-")
print(jour_mois_année) # Sortie : ['2023', '07', '31']
5.4. join() :
La méthode 'join()' est utilisée pour joindre les éléments d'un itérable (par
exemple, une liste) en une seule chaîne de caractères en utilisant le
séparateur spécifié.
words = ['Python', 'is', 'awesome']
joined_string = " ".join(words)
print(joined_string) # Sortie : Python est génial
5.5. remplacer() :
nom = "Nibedita"
starts_with_n = name.startswith("N")
print(starts_with_n) # Sortie : Vrai
ends_with_a = name.endswith("a")
print(ends_with_a) # Sortie : Vrai
name = "Tushar"
age = 18
chaîne_formatée = f "Je m'appelle {nom} et j'ai {âge} ans" print(chaîne_formatée)
6.2. format() :
name = "Salil"
age = 22
chaîne_formatée = "Mon nom est {} et j'ai {} ans.".format(nom, âge) print(chaîne_formatée)
Vous pouvez également utiliser l'indexation dans les espaces réservés pour
spécifier l'ordre des variables dans la méthode "format()".
name = "Mayukh"
age = 25
chaîne_formatée = "Mon nom est {1} et j'ai {0} ans.".format(age, name) print(chaîne_formatée)
# Sortie : Je m'appelle Mayukh et j'ai 25 ans.
7.1. isalpha() :
text1 = "PythonIsFun"
is_alpha = text1.isalpha()
print(is_alpha) # Sortie : Vrai
7.2. isdigit() :
phone_number = "1234567890"
is_digit = phone_number.isdigit()
print(is_digit) # Sortie : Vrai
7.3. isalnum() :
Dans cette section, nous avons exploré diverses opérations sur les chaînes
de caractères en Python pour la manipulation des chaînes. Nous avons
abordé la concaténation, la longueur des chaînes, l'indexation des chaînes,
le découpage, les méthodes de chaînes couramment utilisées, le formatage
des chaînes et la validation des chaînes. En tirant parti de ces opérations sur
les chaînes, vous pouvez effectuer de puissantes tâches de traitement de
texte et de manipulation de données en Python.
Comprendre la manipulation des chaînes de caractères est essentiel
pour tout programmeur Python, car elle constitue la base de nombreuses
applications du monde réel. Que vous travailliez avec des entrées
utilisateur, que vous lisiez des fichiers ou que vous traitiez avec des API,
une bonne maîtrise des opérations sur les chaînes de caractères rendra sans
aucun doute votre code plus efficace et plus robuste. Alors, continuez à
vous entraîner et à explorer les possibilités de la manipulation des chaînes
de caractères en Python !
5.2. EXPRESSIONS RÉGULIÈRES
Les expressions régulières, souvent appelées "regex" ou "regexp", sont des
outils puissants pour la recherche de motifs et la manipulation de texte en
Python et dans de nombreux autres langages de programmation. Elles
permettent de rechercher des motifs spécifiques dans des chaînes de
caractères et d'effectuer diverses opérations basées sur ces motifs. Python
fournit le module re, qui prend en charge les expressions régulières.
Voici une définition des expressions régulières en Python :
Les expressions régulières en Python sont une séquence de caractères
qui définissent un modèle de recherche. Elles peuvent être utilisées pour
trouver, faire correspondre et manipuler des chaînes de caractères basées
sur des motifs spécifiques, ce qui rend le traitement de texte et l'extraction
de données plus efficaces et plus flexibles.
Pour utiliser les expressions régulières en Python, vous devez importer le module re.
Voici quelques fonctions et méthodes courantes fournies par le module
re de Python :
1. re.match() :
Déterminer si l'expression régulière correspond au début de la chaîne.
importer re
pattern = r'^Hello'
text = 'Hello, World!'
match = re.match(pattern, text)
if match :
print('Pattern matched at the beginning.')
else :
print('Pattern not found at the beginning.')
2. re.search() :
Recherche de la première occurrence d'un motif dans l'ensemble de la chaîne.
importer re
pattern = r'World'
text = 'Hello, World!'
search_result = re.search(pattern, text)
if search_result :
print('Motif trouvé à l'index:', search_result.start())
else :
print('Motif non trouvé.')
3. re.findall() :
Recherche toutes les occurrences d'un motif dans la chaîne de caractères et les
renvoie sous forme de liste.
importer re
pattern = r'\d+' # Correspond à un ou plusieurs chiffres
text = 'Il y a 7 chats et 12 chiens dans le quartier' matches =
re.findall(pattern, text)
print('Chiffres trouvés:', matches)
4. re.sub() :
Remplacer toutes les occurrences d'un motif dans la chaîne par un
remplacement donné.
importer re
motif = r'\bapple\b'
text = 'J'ai une pomme, et elle a aussi une pomme'
replacement = 'orange'
new_text = re.sub(pattern, replacement, text)
print('Original text:', text)
print('Texte modifié:', nouveau_texte)
5. re.split() :
Divise la chaîne par les occurrences du motif.
importer re
pattern = r'\s+' # Correspond à un ou plusieurs caractères
d'espacement text = 'Hello World \ t of\tPython'
words = re.split(pattern, text)
print('Split words:', words)
Dans cet exemple, nous avons défini une classe appelée Voiture. Elle
possède deux attributs de classe (marque et année) et deux méthodes de
classe (start_engine() et accelerate()).
Création d'objets :
Une fois que vous avez une classe, vous pouvez créer des instances
(objets) de cette classe. Pour ce faire, vous appelez la classe comme s'il
s'agissait d'une fonction, ce qui crée un nouvel objet basé sur le plan de la
classe.
# Création de deux objets
Voiture nibedita_car = Car()
bidisha_car = Car()
Constructeur ( init ) :
Le programme init est une méthode spéciale qui est appelée
automatiquement lors de la création d'un objet. Elle est utilisée pour
initialiser les attributs spécifiques à l'objet.
classe Personne :
def init ( self, name, age) :
self.name = name
self.age = age
def say_hello(self) :
return f "Bonjour, mon nom est {self.name} et j'ai {self.age} ans"
tushar = Person("Tushar", 18)
salil = Personne("Salil", 22)
mayukh = Personne("Mayukh",
25) print(tushar.say_hello())
# Sortie : Bonjour, je m'appelle Tushar et j'ai 18 ans.
print(salil.say_hello())
# Sortie : Bonjour, je m'appelle Salil et j'ai 22 ans.
print(mayukh.say_hello())
# Sortie : Bonjour, je m'appelle Mayukh et j'ai 25 ans.
Dans cet exemple, nous avons une classe de base Animal avec les
attributs name, et les méthodes make_sound() et move().
Définition d'une sous-classe :
Pour créer une sous-classe qui hérite de la classe de base, il suffit
d'indiquer le nom de la classe de base entre parenthèses lors de la définition
de la sous-classe.
classe Chien(Animal) :
def init (self, name, breed) :
super(). init (name) self.breed
= breed
def make_sound(self) :
return "Woof !"
def move(self) :
return "Courir comme un chien"
Ici, nous avons créé une sous-classe Dog qui hérite de la classe de base
Animal. La fonction super() est utilisée pour appeler le constructeur de la
classe de base et initialiser l'attribut name. La sous-classe surcharge
également les méthodes make_sound() et move().
Utilisation de l'héritage :
Nous pouvons maintenant créer des objets de la sous-classe Chien et
accéder aux attributs et aux méthodes de la sous-classe et de la classe de
base.
dog = Dog("Buddy", "Golden Retriever")
print(dog.name) # Résultat : Buddy
print(dog.breed) # Sortie : Golden Retriever
print(dog.make_sound()) # Sortie : Woof !
print(dog.move()) # Sortie : Courir comme
un chien
Dans cet exemple, nous avons créé une fonction animal_sound() qui
prend un objet en argument. Les classes Animal et Dog ont toutes deux une
méthode make_sound(), nous pouvons donc passer des objets des deux
classes à la fonction animal_sound(). Cela démontre le polymorphisme,
puisque le même appel de méthode se comporte différemment en fonction
du type de l'objet passé.
L'héritage et le polymorphisme sont des concepts puissants de la
programmation orientée objet qui facilitent l'organisation, la réutilisation et
la flexibilité du code.
L'héritage permet aux sous-classes d'hériter des attributs et des méthodes
d'une classe de base, ce qui permet la réutilisation et la spécialisation du
code. Le polymorphisme, quant à lui, permet à différents objets d'être
traités de manière uniforme sur la base de leur interface commune, offrant
ainsi une programmation souple et cohérente.
l'approche. Ensemble, ces concepts font de Python un langage expressif et
efficace pour construire des applications complexes et faciles à maintenir.
6.3. CONCEPTS AVANCÉS DE L'OOP
Python est un langage polyvalent qui prend en charge des concepts avancés
de programmation orientée objet (POO). Outre les principes de base de la
POO tels que les classes, les objets, l'héritage et le polymorphisme, Python
propose également des fonctionnalités avancées qui améliorent la
modularité, la réutilisation et la maintenabilité du code. Explorons
quelques-uns de ces concepts avancés de POO à l'aide d'extraits de code :
1. Encapsulation :
L'encapsulation est le concept qui consiste à cacher au monde extérieur
les détails de l'implémentation d'un objet. Elle nous permet de protéger
l'état interne d'un objet et de contrôler l'accès à ses attributs et méthodes.
Python fournit un contrôle d'accès à l'aide de conventions de nommage :
Dans cet exemple, nous définissons une classe MathUtils avec une
méthode de classe circle_area() pour calculer la surface d'un cercle et une
méthode statique add() pour effectuer une addition.
4. Classes de base abstraites (ABC) :
Les classes de base abstraites (ABC) nous permettent de définir des
méthodes abstraites qui doivent être mises en œuvre par les sous-classes
concrètes. Les ABC font office de contrat pour les sous-classes,
garantissant qu'elles fournissent les fonctionnalités requises.
from abc import ABC, abstractmethod
class Shape(ABC) :
@abstractmethod
def area(self) :
passer
classe Square(Forme) :
def init ( self, side) :
self.side = side
def area(self) :
return self.side ** 2
class Circle(Shape) :
def init ( self, radius) :
self.radius = radius
def area(self) :
return 3.14159 * self.radius ** 2
square = Square(4)
circle = Circle(3)
print(square.area()) # Output : 16
print(circle.area()) # Sortie : 28.27431
Dans cet exemple, la classe Shape est une classe de base abstraite avec
une méthode abstraite area(). Les sous-classes Square et Circle
implémentent la méthode area(), ce qui en fait des sous-classes concrètes.
Dans cet exemple, nous n'avons importé que les fonctions add() et
multiply() du module math_operations.
Utilisation d'alias :
Vous pouvez attribuer des alias aux noms de modules ou de fonctions à
l'aide du mot-clé as. Cela peut s'avérer utile pour éviter les conflits de noms
ou pour utiliser des noms plus courts.
# main.py
import math_operations as mo
result_add = mo.add(5, 3)
print("Addition :", result_add) # Output : Addition : 8
result_multiply = mo.multiply(4, 6)
print("Multiplication :", result_multiply) # Output : Multiplication : 24
my_package/utils.py :
# my_package/utils.py
def greet(name) :
return f "Bonjour, {nom} !"
my_package/module1.py :
# my_package/module1.py
def function1() :
return "Fonction 1 du module1"
my_package/module2.py :
# my_package/module2.py
def function2() :
return "Fonction 2 du module2"
my_package/module1.py :
python
Copier le
code
# my_package/module1.py
def function1() :
return "Fonction 1 du module1"
my_package/module2.py :
python
Copier le
code
# my_package/module2.py
def function2() :
return "Fonction 2 du module2"
Importation de sous-paquets :
Vous pouvez également importer des modules à partir de sous-
paquetages en utilisant la notation point.
Supposons que nous ayons un sous-paquet nommé sub_package à
l'intérieur du paquetage my_package avec un module nommé module3.py.
markdown
Copier le code
mon_package/
init .py module1.py
module2.py
sub_package/
init .py module3.py
my_package/sub_package/module3.py :
# my_package/sub_package/module3.py
def function3() :
return "Fonction 3 du module3"
main.py :
# main.py
from my_package import module1, sub_package
print(module1.function1()) # Output : Fonction 1 de module1
print(sub_package.module3.function3()) # Sortie : Fonction 3 du module3
Dans cet exemple, le fichier est fermé dans le bloc final, ce qui garantit
qu'il est fermé correctement, même en cas d'exception.
5. Lever les exceptions :
Vous pouvez lever des exceptions à l'aide de l'instruction raise. Cela
peut s'avérer utile lorsque vous souhaitez gérer certaines situations
manuellement.
def calculate_square_root(number) :
si nombre < 0 :
raise ValueError("Input must be a non-negative number.")
return number ** 0.5
essayer :
result = calculate_square_root(-9)
except ValueError as ve :
print(ve) # Sortie : L'entrée doit être un nombre non négatif.
essayer :
num1 = int(input("Enter the first number : "))
num2 = int(input("Enter the second number : "))
result = num1 / num2
except ValueError :
print("Entrée invalide : Veuillez entrer des nombres
valides.") except ZeroDivisionError :
print("Erreur : Division par zéro.")
Dans cet exemple, le fichier est fermé dans le bloc final, ce qui garantit
qu'il est fermé correctement, même en cas d'exception.
Les blocs try-except en Python permettent de gérer les exceptions et les
erreurs avec élégance. En utilisant ces blocs, vous pouvez anticiper et gérer
les situations exceptionnelles, ce qui évite à votre programme de se
terminer brutalement et offre une meilleure expérience à l'utilisateur. Ils
constituent un élément essentiel de l'écriture d'un code fiable et robuste.
9. Programmation fonctionnelle :
9.1. FONCTIONS LAMBDA
Dans cet exemple, nous définissons une fonction lambda add qui prend
deux arguments x et y et renvoie leur somme. Nous appelons ensuite la
fonction lambda avec les arguments 3 et 5, et elle renvoie 8.
nombres = [1, 2, 3, 4, 5]
nombres_carrés = list(map(lambda x : x ** 2, nombres)) #
nombres_carrés sera [1, 4, 9, 16, 25]
Ici, nous utilisons une fonction lambda avec map(), une fonction d'ordre
supérieur qui applique la fonction donnée à chaque élément de la liste des
nombres. La fonction lambda prend un argument x et renvoie son carré.
Bien que les fonctions lambda présentent plusieurs avantages, il
convient de connaître certaines limites :
Expression unique : Les fonctions lambda sont limitées à une seule
expression, ce qui signifie qu'elles ne peuvent pas contenir plusieurs
instructions ou une logique complexe. Pour des fonctions plus
complexes, vous devez utiliser des fonctions nommées régulières
définies avec def.
Malgré ces limitations, les fonctions lambda sont un outil essentiel dans
l'arsenal d'un programmeur Python. Elles sont particulièrement utiles
lorsque l'on travaille avec des fonctions qui acceptent d'autres fonctions
comme arguments, telles que les opérations de tri, de filtrage ou de
mappage. En outre, elles contribuent au paradigme de la programmation
fonctionnelle en Python et peuvent rendre le code plus élégant et plus
expressif lorsqu'elles sont utilisées judicieusement.
En résumé, les fonctions lambda en Python sont de petites fonctions
anonymes qui offrent un moyen concis de définir des opérations rapides à
la volée. Elles conviennent mieux pour des tâches simples et lorsqu'elles
sont utilisées en conjonction avec des fonctions d'ordre supérieur. Bien
qu'elles aient leurs limites, la maîtrise des fonctions lambda peut améliorer
vos compétences en matière de codage Python et conduire à un code plus
élégant et plus fonctionnel.
9.2. LES FONCTIONS DE
CARTOGRAPHIE, DE
FILTRAGE ET DE
RÉDUCTION
"Map", "filter" et "reduce" sont trois fonctions intégrées d'ordre supérieur
en Python qui sont souvent utilisées pour effectuer des opérations de
programmation fonctionnelle sur des itérables, tels que des listes, des
tuples et d'autres types de séquences. Ces fonctions offrent un moyen plus
concis et plus expressif de manipuler des données et d'effectuer des calculs.
Définissons chacune de ces fonctions :
Fonction de carte :
La fonction map() applique une fonction spécifiée à chaque élément
d'un itérable (par exemple, une liste) et renvoie un itérateur qui produit les
résultats. Elle prend deux arguments : la fonction à appliquer et l'itérable.
La fonction peut être une fonction nommée ordinaire ou une fonction
lambda.
Syntaxe :
map(function, iterable)
Code :
# Définir une fonction pour élever un
nombre au carré def square(x) :
retour x ** 2
# Utiliser map() pour appliquer la fonction square à chaque élément de
la liste numbers = [1, 2, 3, 4, 5]
nombres_carrés = map(square, numbers) #
nombres_carrés sera [1, 4, 9, 16, 25]
classe MyIterable :
def init ( self, data) :
self.data = data
def iter (self) :
return iter(self.data)
my_list = [1, 2, 3, 4, 5]
iterable_object = MyIterable(my_list)
for item in iterable_object :
print(item)
Dans cet exemple, MyIterable est une classe itérable qui contient une
liste de données. Lorsque iter () est appelé, il renvoie un objet
itérateur créé à l'aide de la méthode
fonction iter() appliquée à la liste.
Protocole d'itération :
Le protocole itérateur définit le comportement nécessaire pour que les
objets soient considérés comme des itérateurs. Un itérateur est un objet qui
permet de parcourir une séquence d'éléments et de les récupérer un par un à
l'aide de la fonction next(). Les itérateurs doivent implémenter deux
méthodes : iter () et next ().
Les iter () doit renvoyer l'objet itérateur lui-même. Cette méthode
permet d'utiliser des itérateurs dans des contextes où un itérable est attendu.
Les next () doit renvoyer l'élément suivant de la séquence.
S'il n'y a plus d'éléments à renvoyer, il doit lever l'exception StopIteration.
classe MyIterator :
def init ( self, data) :
self.data = data
self.index = 0
def iter ( self) :
return self
def next ( self) :
si self.index >= len(self.data) :
lever StopIteration
value = self.data[self.index]
self.index += 1
valeur de retour
my_list = [1, 2, 3, 4, 5]
iterator_object = MyIterator(my_list)
for item in iterator_object :
print(item)
Dans cet exemple, MyIterator est une classe d'itérateur qui contient une
liste de données. L'itérateur next () nous permet de récupérer chaque
élément un par un, et l'exception StopIteration est levée lorsqu'il n'y a plus
d'éléments à itérer.
Les objets intégrés de Python, tels que les listes, les tuples, les
dictionnaires et les chaînes, implémentent déjà le protocole itérable. Vous
pouvez créer des objets itérables et itérateurs personnalisés qui
fonctionnent de manière transparente avec les protocoles d'itération de
Python, ce qui vous permet de les utiliser avec des boucles for et d'autres
constructions liées à l'itérabilité. La compréhension et la mise en œuvre de
ces protocoles d'itération sont essentielles pour créer des classes d'itérables
et d'itérateurs efficaces et réutilisables en Python.
10.2. CRÉATION ET UTILISATION DE
GÉNÉRATEURS
Les générateurs en Python sont un type spécial d'itérable qui vous permet
de produire une séquence de valeurs à la volée. Ils constituent un moyen
efficace et peu gourmand en mémoire de générer de grands ensembles de
données ou des séquences infinies sans les stocker en mémoire en une seule
fois. Les générateurs utilisent une syntaxe spéciale et offrent un moyen
pratique de créer des itérateurs en utilisant des fonctions avec le mot-clé
yield.
Pour définir un générateur, vous créez une fonction qui contient une ou
plusieurs instructions yield. Lorsque la fonction est appelée, elle renvoie
un objet générateur. Chaque fois que la méthode next() du générateur est
appelée (implicitement ou explicitement), l'exécution de la fonction est
reprise à partir du point de la dernière instruction yield jusqu'à l'instruction
yield suivante. De cette manière, vous pouvez produire paresseusement
des valeurs sans avoir à calculer toute la séquence à l'avance.
Voyons comment créer et utiliser des générateurs en Python :
Création d'un générateur :
Pour créer un générateur, utilisez le mot-clé yield dans une fonction. La
fonction devient une fonction de générateur et son appel renvoie un objet
générateur.
def my_generator() :
rendement 1
rendement 2
rendement 3
# Créer un objet générateur
gen = my_generator()
Générateurs infinis :
L'un des aspects les plus puissants des générateurs est leur capacité à
créer des séquences infinies. Comme ils produisent des valeurs
paresseusement, vous pouvez créer un générateur qui ne se termine jamais,
ce qui peut être utile dans certains scénarios.
def infinite_generator() :
i=1
pendant que True :
rende
ment i
i += 1
gen = infinite_generator()
print(next(gen)) # Sortie : 1
print(next(gen)) # Sortie : 2
# Cela continuera à imprimer les valeurs suivantes indéfiniment jusqu'à ce que vous arrêtiez la boucle manuellement.
Expressions du générateur :
Outre la définition de fonctions génératrices, vous pouvez également
utiliser des expressions génératrices, dont la syntaxe est similaire à celle
des compréhensions de listes, mais avec des parenthèses à la place des
crochets. Les expressions de générateur sont plus efficaces en termes de
mémoire, car elles produisent des valeurs à la volée, sans créer de liste
complète.
# Expression du générateur
gen = (x ** 2 for x in range(10))
for item in gen :
print(item)
# Sortie : 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
#Sortie :
Il se passe quelque chose avant que la fonction ne soit
appelée. Bonjour !
Il se passe quelque chose après l'appel de la fonction.
2. Module sys
Le module sys fournit des fonctions et des variables permettant
d'interagir avec l'interpréteur Python et les fonctionnalités spécifiques au
système.
Fonctionnalités clés :
3. Module mathématique
Le module mathématique fournit des fonctions mathématiques et des
constantes permettant d'effectuer diverses opérations numériques.
Fonctionnalités clés :
4. Module aléatoire
Le module aléatoire vous permet de travailler avec des nombres
aléatoires et d'effectuer des sélections de manière aléatoire.
Fonctionnalités clés :
2. sys Module :
3. Module mathématique :
4. Module aléatoire :
5. datetime Module :
6. Module de collecte :
7. json Module :
8. Module de temps :
Fermeture de la connexion
# Fermer la connexion
conn.close()
Dans cet exemple, nous nous connectons à une base de données SQLite
nommée "exemple.db". Si la base de données n'existe pas, SQLite la crée
automatiquement.
Création d'un tableau et insertion de données
Une fois la connexion établie, vous pouvez interagir avec la base de
données en créant des tables et en insérant des données.
# Créer un tableau
conn.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER)''')
# Insérer les données dans le tableau
conn.execute("INSERT INTO users (name, age) VALUES ( ?, ?)", ("Alice", 30))
conn.execute("INSERT INTO users (name, age) VALUES ( ?, ?)", ("Bob", 25)) #
Commit changes
conn.commit()
Dans cet exemple, nous créons une table nommée "users" avec les
colonnes "id", "name" et "age". Nous insérons ensuite deux lignes de
données dans la table en utilisant des requêtes paramétrées pour éviter
les injections SQL.
Interroger les données
Pour extraire des données de la base de données, vous pouvez utiliser
des requêtes SQL. La méthode execute() permet d'exécuter les commandes
SQL et la méthode fetchall() permet de récupérer les résultats.
# Interroger les données du tableau
cursor = conn.execute("SELECT * FROM users WHERE age > ?", (25,))
rows = cursor.fetchall()
pour row dans rows :
print(f "ID : {row[0]}, Name : {row[1]}, Age : {row[2]}")
Dans cet exemple, nous exécutons une requête SELECT pour extraire
les utilisateurs dont l'âge est supérieur à 25, puis nous imprimons les
résultats.
Mise à jour et suppression des données
Pour mettre à jour ou supprimer des données dans la base de données,
vous pouvez utiliser la méthode execute() avec les requêtes UPDATE ou
DELETE appropriées.
# Mise à jour des données
conn.execute("UPDATE users SET age = ? WHERE name = ?", (26, "Alice"))
conn.commit()
# Effacer les données
conn.execute("DELETE FROM users WHERE name = ?", ("Bob",))
conn.commit()
Dans cet exemple, nous mettons à jour l'âge d'Alice (26 ans), puis nous
supprimons l'enregistrement de Bob dans la table "utilisateurs".
Fermeture de la connexion
Une fois les opérations sur la base de données terminées, il est essentiel
de fermer la connexion à la base de données.
# Fermer la connexion
conn.close()
2. re.search()
La fonction re.search() recherche le motif dans l'ensemble de la chaîne
et renvoie la première correspondance trouvée.
pattern = r "World"
text = "Hello, World
!"
match = re.search(pattern, text)
if match :
print("Motif trouvé :", match.group())
else :
print("Motif non trouvé")
3. re.findall()
La fonction re.findall() renvoie toutes les occurrences du motif sous la
forme d'une liste de chaînes de caractères.
modèle = r"\d+"
text = "Le prix est de 100 $ et 50 $"
matches = re.findall(pattern, text)
print("Matches :", matches)
Modèles d'expressions régulières
Les expressions régulières permettent de définir des motifs complexes à
l'aide de caractères spéciaux et de métacaractères. Les métacaractères les
plus couramment utilisés sont les suivants :
2. re.split()
La fonction re.split() divise une chaîne de caractères par les
occurrences d'un motif et renvoie une liste de sous-chaînes.
modèle = r"\s+"
text = "Hello World Python"
words = re.split(pattern, text)
print("Words :", words)
DRAPEAUX EN R
Le module re prend également en charge les drapeaux qui modifient le
comportement des fonctions d'expression régulière.
1. re.IGNORECASE ou re.I
Cet indicateur permet d'activer la correspondance sans tenir compte des majuscules
et des minuscules.
motif = r "hello"
text = "Hello, World !"
match = re.search(pattern, text, re.IGNORECASE)
if match :
print("Motif trouvé :", match.group())
else :
print("Motif non trouvé")
2. re.MULTILINE ou re.M
Cet indicateur permet d'activer la concordance entre plusieurs lignes.
motif = r"^Bonjour"
text = "Hello, World!\NHello, Python !"
matches = re.findall(pattern, text, re.MULTILINE)
print("Matches :", matches)
2. Enregistrement
La journalisation est une technique de débogage plus sophistiquée qui
consiste à utiliser le module de journalisation pour enregistrer des messages
à différents niveaux (par exemple, DEBUG, INFO, WARNING, ERROR)
afin d'analyser le comportement du programme.
import logging
logging.basicConfig(level=logging.DEBUG)
def calculate_sum(a, b) :
logging.debug("Entering calculate_sum function")
logging.debug(f "a : {a}, b : {b}")
résultat = a + b
logging.debug("Exiting calculate_sum function")
return result
3. Affirmation
Les assertions sont utilisées pour vérifier si une condition est vraie à un
moment précis du programme. Si la condition est fausse, une erreur
d'assertion (AssertionError) est levée, indiquant un problème dans le code.
def divide(a, b) :
assert b != 0, "La division par zéro n'est pas
autorisée" return a / b
UTILISATION DE PDB POUR LE DÉBOGAGE
Le débogueur intégré à Python, pdb, fournit un environnement de débogage
interactif qui vous permet de parcourir votre code, d'inspecter les variables
et d'analyser le déroulement du programme. Voici comment utiliser pdb :
1. Importation de pdb
importer pdb
2. Définition des points d'arrêt
Vous pouvez placer des points d'arrêt dans votre code à l'aide de la
fonction pdb.set_trace(). Lorsque l'interpréteur atteint ce point, il
interrompt l'exécution et l'invite interactive pdb est activée.
def calculate_sum(a, b) :
result = a + b
pdb.set_trace()
return result
3. Exécution du débogueur
Vous pouvez exécuter votre script avec l'option -m pdb, ou utiliser la
fonction pdb.run() pour lancer le débogueur.
Bash :
Python :
import pdb
def main() :
# Votre code ici
si nom == " main " :
pdb.run("main()")
4. Commandes Pdb
Une fois le débogueur activé, vous pouvez utiliser diverses commandes
pdb pour interagir avec le programme :
5. Quitter le débogueur
Pour quitter le débogueur, utilisez la commande q ou quit. Si vous
souhaitez poursuivre l'exécution sans déboguer, utilisez la commande c ou
continue jusqu'à la fin du programme ou jusqu'au prochain point d'arrêt.
Le débogage est une compétence essentielle pour tout programmeur. En
utilisant des techniques telles que les instructions d'impression, la
journalisation et les assertions, vous pouvez obtenir des informations sur le
comportement de votre programme et identifier les problèmes potentiels. Le
débogueur interactif pdb de Python constitue un outil puissant pour
parcourir le code, inspecter les variables et analyser le déroulement du
programme. En maîtrisant les techniques de débogage et en utilisant des
outils tels que pdb, vous pouvez diagnostiquer et résoudre efficacement les
problèmes de vos programmes Python, ce qui vous permettra d'obtenir des
logiciels plus robustes et plus fiables. Bon débogage !
16.2. TESTS UNITAIRES (MODULE UNITTEST)
Les tests unitaires sont une technique de test de logiciels qui consiste à
tester des unités ou des composants individuels d'un programme de manière
isolée afin de s'assurer qu'ils fonctionnent comme prévu. Le module
unittest de Python est un cadre de test intégré qui fournit des outils pour
écrire et exécuter des tests unitaires. Il permet aux développeurs de définir
des cas de test, d'exécuter des tests et de découvrir et d'exécuter
automatiquement des méthodes de test.
Dans cette section, nous allons explorer le module unittest de Python et
apprendre à écrire et à exécuter des tests unitaires pour le code Python.
Création de cas de test
Un cas de test dans le module unittest est une sous-classe de
unittest.TestCase qui contient une ou plusieurs méthodes de test. Chaque
méthode de test doit tester un aspect spécifique du code testé. Les noms des
méthodes de test doivent commencer par le mot "test" pour être reconnus
comme des cas de test.
Python :
import unittest
def add(a, b) :
retour a + b
class TestAddFunction(unittest.TestCase) :
def test_add_positive_numbers(self) :
result = add(3, 5)
self.assertEqual(result, 8)
def test_add_negative_numbers(self) :
result = add(-2, -3)
self.assertEqual(result, -5)
def test_add_zero(self) :
result = add(10, 0)
self.assertEqual(result, 10)
if name == ' main ' :
unittest.main()
Bash :
Découverte du test
Le module unittest peut découvrir et exécuter automatiquement tous les
cas de test définis dans plusieurs fichiers d'un répertoire. Pour ce faire, vous
pouvez lancer la découverte des tests à partir de la ligne de commande :
Bash :
python -m unittest discover directory
Le programme de test recherchera tous les fichiers nommés test*.py
dans le répertoire spécifié et exécutera tous les tests trouvés.
Dispositifs d'essai
Les montages de test sont des actions de configuration et de
démontage qui sont effectuées avant et après l'exécution de chaque
méthode de test. Le module unittest fournit des méthodes setUp() et
tearDown() dans un scénario de test pour définir les supports de test.
Python :
import unittest
class TestMathOperations(unittest.TestCase) :
def setUp(self) :
# Effectuer les actions de configuration ici (par exemple,
initialiser les ressources) pass
def tearDown(self) :
# Effectuer les actions de démantèlement ici (par exemple,
libérer les ressources) pass
def test_addition(self) :
# Tester l'opération d'addition ici
pass
def test_subtraction(self) :
# Tester l'opération de soustraction
ici pass
si nom == ' main ' :
unittest.main()
Python :
import timeit
def factorial_recursive(n) :
si n <= 1 :
retour 1
return n * factorial_recursive(n - 1)
time_taken = timeit.timeit("factorial_recursive(10)", globals=globals(), number=10000)
average_time = time_taken / 10000
print("Temps moyen :", average_time, "seconds")
import timeit
def factorial_iterative(n) :
résultat = 1
for i in range(1, n + 1) :
résultat *= i
retour résultat
t = timeit.Timer("factorial_recursive(10)", globals=globals())
time_recursive = t.timeit(number=10000)
t = timeit.Timer("factorial_iterative(10)", globals=globals())
time_iterative = t.timeit(number=10000)
print("Average time for recursive :", time_recursive / 10000, "seconds")
print("Average time for iterative :", time_iterative / 10000, "seconds")
Dans cet exemple, nous comparons les temps d'exécution moyens des
fonctions factorielle_récursive et factorielle_itérative.
Profilage avec cProfile
Le module cProfile fournit un profileur déterministe qui enregistre le
temps passé dans chaque appel de fonction d'un programme. Il permet
d'identifier les fonctions qui consomment le plus de temps, ce qui permet
aux développeurs de se concentrer sur l'optimisation des parties critiques
du code.
Exécuter cProfile à partir de la ligne de commande
Pour profiler un script Python à l'aide de cProfile à partir de la ligne de
commande, vous pouvez utiliser la commande suivante :
Bash :
Python :
import cProfil
def fibonacci_recursive(n) :
si n <= 1 :
retourner n
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
cProfile.run("fibonacci_recursive(30)")
Python :
import cProfile
import pstats
def fibonacci_recursive(n) :
si n <= 1 :
retourner n
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
cProfile.run("fibonacci_recursive(30)", "profile_stats")
p = pstats.Stats("profile_stats")
p.sort_stats("time").print_stats()
18.2. L'INSTALLATION ET LA
GESTION DES PAQUETS ( PIP)
18.1. CRÉATION ET GESTION
D'ENVIRONNEMENTS VIRTUELS (
VENV, CONDA)
La création et la gestion d'environnements virtuels en Python, à l'aide
d'outils tels que venv et conda, est un aspect crucial du développement
moderne en Python. Les environnements virtuels permettent aux
développeurs d'isoler les dépendances de leurs projets, en veillant à ce que
différents projets puissent disposer de leur propre ensemble de
bibliothèques sans conflit. Cette pratique favorise la reproductibilité et la
portabilité, et simplifie la gestion des dépendances, ce qui facilite le partage
du code avec d'autres.
Introduction aux environnements virtuels :
Python, langage de programmation populaire et polyvalent, dispose d'un
vaste écosystème de bibliothèques et de paquets que les développeurs
peuvent utiliser dans leurs projets. Cependant, l'inconvénient de cette
abondance est le risque de conflits entre les dépendances. Différents projets
peuvent nécessiter différentes versions d'une même bibliothèque, ce qui
peut entraîner des problèmes tels que des conflits de versions ou des
comportements involontaires. Pour résoudre ce problème, les
environnements virtuels ont été introduits.
Un environnement virtuel est un répertoire autonome qui contient un
interpréteur Python spécifique et un ensemble de paquets installés pour un
projet particulier.
Lorsqu'il est activé, l'environnement virtuel devient l'environnement
Python principal pour le projet, l'isolant ainsi de l'environnement Python
général.
Le système intégré de Python Venv :
Python dispose d'un module intégré appelé venv, qui permet aux
utilisateurs de créer des environnements virtuels légers. Pour créer un
environnement virtuel à l'aide de venv, vous pouvez exécuter la commande
suivante dans votre terminal ou votre invite de commande :
python -m venv myenv
Cette commande crée un nouveau répertoire nommé myenv, contenant
une copie de l'interpréteur Python et de la bibliothèque standard. De plus,
elle inclut un exécutable pip qui peut être utilisé pour installer des paquets
spécifiques à cet environnement virtuel.
Pour activer l'environnement virtuel, vous utilisez la commande
appropriée pour votre système d'exploitation :
Sous Windows :
myenv\Scripts\activate
Ici, nous avons une classe Dog avec des méthodes bark() et
fetch_ball(). Le nom de la classe suit la convention CamelCase, et les
noms des méthodes utilisent le snake_case. Un espacement correct est
utilisé autour du signe "=" dans le constructeur ( init ).
3. Déclarations d' importation :
import os
import sys
import requests
from utils import helper_function
# Reste du code
4. Commentaires et documentation :
def add_numbers(a, b) :
"""
Cette fonction additionne deux nombres et renvoie le résultat.
Paramètres :
a (int) : Le premier nombre.
b (int) : Le deuxième nombre.
Retourne :
int : La somme des deux nombres.
"""
renvoie a + b
def calculate_square(number) :
"""
Calcule le carré d'un nombre donné.
Paramètres :
number (int) : Le nombre d'entrée pour lequel le carré sera calculé. Retourne :
int : Le carré du nombre saisi. """
retour numéro ** 2
def square(number) :
"""Retourne le carré du nombre saisi."" return
number ** 2
2. Tech NS Arena
Chaîne YouTube : https://youtube.com/@TechNSArena
Cette chaîne fournit des informations sur la science des données,
l'apprentissage automatique, la programmation Python, la technologie et les
domaines connexes grâce à un contenu vidéo attrayant.
3. InfoWorldavecNS
Blog : https://infoworldwithns.blogspot.com/
Ce blog offre des perspectives informatives sur la science des données,
l'apprentissage automatique, la programmation Python, l'intelligence
artificielle, la technologie et les domaines connexes. Il inclut des extraits de
code du monde réel avec des explications faciles à comprendre, ce qui en
fait une ressource précieuse pour les apprenants.
4. Tech NS Oracle
Page : https://bmc.link/technsoracle
Tech NS Oracle fournit des aperçus informatifs sur la science des
données, l'apprentissage automatique, la programmation Python,
l'intelligence artificielle, la technologie et les domaines connexes. Explorez
cette page pour un contenu enrichissant et restez informé des dernières
tendances et évolutions dans le monde de la tech.
Ces ressources supplémentaires complètent "Python Mastery : Du
débutant absolu au professionnel" en offrant aux lecteurs la possibilité
d'explorer des sujets plus approfondis, de s'engager dans un contenu
multimédia et d'accéder à des exemples du monde réel. Que vous préfériez
les articles écrits ou les vidéos attrayantes, ces ressources ne manqueront
pas d'enrichir votre parcours en Python et d'approfondir votre
compréhension du monde fascinant de la technologie.
DESCRIPTION FINALE :
Félicitations pour avoir terminé votre voyage de transformation à travers
"Python Mastery : Du débutant absolu au professionnel" ! Ce livre
complet et captivant a été méticuleusement conçu pour donner aux
programmeurs en herbe comme vous les moyens d'acquérir les
connaissances et les compétences nécessaires pour exploiter tout le
potentiel de Python.
Dès le début, vous vous êtes plongé dans les principes fondamentaux
de Python, en apprenant les types de données, les variables et les structures
de contrôle. Au fur et à mesure de votre progression, vous avez gagné en
confiance et les mystères des fonctions, des modules et de la
programmation orientée objet sont devenus évidents. Des projets concrets
vous ont permis d'acquérir une expérience pratique et vous avez créé des
applications qui ont mis en évidence les applications pratiques de Python.
Dans les sections avancées, vous avez abordé des concepts plus
complexes, tels que la gestion des fichiers, les interactions avec les bases
de données et le développement web à l'aide de frameworks tels que Flask
et Django. L'exploration de l'apprentissage automatique et de la science
des données avec Python a ouvert des perspectives passionnantes pour
l'analyse et la visualisation des données, l'élaboration de prévisions et la
résolution de problèmes concrets.
Tout au long de cet ouvrage, l'accent a été mis sur la compréhension, et
non sur la simple mémorisation. Vous avez appris à penser comme un
expert Python, en abordant les défis avec créativité et compétences de
résolution de problèmes. Vous êtes maintenant équipé pour relever des
défis de codage, concevoir des applications évolutives et collaborer à des
projets ambitieux. Alors que vous atteignez le dernier chapitre, vous faites
désormais partie de la dynamique communauté Python, où vos
connaissances et votre passion peuvent inspirer et soutenir d'autres
personnes dans leur parcours de codage. Les possibilités qui s'offrent à
vous, en tant que programmeur Python, sont illimitées.
N'oubliez pas que ce livre n'est pas une fin en soi, mais un tremplin
pour un voyage d'apprentissage et de croissance continus tout au long de la
vie. Profitez de la joie de la découverte et de la satisfaction de créer
quelque chose de significatif avec vos compétences en python.
En tant qu'auteur de ce livre, je tiens à vous remercier sincèrement, cher
lecteur. Votre dévouement et votre enthousiasme ont rendu ce voyage
encore plus gratifiant. J'espère que vous trouverez dans ces pages des
connaissances non seulement précieuses, mais aussi enrichissantes.
Merci d'avoir choisi "Python Mastery : Du débutant absolu au
professionnel". Que votre passion pour Python continue d'alimenter votre
curiosité et votre dynamisme, vous permettant d'atteindre des sommets
encore plus élevés dans le monde de la programmation et de la technologie.
Bon codage !