Licence de Mathématiques Université d’Angers Année 2014-2015 tp d’ initiation à Python Python est un langage de programmation. Il favorise la programmation structurée, fonctionnelle et orientée objet. Le langage Python est placé sous une licence libre et fonctionne sur la plupart des plates-formes informatiques, de Windows à Unix en passant par Mac OS, ou encore Android. Son principal avantage est une syntaxe simple à utiliser. En effet, la syntaxe, clairement séparée des mécanismes de bas niveau, permet une initiation aisée aux concepts de base de la programmation. Ce langage est particulièrement répandu dans le monde scientifique, et possède de nombreuses extensions destinées aux applications numériques. Depuis 2013, il est enseigné à tous les étudiants de classes préparatoires scientifiques dans le cadre du tronc commun (informatique pour tous). Son utilisation en statistique est devenue monnaie courante, grâce notamment à la distribution Anaconda. Mise en route, synthaxe Pour se familiariser avec le langage, voici quelques instructions Python. print "Bienvenue dans le langage Python !" ma_variable=10+1 print ma_variable mon_int=7 mon_float=1.23 mon_bool=True un_carre=3**2 13/3 13%3 13./3 nom="Brian" nom[0] len(nom) print nom+" est un ami" print "2 et 2 font "+str(4) 2==3 2!=3 2<3 liste1=range(10) liste1[2:4] liste1[2:6:2] liste1[:4] liste1[::2] liste1.append(20) liste1.pop(3) del(liste1[2]) liste2=[x**2 for x in liste1] liste3=[x**2 for x in liste1 if x%2==0] reponse=raw_input("Gauche ou Droite ? ") reponse Indentation, blocs, conditions Une des particularités du langage Python est la suivante : les blocs sont identifiés par l’indentation, au lieu d’accolades comme en R. Une augmentation de l’indentation marque le début d’un bloc, et une réduction de l’indentation marque la fin du bloc courant, comme dans l’exemple suivant : 1 def spam(): oeufs = 12 return oeufs print spam() Une autre exemple avec une condition if : reponse = "Paradis" if reponse == "Paradis": print "Bienvenue au Paradis !" Un dernier exemple avec une boucle for : liste=range(1,11) for element in liste: print element**2 Gestion des modules Un module est un fichier ayant pour extension .py et qui contient des définitions de constantes/fonctions/classes. Tout programmeur Python peut réaliser un module. Il existe de nombreux modules dans la distribution Anaconda comme par exemple math, fractions, random ou encore time. Pour importer un module, il existe plusieurs méthodes. La plus simple (et conseillée) est d’utiliser import. Toutes les constantes/fonctions/classes de votre module sont importées. Par contre, leur utilisation doit être précédée d’un préfixe : import math math.sqrt(2) math.exp(2) Une autre solution est d’utiliser la commande from (pas besoin de préfixe pour les fonctions constantes/fonctions/classes importées) : from math import sqrt,cos,pi sqrt(2) cos(pi/4) On peut aussi utiliser la commande from module import * qui importe toutes les fonctions du modules. La commande dir() renseigne tous les modules chargés alors que dir(module) affiche toutes les fonctions de module. Pour obtenir de l’aide sur un module ou sur une fonction d’un module, utiliser la commande help(module) ou help(module.fonction). Exercices préliminaires 1. Compléter le code à trou pour construire la fonction signe: def signe(x): if return 1 elif return -1 else: return 0 print signe(4) 2. Ecrire un petit programme homme/machine (H/M) nommé clinique() qui : (a) souhaite à H la bienvenue dans la clinique 2 (b) demande à H de choisir entre la porte de droite et la porte de gauche (si l’utilisateur choisi la porte de gauche, il se trouve dans la salle d’attente et s’il choisi la porte de droite, il se trouve dans la salle d’opération). (c) communique à H sa situation (salle d’attente ou salle d’opération) avec dans le deuxième cas le message suivant : sortez vite ! 3. Le problème de Syracuse : on part d’un nombre entier plus grand que zéro ; s’il est pair, on le divise par 2 ; s’il est impair, on le multiplie par 3 et on ajoute 1. En répétant l’opération, on obtient une suite d’entiers positifs dont chacun ne dépend que de son prédécesseur. La conjecture de Syracuse, encore appelée conjecture de Collatz, conjecture d’Ulam, conjecture tchèque ou problème 3x+1 est l’hypothèse mathématique selon laquelle la suite de Syracuse de n’importe quel entier strictement positif atteint 1. Après que le nombre 1 a été atteint, la suite des valeurs (1,4,2,1,4,2. . . ) se répète indéfiniment en un cycle de longueur 3, appelé cycle trivial. En dépit de la simplicité de son énoncé, cette conjecture défie depuis de nombreuses années les mathématiciens. Paul Erdős a dit à propos de la conjecture de Syracuse : « les mathématiques ne sont pas encore prêtes pour de tels problèmes ». Faisons alors un peu d’algorithmique. (a) Ecrire une fonction syracuse(entier) qui retourne la suite de Syracuse de entier. (b) La carte d’identité d’un entier est définie par sa trajectoire (i.e. sa suite de Syracuse), sa durée de vol (le nombre d’entier avant d’atteindre 1), et son altitude (l’entier maximal dans sa trajectoire). Proposer une procedure qui affiche une telle carte, et trace la trajectoire. Pour cela, importer le module pylab et utiliser la fonction plot(), puis show(). (c) ? Ecrire une fonction tri(liste) qui tri une liste d’entier par altitude décroissante. 4. On va faire un peu de statistique avec le module random : (a) Importer le module random puis générer un échantillon gaussien N (µ, σ 2 ) de taille n = 100 avec µ = 10 et σ = 2 grâce à la fonction gauss(). (b) Ecrire une fonction moyenne(data), puis une fonction variance(data) et ecarttype(data) qui calcule la moyenne/variance/écart type d’un échantillon data. Utiliser les listes en compréhension. (c) On va tester le générateur aléatoire d’un échantillon gaussien sous Python. Pour cela, on rappelle une propriété essentielle de l’estimateur de la variance Sn2 : si X1 , . . . , Xn est un échantillon i.i.d. de loi N (µ, σ 2 ), alors l’estimateur de la variance : n Sn2 := 1X (Xi − X̄n )2 n i=1 a pour espérance (n − 1)σ 2 /n. i. Créer M = 10000 échantillon gaussien de taille n = 5 de moyenne µ = 4 et de variance σ 2 = 2. ii. Calculer une estimation de l’espérance de la variance empirique grâce aux M = 10000 échantillons. Retrouve-t-on la propriété décrite ci-dessus ? (d) Sur les 100 000 électeurs d’une ville, 45700 s’apprêtent à voter pour le maire sortant, mais celui-ci ne le sait pas. Alors il commande un sondage, et l’institut de sondage constitue un échantillon de 100 habitants sur lesquels 52 disent vouloir voter pour le maire. Fou de joie, celui-ci achète le champagne pendant la campagne, avant les élections, et se fait battre lors des élections. Il accuse l’institut de sondage d’avoir triché. i. Construisez une liste de "pour" et de "contre" représentant les 100000 électeurs de la ville en question à l’aide de la fonction shuffle. ii. Estimer la probabilité que sur un échantillon de taille 100, la majorité des électeurs votent en faveur du maire sortant. iii. Répéter le processus pour un échantillon de taille 1000. 3