# Programmation Python/Exercices sur les bases du langage
## Partie 1 - Introduction

* Avant-propos à l'attention des non-programmeurs
* Introduction
* Installation
* Éditeurs
* Programmer en deux minutes
** une messagerie instantanée
** un programme interfacé avec Wikipédia
** un serveur Web

## Partie 2 - Le langage

* Afficher un texte
* Structure d'un programme
* Variables
* Opérateurs
* Structures de contrôle
* Instructions répétitives
* Types
** Numériques
** Booléens
** Chaines de caractères
** Listes
** Tuples
** Dictionnaires
** Dates
** Ensembles
* Fonctions
* Modules
* Exercices
** Palindrome
* Regex
* Programmation orientée objet pour les non-programmeurs
* Classes
* Classes et Interfaces graphiques
* Fichiers
* Exceptions
* Bases de données
** Gestion
* L'interface CGI
* Applications web
* Réseau
* Threads

## Partie 3 - Les bibliothèques

* Bibliothèques pour Python
* L'interface graphique
* Utilisation de fenêtres et de graphismes
** Tkinter
** Widgets
** Turtle
* Les threads
* XML
* JSON
* Tests
* Analyse statique de programmes
* Fabric
* Le Web
** Django
** Karrigell
** Aiohttp

## Partie 1 - Introduction

* Avant-propos à l'attention des non-programmeurs
* Introduction
* Installation
* Éditeurs
* Programmer en deux minutes
** une messagerie instantanée
** un programme interfacé avec Wikipédia
** un serveur Web

## Partie 2 - Le langage

* Afficher un texte
* Structure d'un programme
* Variables
* Opérateurs
* Structures de contrôle
* Instructions répétitives
* Types
** Numériques
** Booléens
** Chaines de caractères
** Listes
** Tuples
** Dictionnaires
** Dates
** Ensembles
* Fonctions
* Modules
* Exercices
** Palindrome
* Regex
* Programmation orientée objet pour les non-programmeurs
* Classes
* Classes et Interfaces graphiques
* Fichiers
* Exceptions
* Bases de données
** Gestion
* L'interface CGI
* Applications web
* Réseau
* Threads

## Partie 3 - Les bibliothèques

* Bibliothèques pour Python
* L'interface graphique
* Utilisation de fenêtres et de graphismes
** Tkinter
** Widgets
** Turtle
* Les threads
* XML
* JSON
* Tests
* Analyse statique de programmes
* Fabric
* Le Web
** Django
** Karrigell
** Aiohttp
[ Modifier le sommaire ]

## Révision

Dans ce qui suit, nous n'allons pas apprendre de nouveaux concepts mais simplement utiliser tout ce que nous connaissons déjà pour réaliser de vrais petits programmes.

### Contrôle du flux - Utilisation d'une liste simple

Commençons par un petit retour sur les branchements conditionnels (il s'agit peut-être là du groupe d'instructions le plus important dans n'importe quel langage !) :
La ligne suivante, par contre (celle qui contient la deuxième instruction if) n'est pas indentée. Cette ligne se situe donc au même niveau que celles qui définissent le corps principal du programme. L'instruction contenue dans cette ligne est donc toujours exécutée, alors que les deux suivantes (qui constituent encore un autre bloc) ne sont exécutées que si la condition nn[2] > max est vraie. En suivant la même logique, on voit que les instructions des deux dernières lignes font partie du bloc principal et sont donc toujours exécutées.

### Boucle while - Instructions imbriquées

Continuons dans cette voie en imbriquant d'autres structures :
Nous retrouvons ici une boucle while, associée à un groupe d'instructions if, elif et else.
L'instruction while est utilisée ici pour relancer le questionnement après chaque réponse de l'utilisateur (du moins jusqu'à ce que celui-ci décide de « quitter » en entrant une valeur nulle : rappelons à ce sujet que l'opérateur de comparaison != signifie « est différent de »). Dans le corps de la boucle, nous trouvons le groupe d'instructions if, elif et else (de la ligne 6 à la ligne 16), qui aiguille le flux du programme vers les différentes réponses, ensuite une instruction print et une instruction input (lignes 17 & 18) qui seront exécutées dans tous les cas de figure : notez bien leur niveau d'indentation, qui est le même que celui du bloc if, elif et else, Après ces instructions, le programme boucle et l'exécution reprend à l'instruction while (ligne 5). Les deux dernières instructions print (lignes 19 & 20) ne sont exécutées qu'à la sortie de la boucle.
Exercices
* Que fait le programme ci-dessous, dans les quatre cas où l'on aurait défini au préalable que la variable a vaut 1, 2, 3 ou 15 ? if a !=2: print 'perdu' elif a ==3: print 'un instant, s.v.p.' else : print 'gagné'
* Que font ces programmes ? a = 5 b = 2 if (a==5) & (b<2): print '"&" signifie "et"; on peut aussi utiliser le mot "and"' a, b = 2, 4 if (a==4) or (b!=4): print 'gagné' elif (a==4) or (b==4): print 'presque gagné' a = 1 if not a: print 'gagné' elif a: print 'perdu'
* Reprendre le programme c) avec a = 0 au lieu de a = 1. Que se passe-t-il ? Conclure !
* Écrire un programme qui, étant données deux bornes entières a et b, additionne les nombres multiples de 3 et de 5 compris entre ces bornes. Prendre par exemple a = 0, b = 32 ® le résultat devrait être alors 0 + 15 + 30 = 45. Modifier légèrement ce programme pour qu'il additionne les nombres multiples de 3 ou de 5 compris entre les bornes a et b. Avec les bornes 0 et 32, le résultat devrait donc être : 0 + 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 + 20 + 21 + 24 + 25 + 27 + 30 = 225.
* Déterminer si une année (dont le millésime est introduit par l'utilisateur) est bissextile ou non. (Une année A est bissextile si A est divisible par 4. Elle ne l'est cependant pas si A est un multiple de 100, à moins que A ne soit multiple de 400).
* Demander à l'utilisateur son nom et son sexe (M ou F). En fonction de ces données, afficher « Cher Monsieur » ou « Chère Mademoiselle » suivi du nom de l'élève.
* Demander à l'utilisateur d'entrer trois longueurs a, b, c. À l'aide de ces trois longueurs, déterminer s'il est possible de construire un triangle. Déterminer ensuite si ce triangle est rectangle, isocèle, équilatéral ou quelconque. Attention : un triangle rectangle peut être isocèle.
* Demander à l'utilisateur qu'il entre un nombre. Afficher ensuite : soit la racine carrée de ce nombre, soit un message indiquant que la racine carrée de ce nombre ne peut être calculée.
* Convertir une note scolaire N quelconque, entrée par l'utilisateur sous forme de points (par exemple 27 sur 85), en une note standardisée suivant le code suivant : NoteAppréciation N >= 80 %A 80 % > N >= 60 %B 60 % > N >= 50 %C 50 % > N >= 40 %D N < 40 %E
* Soit la liste suivante : ['Jean-Michel', 'Marc', 'Vanessa', 'Anne', 'Maximilien', 'Alexandre-Benoît', 'Louise'] Ecrivez un script qui affiche chacun de ces noms avec le nombre de caractères correspondant.
* Écrire une boucle de programme qui demande à l'utilisateur d'entrer des notes d'élèves. La boucle se terminera seulement si l'utilisateur entre une valeur négative. Avec les notes ainsi entrées, construire progressivement une liste. Après chaque entrée d'une nouvelle note (et donc à chaque itération de la boucle), afficher le nombre de notes entrées, la note la plus élevée, la note la plus basse, la moyenne de toutes les notes.
* Ecrivez un script qui affiche la valeur de la force de gravitation s'exerçant entre deux masses de 10000 kg , pour des distances qui augmentent suivant une progression géométrique de raison 2, à partir de 5 cm (0,05 mètre). La force de gravitation est régie par la formule $F=6,67\times 10^{-11}\times {\frac {m\times m'}{d^{2}}}$ Exemple d'affichage : d = .05 m : la force vaut 2.668 N d = .1 m : la force vaut 0.667 N d = .2 m : la force vaut 0.167 N d = .4 m : la force vaut 0.0417 N etc.
Solution
* Réfléchissez !
* Réfléchissez !
* Réfléchissez !
* # Traitement de nombres entiers compris entre deux limites print "Veuillez entrer la limite inférieure :", a = input print "Veuillez entrer la limite supérieure :", b = input s = 0 # somme recherchée (nulle au départ) # Parcours de la série des nombres compris entre a et b : n = a # nombre en cours de traitement while n <= b: if n % 3 ==0 and n % 5 ==0: # variante : 'or' au lieu de 'and' s = s + n n = n + 1 print "La somme recherchée vaut", s
* # Années bissextiles print "Veuillez entrer l'année à tester :", a = input if a % 4 != 0: # a n'est pas divisible par 4 -> année non bissextile bs = 0 else: if a % 400 ==0: # a divisible par 400 -> année bissextile bs = 1 elif a % 100 ==0: # a divisible par 100 -> année non bissextile bs = 0 else: # autres cas ou a est divisible par 4 -> année bissextile bs = 1 if bs ==1: ch = "est" else: ch = "n'est pas" print "L'année", a, ch, "bissextile." Variante (proposée par Alex Misbah) : a=input('entrée une année:') if (a%4==0) and ((a%100!=0) or (a%400==0)): print a,"est une année bissextile" else: print a,"n'est pas une année bissextile" Variante (de Mik) a=input('année:') if (a%4==0 and a%100!=0)or(a%400==0): print "bi6" else: print "nbi6"
* Réfléchissez !
* from sys import exit # module contenant des fonctions système print """ Veuillez entrer les longueurs des 3 côtés (en séparant ces valeurs à l'aide de virgules) :""" a, b, c = input # Il n'est possible de construire un triangle que si chaque côté # a une longueur inférieure à la somme des deux autres : if a < (b+c) and b < (a+c) and c < (a+b) : print "Ces trois longueurs déterminent bien un triangle." else: print "Il est impossible de construire un tel triangle !" exit # ainsi l'on n'ira pas plus loin. f = 0 if a == b and b == c : print "Ce triangle est équilatéral." f = 1 elif a == b or b == c or c == a : print "Ce triangle est isocèle." f = 1 if a*a + b*b == c*c or b*b + c*c == a*a or c*c + a*a == b*b : print "Ce triangle est rectangle." f = 1 if f == 0 : print "Ce triangle est quelconque." Variante (de Mik) a,b= input('a:'),input('b:') if b>a: print '"c":](',b-a,');(',a+b,')[' else: print '"c":](',a-b,');(',a+b,')[' c=input('c:') if a < (b+c) and b < (a+c) and c < (a+b) : print 'bien un triangle' else: print 'impossible constrution triangle' exit if a>b and a>c: max=a x=c*c+b*b elif b>a and b>c: max=b x=c*c+a*a elif c>b and c>a: max=c x=a*a+b*b if a==b and b==c : print "triangle équilatéral." elif a==b or b==c or c==a : print "triangle isocèle." elif x==max**2 : print "triangle rectangle." else: print "triangle quelconque."
* Réfléchissez !
* Réfléchissez !
* Réfléchissez !
* # Notes de travaux scolaires notes = # liste à construire n = 2 # valeur positive quelconque pour initier la boucle while n >= 0 : print "Entrez la note suivante, s.v.p. : ", n = float(raw_input) # conversion de l'entrée en un nombre réel if n < 0 : print "OK. Terminé." else: notes.append(n) # ajout d'une note à la liste # Calculs divers sur les notes déjà entrées : # valeurs minimale et maximale + total de toutes les notes. min = 500 # valeur supérieure à toute note max, tot, i = 0, 0, 0 nn = len(notes) # nombre de notes déjà entrées while i < nn: if notes[i] > max: max = notes[i] if notes[i] < min: min = notes[i] tot = tot + notes[i] moy = tot/nn i = i + 1 print nn, "notes entrées. Max =", max, "Min =", min, "Moy =", moy
* Réfléchissez !

## Exercices
### Exercice 1

Écrire un programme qui affiche "Bonjour le monde".
* Solution
* print ("Bonjour le monde")

### Exercice 2

Écrire un programme qui permet de saisir le nom de l'utilisateur et de renvoyer "Bonjour", suivi de ce nom.
(3 solutions possibles)
* Solution 1
* nom = input ("Quel est votre nom ? ")
* print ("Bonjour", nom)
* Solution 2
* print ("Bonjour", input ("Quel est votre nom ? "))
* Solution 3
* name = input("Quel est votre nom ? ")
* print("Bonjour " + name + "!")

### Exercice 3

Écrire un programme qui demande à l'utilisateur la saisie de a et b et affiche la somme de a et de b.
* Solution
* a = input ("Valeur de a : ")
* b = input ("Valeur de b : ")
* a= int (a)
* b= int (b)
* print ("Somme de a+b = ",a+b)
* En version 3.1 cela pourrait être
* var_a = int(input("Donnez moi la valeur de a: "))
* var_b = int(input("Donnez moi la valeur de b: "))
* print("Voici le résultat de a + b :" , var_a + var_b , "!")

### Exercice 4

Écrire un programme qui demande à l'utilisateur son année de naissance et qui affiche son âge. L'année courante sera mise dans une variable.
* Solution
* # Ce script ne gère pas si l'anniversaire est passé ou non d'où le "environ"
* annee_courante = 2016
* print ("Quelle est votre année de naissance ?")
* reponse = raw_input
* print ("Vous avez environ", annee_courante- int(reponse),"ans")
* Pour Python 3.1
* # Ce script gère si l'anniversaire est passé
* from datetime import datetime
* dn=input('Votre date de naissance ? (format jj/mm/aaaa) :')
* dn=dn.split('/');jn=int(dn[0]);mn=int(dn[1]);an=int(dn[2])
* da=datetime.now
* if mn<da.month or (mn==da.month and jn<=da.day):
* age=da.year-an
* else:
* age=da.year-an-1
* print('Vous avez',age,'ans.')

### Exercice 5

Écrire un programme qui demande à l'utilisateur les coordonnées de deux points dans le plan et qui calcule puis affiche la distance entre ces deux points selon la formule : $d={\sqrt {(x_{2}-x_{1})^{2}+(y_{2}-y_{1})^{2}}}$
* Solution
* import math
* print ("xA?")
* xA = int(raw_input)
* print ("yA?")
* yA = int(raw_input)
* print ("xB?")
* xB = int(raw_input)
* print ("yB?")
* yB = int(raw_input)
* print ("distance entre A et B:", math.sqrt( (xA-xB)**2 + (yA-yB)**2))
* En version 3.1
* import math
* xA = int(input("Donnez moi Xa"))
* yA = int(input("Donnez moi Ya"))
* xB = int(input("Donnez moi Xb"))
* yB = int(input("Donnez moi Yb"))
* distance = math.sqrt((xB - xA)**2 + (yB - yA)**2)
* print("Bonjour, la distance qui sépare les deux points est de " + str(distance))