1 Manipulations de base sur les fonctions :

Documents pareils
TP 1. Prise en main du langage Python

Présentation du langage et premières fonctions

Initiation à la programmation en Python

STAGE IREM 0- Premiers pas en Python

Découverte de Python

Représentation d un entier en base b

Algorithmique et Programmation, IMA

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Initiation à l algorithmique

Cours 7 : Utilisation de modules sous python

Licence Sciences et Technologies Examen janvier 2010

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d algorithmique pour la classe de 2nde

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Calcul Formel et Numérique, Partie I

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Bases de programmation. Cours 5. Structurer les données

I. Introduction aux fonctions : les fonctions standards

Cours 1 : La compilation

Introduction à MATLAB R

ALGORITHMIQUE ET PROGRAMMATION En C

1. Structure d'un programme FORTRAN 95


Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Introduction à l informatique en BCPST

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Premiers Pas en Programmation Objet : les Classes et les Objets

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Université Paris-Dauphine DUMI2E 1ère année, Applications

Le langage C. Séance n 4

1 Recherche en table par balayage

Rappels Entrées -Sorties

Introduction au langage C

TP1. Outils Java Eléments de correction

Cours d Algorithmique et de Langage C v 3.0

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Algorithmique et programmation : les bases (VBA) Corrigé

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

1 Lecture de fichiers

Corrigé des TD 1 à 5

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Conventions d écriture et outils de mise au point

Java Licence Professionnelle CISII,

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Rappels sur les suites - Algorithme

Cours Informatique Master STEP

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Chapitre 2. Eléments pour comprendre un énoncé

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions


UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Calcul Formel et Numérique, Partie I

LES GENERATEURS DE NOMBRES ALEATOIRES

Recherche dans un tableau

Chap III : Les tableaux

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Programme Compte bancaire (code)

Programmation C++ (débutant)/instructions for, while et do...while

Maple: premiers calculs et premières applications

L informatique en BCPST

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

TP, première séquence d exercices.

Programmation Web. Madalina Croitoru IUT Montpellier

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Principes des langages de programmation INF 321. Eric Goubault

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Chapitre 2 Devine mon nombre!

MIS 102 Initiation à l Informatique

Tp 1 correction. Structures de données (IF2)

Plan du cours. Historique du langage Nouveautés de Java 7

Les chaînes de caractères

TP3 : Manipulation et implantation de systèmes de fichiers 1

Algorithmique et Programmation Fonctionnelle

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Une introduction à Java

Premiers pas avec Mathematica

TP : Gestion d une image au format PGM

Notions fondamentales du langage C# Version 1.0

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

UE Programmation Impérative Licence 2ème Année

Chapitre 2 Le problème de l unicité des solutions

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

TP1 : Initiation à Java et Eclipse

Aide - mémoire gnuplot 4.0

Programmation linéaire

Transcription:

Chapitre 4 : approfondissement sur les fonctions et les variables Table des matières 1 Manipulations de base sur les fonctions : 1 1.1 La définition d une fonction.................................. 1 1.2 L utilisation d une fonction................................... 2 1.3 Comment on peut définir une fonction avec plusieurs arguments............ 2 1.4 L importance du return.................................... 2 2 Plus de précision sur les arguments d une fonction 3 2.1 Une fonction peut très bien ne pas avoir d arguments.................. 3 2.2 Une fonction peut avoir un (des) arguments optionnels.................. 4 3 Les variables à l intérieur de la déf. d une fonction : 4 3.1 La notion de variable locale.................................. 4 3.2 La bonne cohabitation des variables locales et globales.................. 5 3.3 Comment modifier une variable globale dans la déf. d une fonction?.......... 5 3.4 Cas d un argument d une fonction............................... 6 3.4.1 L argument d une fonction est une variable LOCALE.............. 6 3.4.2 On peut utiliser et réaffecter en local l argument de la fonction......... 6 3.4.3 Mais une fonction NE PEUT PAS réaffecter son argument en global..... 6 4 Valeurs et références : davantage sur l affectation des variables 7 4.1 L identifiant mémoire ou référence.............................. 7 4.2 Un exercice sur l affectation et la copie pour les types simples.............. 7 4.3 Un exercice fondamental sur l échange de deux variables................. 7 4.4 Le cas différent de la copie des listes............................. 8 1 Manipulations de base sur les fonctions : Ce qui suit reprend ce qui a été fait au T.P. 3. 1.1 La définition d une fonction La syntaxe de définition de fonctions en Python est très simple. Si on veut définir une fonction mathématique, par exemple f x x 2 + 2x + 1, on rentrera, dans la zone d écriture de fichier de I.E.P. : def f(x): # bien noter les : obligatoires et l indentation ligne suivante return x**2+2*x+1 De même pour les années bissextiles def bissextile(annee): test=((annee%4==0) and ((annee%100!=0) or (annee%400==0)) return test Notez bien que toutes les instructions servant à la définition de la fonction sont indentées. Ce dernier code est la définition d une fonction dont le nom est bissextile qui prend un argument appelé annee, et qui retourne ou renvoie une valeur appelée test à l intérieur de la fonction. 1

1.2 L utilisation d une fonction Que faire des scripts de définition données au 1.1? On les exécute, et une fois ce script exécuté, les fonctions sont en mémoire et on peut appeler chaque fonction, autant de fois qu on veut dans le shell ou dans un autre morceau de programme pour avoir une réponse. Dans le shell, comme suit : >>> f(2) 9 >>> bissextile(2000) True >>>bissextile(2014) False Bien retenir ces trois temps : définition de la fonction, exécution du script, appels de la fonction. 1.3 Comment on peut définir une fonction avec plusieurs arguments Une fonction peut avoir plusieurs arguments (variables en entrées) et plusieurs sorties. Pour les fonctions de deux variables, par exemple, on connaît déjà la construction de tuple def f(x1,x2): return x1*x2,x1+x2 La fonction suivante agit sur une chaîne de caractères. def tiret(mot_1,mot_2): "met un tiret entre deux cha^ınes de caractères" return mot_1+"-"+mot_2 La seconde ligne sert de documentation et s obtient avec la commande help. >>> help(tiret) Help on function tiret in module main : tiret(mot_1, mot_2) met un tiret entre deux cha^ınes de caractères 1.4 L importance du return a) La fonction suivante affiche bien un résultat, sans return : def tiret2(mot_1,mot_2): print(mot_1+"-"+mot_2) Quelle différence avec tiret? C est qu on ne peut pas stocker, utiliser, le résultat de tiret2. Cette fonction tiret2 ne fait qu un affichage. Ainsi comparer : parole=tiret( bla, bla ) print(parole) bug=tiret2( bla, bla ) print(bug) Le return permet que votre fonction retourne vraiment une valeur, que vous pourrez stocker. b) L execution de la commande return provoque la sortie de la fonction, et par exemple d une boucle. On a déjà vu l algorithme suivant au chap. 3, ici on le met dans une fonction. 2

def def f(n): n=0 while 2** n <=N: n=n+1 return n Voici une autre façon de faire la même chose : f_bis (N): n=-1 while 1==1: # condition toujours vraie! On peut mettre, mieux, while True n=n+1 if 2**n>N: return n # fait sortir de la fonction donc de la boucle. 2 Plus de précision sur les arguments d une fonction Définition : Les arguments d une fonction sont les variables qui doivent/peuvent être mises en entrées pour utiliser la fonction. On a déjà vu des fonctions avec un ou plusieurs arguments. 2.1 Une fonction peut très bien ne pas avoir d arguments Comme celle-ci def sois_poli(): print( bonjour monsieur ) Noter que cette fonction ne retourne pas non plus de valeur mais fais seulement un affichage print. Ainsi >>>a=sois_poli() # ne donne pas de message d erreur mais >>> print(a) None Presque la même mais qui retourne une valeur : def je_suis_galant(): print( bonjour mademoiselle ) return un bouquet de fleur Dans ce cas, on obtient comme affichage lors de l appel de cette fonction dans le shell : >>>>> je_suis_galant() bonjour mademoiselle un bouquet de fleur Mais comme valeur de retour, on obtient : >>>a=je_suis_galant() >>>print(a) un bouquet de fleur Noter une fois encore la différence entre l affichage provoqué par l appel de la fonction dans le shell d un côté, et la valeur de retour de la fonction de l autre. 3

2.2 Une fonction peut avoir un (des) arguments optionnels Considérons l exemple suivant : def Carl_Friedrich(N=101): S=0 for i in range(n): S=S+i return S Ici, l affectation N=101 à l intérieur de la liste des arguments de Carl_Friedrich dit que : Si on appelle cette fonction sans préciser de valeur d argument, elle fera le calcul pour N=101, ainsi : >>> Carl_Friedrich() 5050 Si on appelle cette fonction en précisant une valeur d argument, on modifiera la valeur du N dans l algorithme, ainsi : >>> Carl_Friedrich(10) 45 3 Les variables à l intérieur de la déf. d une fonction : 3.1 La notion de variable locale a) Un premier exemple pour sentir ce qu est une variable locale : def fonction_bete(): a=1 print( ai-je mis la valeur,a, quelque part? ) Si on fait print(a) dans le shell, la réponse sera : L affectation a=1 n existe pas dans la mémoire du shell. Pourtant elle a existé pendant le déroulement de la fonction, puisque sinon l instruction print n aurait pas donné le résultat obtenu. C est en ce sens qu on dit que la variable a affectée pendant la définition de la fonction est une variable locale à la fonction. Les variables créées dans le code de déf. d une fonction sont dites locales. Elles occupent un espace mémoire séparé appelé espace local. b) Parallélisme avec les variables muettes des maths : dans la fonction Carl_Friedrich définies ci-dessus, la variable i est locale : c est bien l analogue de la variable de sommation en maths. On va voir, avec l exemple suivant, que la variable S est aussi locale, et cela c est plus surprenant. c) Un troisième exemple pour aller un peu plus loin : def renvoie_un(): a=1 return a Là on pourrait se dire, ah cette fois, elle renvoie a, donc si on exécuter renvoie_un() on aura a=1. Il n en est rien! La fonction retourne la valeur 1 c est tout, et la commande a=1 n a pas été opérée dans la mémoire principale. Elle a eu lieu seulement dans l espace local de la fonction, qui s est vidé à la fin de l exécution. C est le piège de la variable de retour : la valeur de la variable de retour est bien communiquée à l espace mémoire extérieur à la fonction (espace global) mais pas le nom de cette variable! 4

3.2 La bonne cohabitation des variables locales et globales a) Un code avec deux a qui cohabitent très bien : a=1 def pauvre_fonction(): a=2 return a print(pauvre_fonction()) print(a) Résultat? Moralité : Dans l espace local de la fonction, on peut utiliser une variable locale qui s appelle a en lui affectant la valeur 2 même s il existe déjà une variable globale a avec la valeur 1 dans l espace global. Ces deux affectations n interfèrent pas : A l intérieur de la déf. de la fonction, ici seule l affectation locale a=2 compte A l extérieur de la déf. de la fonction, seule l affectation globale a=1 compte. b) Quand il n y a pas de redéfinition en local de la variable, la fonction utilise la variable définie en global. Comme dans l exemple suivant : mon_pi=3.14 def perimetre(r): return 2*mon_pi*R Moralité : Lorsque l interpréteur Python doit évaluer le contenu d une variable, d un nom, il le fait suivant l ordre de priorité suivant : espace local puis espace global. d abord l espace local : il regarde si la variable a été définie localement (cf. exemple du a)). si la variable n a pas été définie localement, il regarde si la variable est définie dans l espace global comme dans perimetre. Remarque (pas essentielle ici) On peut compléter cette liste de priorité en disant que : l espace local est prioritaire sur l espace global qui est lui-même prioritaire sur l espace interne. Ce dernier espace interne est celui qui contient des noms de variables ou de fonctions déjà définies par Python et qu on peut redéfinir. 3.3 Comment modifier une variable globale dans la déf. d une fonction? On vient de voir au 3.2 b) qu on peut lire le contenu d une variable globale dans une fonction. Mais comment modifier ce contenu pour que cette modification apparaisse dans l espace global? Avec la spécification : global, comme dans l exemple suivant : pi=3.14 def ameliore_la_trigo(): global pi pi=3.1415 L exécution de cette fonction changera la variable globale pi. Pour une bonne pratique de la programmation : les variables globales devraient être réservées à des constantes du programme, qu on n a pas besoin de modifier. Il est préférable de leur donner un nom long ou en tous cas explicite. Suivant cette recommandation, la spécification global de Python ne sera pas utilisée souvent! 5

3.4 Cas d un argument d une fonction Par simplicité dans ce qui suit, on ne prend qu un argument, mais le raisonnement vaut aussi bien pour chacun des arguments d une fonction ayant plusieurs arguments. 3.4.1 L argument d une fonction est une variable LOCALE Lorsqu on définit une fonction, le nom de(s) variable(s) dans l argument est LOCAL def ajoute(x,y): return x+y Les noms de variables x et y qui apparaissent ici peuvent être utilisés ailleurs sans problème, par exemple : x=2 y=3 ajoute(5,6) print(x) print(y) 3.4.2 On peut utiliser et réaffecter en local l argument de la fonction def diminue(a): a=a-1 return a Cette fonction n utilise qu une seule variable, son argument, qui a pour nom a en local. 3.4.3 Mais une fonction NE PEUT PAS réaffecter son argument en global Que vaut a à l issue du code suivant : a=6 diminue(a) Moralité : si on veut vraiment modifier la variable a avec la fonction diminue, il faut réaffecter dans a le résultat de diminue(a) autrement dit exécuter : a=diminue(a) Avertissement : Ce qui précède doit être nuancé : si la variable a est une liste, ou plus généralement un objet mutable (modifiable), la situation est plus subtile, nous y reviendrons. Le titre de ce paragraphe est donc valable pour les arguments de type int, bool, float, str,tuple mais pas tout à fait pour les listes. Culturel pour nous à ce stade : Le fonctionnement précédent s appelle le passage par valeur. Dans le code ci-dessus, on avait une variable globale a avec comme valeur 6. Lorsqu on exécute diminue(a) le programme crée un espace mémoire local à la fonction avec une variable locale que j appellerai pour simplifier a.locale (placée à un autre endroit que la variable a précédente) et il passe la valeur de l entrée a à la variable locale a.locale. Après la variable globale a n intervient plus, en particulier elle ne peut pas être modifiée! Pour comprendre l avertissement : Il faudra déjà en dire plus sur ces objets mutables et non mutables. Mais on connaît déjà des fonctions, un peu étranges, qui opère sur les listes en les modifiant. Par exemple si L=[15,3,5] la commande del(l[1]) qui est une fonction il est vrai à la syntaxe un peu bizarre, modifie la liste L. 6

4 Valeurs et références : davantage sur l affectation des variables 4.1 L identifiant mémoire ou référence Si on rentre a=3, la variable a contient l entier 3. La commande donne l identifiant mémoire où est stocké a. Ce sera un nombre assez long... essayez... Cela nous renvoie au cours du chapitre 1 : chaque mémoire a un numéro d emplacement (son id) et un contenu (ici 3) En fait, en Python, même si on ne stocke pas un nombre dans une variable, si un nombre intervient, il lui donne une adresse mémoire. Ainsi essayez : id(3) # 3 n est pas stocké dans une variable, mais dès qu on l introduit il aura #une adresse. a=3 b=3 id(b) Ici, les noms de variables a et b pointent tous vers la même adresse mémoire qui est celle où est stockée le nombre 3. 4.2 Un exercice sur l affectation et la copie pour les types simples Exercice 1. a) Que pensez-vous que donne le programme suivant : a=3 b=a a=2 print(b) Vérifions! b) Pourquoi ce qui suit est-il révélateur de ce que fait l affectation? a=3 b=a id(b) a=2 id(b) Commentaires avec des dessins : 4.3 Un exercice fondamental sur l échange de deux variables Exercice 2. On a deux variables x et y avec un certain contenu. a) Pourquoi le code suivant ne convient-il pas? x=2 # pour fixer les idées y=3 # sur le contenu des variables x=y, # les deux variables contiennent la valeur 3 y=x 7

Dans ce qui suit on propose trois méthode assez différentes pour y arriver : b)(m1) La méthode standard en informatique, qui marche dans tous les langages de programmation est d utiliser une troisième variable, auxiliaire. Comment faire? c) (M2) Une méthode plus proche d opérations que nous ferons en mathématiques se résume dans la suite d instruction suivante : x=x+y, y=x-y, x=x-y (i) Commentez cette suite d instruction, qu obtient-on à la fin. (ii) Appliquez-la à x=1/3 et y=1/2. Que pensez-vous du résultat? d) (M3) Une méthode propre à Python : l affectation multiple A l aide de l affectation en couple vue au paragraphe sur les tuples, comment faire? 4.4 Le cas différent de la copie des listes Exercice 3. a) Reprenons le schéma de l exercice 1 mais pour deux listes. Autrement dit, considérons le code a=[1,2] b=a a[0]=3 print(a) print(b) # b est modifié comme a Quelle différence avec l exercice cité? b) Quelle raison trouver au comportement du a)? Reprendre la question de l exercice 1 b) avec le cadre du a). D une manière générale, en informatique, on dit que les objets qui se comportent comme les listes ici sont mutables ou muables. Ils peuvent changer de valeur sans changer d identifiant. A l intérieur d un objet liste, chaque objet a son identifiant... ainsi id(a[0]) lui changera dans l affectation précédente... Moralité : en faisant b=a, on crée un alias de la liste a qui restera toujours comme a quelque soient les modifications de a. Comment créer une copie un peu plus autonome? A l aide des commandes d extractions dans une liste (slicing). Exercice 4. a) Entrez le code suivant : a=[10,6,7] b=a[0:3] print(b) id(b) Que peut-on en déduire sur b si on modifie a? Le vérifier. b) Remarque : Plutôt que a[0:3], on peut taper a[:]. 8