Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
public:python:bases [2016/12/05 17:25] – [Les fonctions] aagbo | public:python:bases [2016/12/05 17:29] (Version actuelle) – aagbo | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Les notions de base de Python ====== | ||
+ | <note important> | ||
+ | ===== Les données ===== | ||
+ | <note tip>Les commentaires en Python se font à l'aide de **# | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Les 5 types de base ==== | ||
+ | |||
+ | * Chaînes de caractères | ||
+ | * Entiers | ||
+ | * Réels | ||
+ | * Complexes (la notation utilise j à la place de i) | ||
+ | * Booléens | ||
+ | |||
+ | Afin de connaître le type d'un objet on peut utiliser la fonction type: | ||
+ | <code python> | ||
+ | >>> | ||
+ | <type ' | ||
+ | </ | ||
+ | |||
+ | On peut changer le type d'un objet avec des fonctions telles que: | ||
+ | *str() | ||
+ | *float() | ||
+ | *int() | ||
+ | *complex() | ||
+ | *bool() | ||
+ | |||
+ | ==== Variables ==== | ||
+ | |||
+ | Une variable est un nom auquel est associée un objet. Pour associer un nom à un objet on utilise l’opérateur | ||
+ | d’affectation = tel que: | ||
+ | |||
+ | '' | ||
+ | |||
+ | A gauche de l’opérateur = se trouve un nom (en gros, quelque chose ne pouvant commencer par un nombre) | ||
+ | et à droite un objet. | ||
+ | |||
+ | <note warning> | ||
+ | Il est important de comprendre que l’opérateur d’affectation = n’est pas symétrique. A gauche des noms. | ||
+ | |||
+ | ---- | ||
+ | Attardons nous un moment sur ces notions car elles seront cruciales plus tard pour appréhender les possibilités offertes par les objets. | ||
+ | |||
+ | Considérons le programme suivant: | ||
+ | <code python>x = 1 | ||
+ | y = 1 | ||
+ | x = y</ | ||
+ | {{: | ||
+ | |||
+ | La figure montre le résultat après chaque instruction. On voit qu’un même objet peut parfaitement | ||
+ | avoir plusieurs noms. Cependant, à un nom correspond un unique objet. Les objets qui n’ont plus de | ||
+ | noms sont supprimés à intervalles réguliers (c’est ce qu’on appelle le garbage collector) puisque l’on ne peut plus y accéder. | ||
+ | |||
+ | Le mécanisme décrit précédemment (remplacement des noms par les objets référencés avant exécution | ||
+ | de l’instruction) montre que l’on peut affecter plusieurs noms en même temps, comme le montre l’exemple | ||
+ | suivant: | ||
+ | <code python> | ||
+ | i = 2 | ||
+ | j = 3 | ||
+ | i, j = j, i | ||
+ | </ | ||
+ | |||
+ | ==== Les structures de données ==== | ||
+ | === Les listes === | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | == Création Directe == | ||
+ | |||
+ | On peut créer une liste directement: | ||
+ | * Soit en créant une liste vide puis en ajoutant des éléments un à un. <code python>l = []</ | ||
+ | * Soit en créant la liste déjà pré-remplie. <code python>l = [1, 2, True, "Hello World" | ||
+ | |||
+ | La fonction len() permet d' | ||
+ | On peut alors accéder aux éléments de la liste à l'aide d'un indice variant entre 0 et len(l) - 1. Ainsi avec <code python> | ||
+ | |||
+ | == Création à l'aide de range() == | ||
+ | La commande range permet de créer des listes de nombres. | ||
+ | <note tip> | ||
+ | |||
+ | == Ajout, suppression d' | ||
+ | |||
+ | < | ||
+ | |||
+ | == Copie d'une sous-liste == | ||
+ | |||
+ | On peut copier une partie d'une liste. | ||
+ | Pour **copier la liste l à partir de l' | ||
+ | <code python> | ||
+ | Il n'est pas nécessaire de renseigner tous les champs. | ||
+ | |||
+ | < | ||
+ | |||
+ | === Les dictionnaires === | ||
+ | <note tip> | ||
+ | |||
+ | Un dictionnaire (ou tableau associatif, voir http:// | ||
+ | <code python> | ||
+ | d = {} #on crée un dictionnaire vide | ||
+ | d[" | ||
+ | d[3.14] = " | ||
+ | print(" | ||
+ | print(42 in d) | ||
+ | for cle in d: | ||
+ | print(" | ||
+ | </ | ||
+ | <note warning> | ||
+ | |||
+ | === Les ensembles : set === | ||
+ | <note tip> | ||
+ | Un ensemble permet de garder des données en mémoire de manière non indexée. Contrairement aux listes, où l'on rangeait les éléments dans des cases distinctes, on ne peut **pas** accéder aux éléments d'un ensemble d avec d[i]. | ||
+ | |||
+ | === Notion d' | ||
+ | Les objets que nous avons rencontrés sont mutables, c'est à dire que lorsque on crée une liste '' | ||
+ | |||
+ | Cela n'est toutefois pas possible avec les '' | ||
+ | <note tip> | ||
+ | |||
+ | Un tuple peut se créer de la manière suivante: | ||
+ | <code python> | ||
+ | t = (1, 2, 3) | ||
+ | </ | ||
+ | |||
+ | Essayez maintenant des commandes telles que: | ||
+ | <code python> | ||
+ | t[0] = 10 | ||
+ | t.append(42) | ||
+ | </ | ||
+ | Cela nous renvoie alors des erreurs. | ||
+ | |||
+ | Pour ajouter un élément, il faut créer un autre tuple: | ||
+ | <code python> | ||
+ | </ | ||
+ | |||
+ | Le **frozenset** est un set (ensemble), mais cette fois non mutable. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Structures de contrôle ===== | ||
+ | |||
+ | ==== Comparaisons ==== | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | ==== Blocs ==== | ||
+ | On a souvent besoin de n' | ||
+ | |||
+ | Tous les blocs sont définis de la même manière: | ||
+ | - Ce qui va identifier le bloc pour son exécution (une condition, son nombre d' | ||
+ | - Les instructions le constituant. | ||
+ | |||
+ | Pour séparer les blocs les un des autres, et savoir ce qui le défini , le langage Python utilise l' | ||
+ | <code python> | ||
+ | question = "A quelle heure on mange ?" | ||
+ | print(" | ||
+ | print(question) | ||
+ | print(" | ||
+ | if question == "la vie, l’univers et le reste": | ||
+ | reponse_partielle = 1 + 2 + 3 + 4 + 5 + 6 | ||
+ | reponse = reponse_partielle * 2 | ||
+ | print(reponse) | ||
+ | else: | ||
+ | print(" | ||
+ | </ | ||
+ | Ce code contient 3 blocs: le bloc principal, puis les 2 blocs de conditions (respectivement '' | ||
+ | |||
+ | <note warning> | ||
+ | <note important> | ||
+ | rapport au bloc parent. Pour ne pas passer son temps à compter les espaces à ajouter pour chaque bloc, | ||
+ | on pourra utiliser la la **touche tabulation** en modifiant son fonctionnement (remplacement du caractère | ||
+ | tabulation par des espaces, cela est déjà prédéfini avec PyCharm) et est disponible dans tout bon éditeur.</ | ||
+ | |||
+ | En python, toute ligne définissant un nouveau bloc doit être terminée par le caractère **:** | ||
+ | |||
+ | ==== Conditions si/sinon si/sinon (if/ | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | Exemple:< | ||
+ | x = 7 | ||
+ | if x < 0: | ||
+ | print(" | ||
+ | elif x == 0: | ||
+ | print(" | ||
+ | elif x % 2 == 0: | ||
+ | print(" | ||
+ | else: | ||
+ | print(" | ||
+ | |||
+ | Il est à noter que elif et else sont optionnels. | ||
+ | ==== Boucle while ==== | ||
+ | <note tip> | ||
+ | <code python> | ||
+ | b = 6 | ||
+ | while b > 0: | ||
+ | print(b) | ||
+ | b = b - 1</ | ||
+ | |||
+ | On peut aussi inclure des blocs dans des blocs comme le montre le programme suivant : | ||
+ | |||
+ | <code python> | ||
+ | b = 6 | ||
+ | while b > 0: | ||
+ | print(b) | ||
+ | b = b - 1 | ||
+ | if b == 2: | ||
+ | print(" | ||
+ | | ||
+ | ==== Boucle for ==== | ||
+ | === Les itérateurs === | ||
+ | |||
+ | Pour faire simple, les littérateurs sont des objets qui permettent de créer des suites de données. | ||
+ | Prenons un exemple connu: range() | ||
+ | |||
+ | range permet de créer des itérateurs : range(10) est un itérateur qui va renvoyer les valeurs de 0 à 9. | ||
+ | |||
+ | Pour utiliser '' | ||
+ | |||
+ | Exemple: | ||
+ | <code python> | ||
+ | mon_iterateur = range(10) | ||
+ | for y in mon_iterateur: | ||
+ | print(x) | ||
+ | </ | ||
+ | Essayez ce code et comprenez le : les itérateurs sont de puissants objets python. | ||
+ | |||
+ | Vous pouvez créer votre propre itérateur à l'aide de l’instruction '' | ||
+ | |||
+ | <code python> | ||
+ | def mon_iterateur(valeur): | ||
+ | for x in range(valeur): | ||
+ | yield valeur * x | ||
+ | |||
+ | for x in mon_iterateur(5): | ||
+ | print(x) | ||
+ | </ | ||
+ | |||
+ | Ce qui va s' | ||
+ | < | ||
+ | 0 | ||
+ | 5 | ||
+ | 10 | ||
+ | 15 | ||
+ | 20 | ||
+ | </ | ||
+ | ---- | ||
+ | |||
+ | On peut également boucler sur une liste, qui est un **objet itérable**: | ||
+ | |||
+ | <code python> | ||
+ | l = ["Jet fuel", " | ||
+ | for mot in l: | ||
+ | print(mot) | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Méthodes, fonctions et modules ===== | ||
+ | |||
+ | ==== Les fonctions ==== | ||
+ | === Motivations === | ||
+ | <note tip> | ||
+ | |||
+ | Il n'est jamais bon de copier/ | ||
+ | |||
+ | Pour cela, on utilise des '' | ||
+ | |||
+ | Une fonction est un bloc (revoir [[public: | ||
+ | |||
+ | La partie de programme suivant défini une fonction: | ||
+ | <code python> | ||
+ | def bonjour(): | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | La première ligne est la définition du bloc fonction. Il contient: | ||
+ | * un mot clé spécial précisant que l'on s' | ||
+ | * le nom de la fonction. Ici '' | ||
+ | * des parenthèses qui pourront contenir des paramètres (on verra ça plus tard) | ||
+ | * le **:** qui indique que la ligne d' | ||
+ | Ensuite vient le bloc fonction en lui même qui ne contient qu'une seule ligne. | ||
+ | |||
+ | Si on exécute le bloc précédent, | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | |||
+ | ===Paramètres d'une fonction === | ||
+ | |||
+ | <code python> | ||
+ | def plus_moins(nombre): | ||
+ | if nombre > 42: | ||
+ | print(" | ||
+ | else: | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Cette fonction nécessite donc un paramètre pour être invoquée. Testez alors <code python> | ||
+ | La variable nombre sera associée à l' | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | === Retour d'une fonction === | ||
+ | |||
+ | Toute fonction rend une valeur. On utilise le mot-clef '' | ||
+ | |||
+ | <code python> | ||
+ | def double(valeur): | ||
+ | x = valeur * 2 | ||
+ | return x | ||
+ | </ | ||
+ | |||
+ | Il ne sert à rien de mettre des instructions après une instruction '' | ||
+ | |||
+ | Ainsi, avec la fonction double précédemment définie, testez: | ||
+ | <code python> | ||
+ | x = double(21) | ||
+ | print(x) | ||
+ | </ | ||
+ | |||
+ | Le code précédent exécute la fonction de nom '' | ||
+ | |||
+ | Cette valeur retournée est utilisée par la commande '' | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | === Fonctions v.s. méthodes === | ||
+ | |||
+ | Python vient avec de nombreuses fonctions que l'on peut utiliser. Vous en connaissez déjà comme '' | ||
+ | |||
+ | Ne confondez pas fonctions et méthodes. Une fonction s' | ||
+ | <code python> | ||
+ | ma_liste = range(5) | ||
+ | ma_liste.append(10) | ||
+ | </ | ||
+ | |||
+ | La première ligne exécute une // | ||
+ | |||
+ | Le point un peu délicat est que certaines méthodes ne rendent rien et modifient l' | ||
+ | <code python> | ||
+ | ma_liste = range(5) | ||
+ | ma_liste.insert(2, | ||
+ | un_indice = ma_liste.index(" | ||
+ | print(un_indice) | ||
+ | print(ma_liste[un_indice]) | ||
+ | </ | ||
+ | |||
+ | ==== Visibilité d'un objet ==== | ||
+ | |||
+ | Les noms des objets sont accessibles à l’intérieur du '' | ||
+ | * les fonctions, | ||
+ | * les modules (nous verrons cela), | ||
+ | * les classes (que nous ne verrons pas). | ||
+ | |||
+ | Les variables définies dans une fonction cachent les variables définis dans des blocs supérieurs. Ainsi, | ||
+ | le code suivant imprime 42 puisque la variable '' | ||
+ | <code python> | ||
+ | def f(): | ||
+ | x = 24 | ||
+ | |||
+ | x = 42 | ||
+ | f() | ||
+ | print(x) | ||
+ | </ | ||
+ | |||
+ | De la même manière, que donne le programme suivant ?: | ||
+ | <code python> | ||
+ | def f(parametre): | ||
+ | parametre = 24 | ||
+ | |||
+ | f(2) | ||
+ | print(parametre) | ||
+ | </ | ||
+ | <note warning> | ||
+ | |||
+ | ==== Récursion ==== | ||
+ | === Modification d' | ||
+ | |||
+ | Dans un programme récursif, on a souvent besoin de modifier le même objet plusieurs fois. Même si la fonction récursive ne rend rien. Pour cela, on doit modifier les objets passés en paramètres. Pour comprendre comment cela marche, considérez la fonction suivante~: | ||
+ | <code python> | ||
+ | def ajoute_max(liste_en_parametre): | ||
+ | maximum_liste = max(liste_en_parametre) | ||
+ | liste_en_parametre.append(maximum_liste) | ||
+ | </ | ||
+ | |||
+ | Cette fonction ajoute à la fin d'une liste passée en paramètre son maximum (au passage, on a apprit une nouvelle fonction, '' | ||
+ | regardons le programme suivant qui utilise cette fonction: | ||
+ | <code python> | ||
+ | x = list(range(1, | ||
+ | ajoute_max(x) | ||
+ | print(x) | ||
+ | </ | ||
+ | |||
+ | |||
+ | La {{: | ||
+ | |||
+ | ==== Modules ==== | ||
+ | |||
+ | Un //module// (aussi appelé // | ||
+ | |||
+ | <note tip>Il existe de nombreux modules, réalisant une foultitude d' | ||
+ | | ||
+ | Python fournit déjà de nombreux modules, les plus courants sont décrits là : https:// | ||
+ | |||
+ | Pour utiliser un module, il faut commencer par l' | ||
+ | |||
+ | * Importation directe du module. On mets le nom complet avant chaque appel : | ||
+ | <code python> | ||
+ | import math | ||
+ | pi_sur_deux = math.pi / 2 #PI est défini dans le module math | ||
+ | x = math.cos(pi_sur_deux) #on utilise la fonction cosinus du module math | ||
+ | </ | ||
+ | * Importation d'une méthode particulière. Ceci peut être dangereux si des fonctions différentes possèdent le même nom. | ||
+ | |||
+ | <code python> | ||
+ | from math import cos, pi # | ||
+ | x = cos(pi / 2) | ||
+ | </ | ||
+ | * Importation de toutes les fonctions du modules. | ||
+ | <code python> | ||
+ | from math import * | ||
+ | y = log(e) | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | ===== Retour sur les objets ===== | ||
+ | Comme on l'a vu les objets sont partout en python, qu'ils soient int, str, float, ou même des fonctions. | ||
+ | Si vous avec bien compris l' | ||
+ | |||
+ | Eh bien cela est tout à fait possible, exemple: | ||
+ | <code python> | ||
+ | def produit(x, y): | ||
+ | return x * y | ||
+ | |||
+ | def calcul(fonction, | ||
+ | return z + fonction(2, 17) | ||
+ | |||
+ | print(calcul(produit, | ||
+ | </ | ||
+ | |||
+ | Ce programme affichera alors 42 ! Essayez-le pour vous en persuader. | ||
+ | |||
+ | ===== Les fichiers : lecture, écriture ===== | ||
+ | <note tip> | ||
+ | |||
+ | ==== Lecture ==== | ||
+ | |||
+ | Pour lire le fichier ligne par ligne | ||
+ | <code python> | ||
+ | f = open(' | ||
+ | |||
+ | for ligne in f: | ||
+ | print(l) | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | On peut aussi compter le nombre de mots dans le texte, par exemple: | ||
+ | <code python> | ||
+ | f = open(' | ||
+ | nombre_mots = 0 | ||
+ | |||
+ | for ligne in f: | ||
+ | ligne = ligne.strip(" | ||
+ | mots = ligne.split(' | ||
+ | |||
+ | nombre_mots += len(mots) | ||
+ | |||
+ | print(nombre_mots) | ||
+ | f.close() | ||
+ | </ | ||
+ | Essayez ce code avec un fichier .txt de votre choix. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Au lieu de juste compter les mots, vous pouvez même les garder dans un [[https:// | ||
+ | |||
+ | <code python> | ||
+ | f = open(' | ||
+ | ensemble_mots = set() | ||
+ | |||
+ | for ligne in f: | ||
+ | ligne = ligne.strip(" | ||
+ | mots = ligne.split(' | ||
+ | |||
+ | ensemble_mots.update(mots) | ||
+ | |||
+ | print(ensemble_mots) | ||
+ | print(len(ensemble_mots)) | ||
+ | f.close() | ||
+ | </ | ||
+ | Ce code n'est pas parfait, par exemple, s'il y a des mots en fin de phrase par exemple, ils seront comptés en double à cause du ' | ||
+ | Ici, ce qui est compté est la longueur de l' | ||
+ | |||
+ | ==== Écriture ==== | ||
+ | |||
+ | Pour lire-écrire, | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | Utilisez ensuite la méthode write(): | ||
+ | <code python> | ||
+ | f = open(' | ||
+ | f.write(' | ||
+ | f.close()</ | ||
+ | |||
+ | ===== Bonnes pratiques ===== | ||
+ | |||
+ | Revenons un moment sur les bonnes pratiques, et notamment de la PEP8. | ||
+ | |||
+ | <note tip>PEP8 [[https:// | ||
+ | |||
+ | Voici quelques conventions de bonne pratique à mettre en place: | ||
+ | * Les indentations se font avec 4 espaces par niveau. | ||
+ | * Les imports se font librairie par librairie: www.python.org/ | ||
+ | * Pour les espaces blancs: https:// | ||
+ | * Nommer variables et fonctions: https:// | ||
+ | |||
+ | Il faut se souvenir qu'un nom doit être **clair et informatif** cela permet une relecture aisée ! | ||
+ | |||
+ | |||
+ | ===== Rédacteurs ===== | ||
+ | |||
+ | * Augustin Agbo-Kpati | ||
+ | * François Brucker | ||
+ | * Pascal Préa |