## page was renamed from Supports/InitiationPython3 #acl Formateurs:read,write,revert All:read = Initiation à Python 3 = Le langage de programmation fixé comme référence pour cette année de formation, est Python, en version 3. Ce premier TP a pour but de vous donner des bases de programmation suffisantes pour transcrire n’importe quel algorithme travaillant sur des types de données simples : nombres, chaînes de caractères et listes. Il ne s’agit pas d’être virtuose, mais simplement que le langage ne soit pas un obstacle à la mise en pratique. Si vous connaissez déjà bien Python, ne vous attardez pas trop. Le choix de l’environnement de développement (ici IDLE) n’est qu’une suggestion : faites comme à la maison. Si vous connaissez déjà un autre langage de programmation, c’est l’occasion d’en découvrir un nouveau, peut-être assez différent. Dans ces deux cas, ce sujet ne devrait pas trop poser de problème, et vous pourrez vous attaquer à un authentique TP de programmation dès la première séance. Et si c’est votre premier contact avec la programmation, pas d’inquiétude, on avancera pas à pas. <> == Lancer un interpréteur == {{{#!wiki tip Si ce n’est déjà fait, il faut bien sûr commencer par installer Python : * si vous travaillez sous Windows ou Mac, les fichiers nécessaires sont accessibles sur le site [[http://www.python.org/]] : choisir la dernière version stable (actuellement 3.3.0) ; * sous GNU/Linux, installez simplement les paquets python3 et idle3 en utilisant le gestionnaire de paquet de votre distribution. Avec un peu de chance, ces instructions sont inutiles dans la salle informatique du site de formation. :-) }}} Un programme Python est un simple fichier de texte qui contient les instructions à faire exécuter par la machine, ou plutôt l’interpréteur Python. Par exemple : {{{#!highlight python def bonjour(nom): print("Bonjour",nom,"!") nom = input("Comment vous appelez-vous ? ") bonjour(nom) }}} On pourrait donc se contenter de taper ce code source dans un éditeur de texte (ce qui est différent d’un logiciel de traitement de texte), puis le faire exécuter par l’interpréteur. Mais l’interpréteur peut également être utilisé de manière interactive. C’est ce que nous ferons pour les premiers pas qui suivent. Lançons donc l’environnement graphique IDLE. On se retrouve devant une fenêtre comme celle-ci : {{attachment:IDLE.png}} L’invite {{{>>>}}} nous… invite à taper des instructions Python. Ce que nous allons nous empresser de faire. == Python comme calculatrice == Lorsque vous tapez une instruction, l’interpréteur affiche la valeur éventuellement produite. Par exemple : {{{#!highlight python >>> 42 42 }}} (j’ai tapé « {{{42}}} », puis fait « Entrée » et l’interpréteur a affiché {{{42}}}). On peut bien sûr former des expressions arithmétiques plus compliquées. Testez par exemple les expressions suivantes et essayez de deviner ce que ça calcule, si possible avant de le taper : {{{#!highlight python 21+21 32*(42+10) 2**3 2**4 2**5 2.5*2 2/3 1/1 2//3 13.0//6 13%6 1//1 }}} Si vous connaissez Python 2, certains des résultats précédents vous ont peut-être surpris. On les expliquera sur place. Et si vous avez le moindre doute sur ce qui vient de se passer, il faut le dire ! {{{#!wiki tip À tout moment, vous pouvez revenir sur une ligne précédente et appuyer sur « Entrée » pour recopier automatiquement son contenu : pratique quand on a fait une erreur de frappe ou quand on tape des lignes un peu répétitives. }}} Plus étonnant peut-être : {{{#!highlight python 100**100 100**100-100**99 100.0**100 100.0**100-100**99 2**2**2 2**2**2**2 2**2**2**2**2 # C’est peut-être un peu risqué ! 2**2**2**2**2**2 # À tous les coups ça plante… }}} {{{#!wiki tip Si le programme a l’air bloqué, vous pouvez interrompre l’exécution avec la combinaison de touches « `Ctrl+C` ». }}} {{{#!wiki important À ce stade, que pouvez-vous dire de la manière dont Python 3 gère les nombres ? }}} === Python comme calculatrice scientifique === On n’est bien sûr pas limités aux opérations arithmétiques. Python est en fait un langage assez prisé dans le monde du calcul scientifique moderne, en particulier parce qu’il fournit des bibliothèques de calcul aux fonctionnalités avancées. Il n’en sera pas question ici, mais on peut déjà trouver pas mal de choses dans la bibliothèque standard. Essayez ce qui suit : {{{#!highlight python from math import * # On fait ici un peu de magie, qui sera expliquée plus tard dans l’année pi log(1) log(e) cos(pi/3) log(1024,2) }}} == Chaînes de caractères == Bien sûr Python n’est pas limité au calcul numérique : le cœur de l’informatique moderne (disons à partir des années 70), ce sont les chaînes de caractères. En Python, une chaîne littérale est indifféremment entourée d’apostrophes droites « `'` » ou de guillemets droits « `"` ». Tentons un laconique : {{{#!highlight python 'Bonjour.' }}} Notez que les apostrophes restent présentes dans la sortie : l’interpréteur nous signale que nous avons bien construit une chaîne. Pour afficher une chaîne, on utilise l’instruction `print` : {{{#!highlight python print('Bonjour.') }}} Vous voyez la différence ? L’opération de base sur les chaînes est la concaténation : {{{#!highlight python 'Bon' + 'jour.' }}} Oui, ça se note comme une somme. On peut aussi calculer la longueur d’une chaîne : {{{#!highlight python len('Bon' + 'jour.') }}} Notez que Python 3 n’est pas inquiété par tous les caractères bizarres que vous pourrez entrer : {{{#!highlight python print('Considérons la fonction φ : x ↦ x³.') len('1 €') }}} (par contre, votre navigateur peut l’être). Ces deux dernières lignes en étonneront peut-être certains (qui savent que les caractère dits bizarres sont souvent codés sur plusieurs octets) : les caractères de Python 3 sont ceux de la norme Unicode. == Variables et types == On a vu qu’un élément essentiel de l’écriture d’algorithmes est la possibilité de stocker des informations intermédiaires dans des ''variables'' : cette notion est omniprésente en programmation. En Python, le nom d’une variable est nécessairement constitué de caractères alphanumériques, plus éventuellement le caractère « souligné » `_`. Le premier caractère doit être une lettre. Des exemples : {{{ x x1 ma_variable_preferee }}} L’affectation d’une valeur à une variable est notée par le signe d’égalité « `=` », un choix mathématiquement regrettable mais assez répandu. Essayons : {{{#!highlight python x = 32 y = 52 somme = x+y produit = x*y }}} On peut afficher une valeur numérique de la même manière qu’une chaîne : {{{#!highlight python print(somme) print(produit) }}} Et on peut afficher plusieurs choses sur la même ligne : {{{#!highlight python print('x :',x,'y :',y,'Somme :',somme,'Produit :',produit) }}} Continuons : {{{#!highlight python x = -1 print('x :',x,'y :',y,'Somme :',somme,'Produit :',produit) }}} {{{#!wiki important Quelles remarques pouvez-vous déjà faire sur l’utilisation des variables en Python ? Pouvez-vous expliquer ce qui se passe ? }}} Continuons : {{{#!highlight python x = 'Ceci est une chaîne !' print('x :',x,'y :',y,'Somme :',somme,'Produit :',produit) }}} Le résultat vous surprend peut-être : la variable `x` était d’abord un nombre, voilà que c’est une chaîne. Pourtant, pas de message d’erreur ! On pourrait croire que Python ignore l’information de type. C’est plus subtil. En Python, toute ``valeur`` a un type bien déterminé. D’ailleurs, l’interpréteur peut nous le donner : {{{#!highlight python type(1) type(0.5) type('a') type('un mot') type('€uro') }}} Par contre les variables ne sont pas typées a priori : une variable n’est qu’un `nom` auquel on peut associer temporairement une valeur, de type quelconque. {{{#!highlight python x=1 type(x) x='a' type(x) }}} En particulier, en Python, ''on ne déclare pas les variables''. De plus, les opérations sont surchargées : on a vu que le `+` est défini entre deux nombres ou entre deux chaînes, et que le type de retour pouvait être adapté. Tentons : {{{#!highlight python print('Le résultat est '+42) }}} Que se passe-t-il ? Ce cas n’est pas visiblement pas prévu. Il est facile de convertir un nombre en la chaîne qui le représente, et réciproquement : {{{#!highlight python str(42) int('100') float('1') }}} On peut aussi forcer la conversion entre types de nombres de la même manière : {{{#!highlight python float(1) int(100.0**100) }}} Une utilisation standard : {{{#!highlight python entree = input('Entrez un nombre entier N : ') N = int(entree) print('N² = '+str(N*N)) }}} == Booléens == Un dernier type de base, que nous n’avons pas encore croisé : les booléens. C’est le type à deux valeurs : vrai et faux. {{{#!highlight python True False type(True) }}} On fabrique des booléens avec des tests : {{{#!highlight python 1 > 0 1 < 0 1 == 0 # Attention, on double le signe = pour le distinguer de l’affectation 'a' == 'b' 'a' + 'a' == 'aa' }}} Et on peut les composer via les opérations booléennes `and`, `or`, `not` : {{{#!highlight python 'toto' == '' or len('toto') > 2 }}} == Algorithmique de base == Jusque là, on a parlé des opérations de base du calcul. Reste à introduire l’algorithmique à proprement parler. Le branchement conditionnel prend la forme `if `''condition''`: `''instruction''. Vous pouvez deviner ce que fait : {{{#!highlight python if x<0: x=-x }}} Si le branchement comprend une alternative, on utilise `else` : {{{#!highlight python if x<0: y=0 else: y=x }}} Si plusieurs instructions doivent suivre, on les met à la ligne '''''en respectant l’indentation''''' : {{{#!highlight python a, b, c = 1, -2, 1 # On utilise un raccourci pour l’affectation simultanée de plusieurs variables b = -b / 2 delta = b * b - a * c if delta > 0: n = 2 x1 = (b - sqrt(delta)) / a x2 = (b + sqrt(delta)) / a else: if delta == 0: n = 1 x = b/a else: n = 0 }}} Cette convention trouble souvent les programmeurs de langages comme C ou Java. Elle a pourtant le mérite d’être concise, lisible et d’éviter la frappe de délimiteurs. La structure `else: if:` imbriquée, peut-être abrégée en `elif`, ce qui économise un niveau d’indentation : {{{#!highlight python if delta > 0: n = 2 x1 = (b - sqrt(delta)) / a x2 = (b + sqrt(delta)) / a elif delta == 0: n = 1 x = b/a else: n = 0 }}} La boucle ''tant que'' s’écrit naturellement sur le même modèle `while `''condition'': {{{#!highlight python n = 0 while n<10: print(n) n = n+1 }}} == Fonctions et procédures == La programmation ne se réduit pas à l’algorithmique : il est essentiel de pouvoir faire référence à des morceaux de programmes déjà écrits, sans devoir les recopier ! C’est le rôle des procédures (des suites d’instructions auxquelles ont donne un nom) et des fonctions (la même chose, mais qui renvoie un résultat). En Python, on les introduit au moyen de la construction `def`: {{{#!highlight python def f (x1, x2, ...): ... des instructions ... return resultat }}} définit une nouvelle fonction qui, partant des valeurs initiales de `x1, x2, ...` effectue les instructions requises, et renvoie la valeur de l’expression `resultat`. Si on n’utilise pas l’instruction `return` finale, ça fonctionne aussi sauf que rien n’est renvoyé (cas d’une procédure). Exemples : {{{#!highlight python def discriminant(a,b,c): return b * b - a * c def resout (a,b,c): b = -b / 2 delta = discriminant(a,b,c) if delta > 0: n = 2 x = (b - sqrt(delta)) / a y = (b + sqrt(delta)) / a elif delta == 0: n = 1 x = b/a else: n = 0 print('Nombre de solutions : ' + str(n) + '.') if n > 0: print(' x = ' + str(x)) if n == 2: print(' y = ' + str(y)) }}} Essayez la chose suivante : {{{#!highlight python def incremente(a): a = a+1 print('Nouvelle valeur de a : '+str(a)) a = 1 incremente(a) print(a) }}} {{{#!wiki important Que se passe-t-il ? Que pouvez-vous dire sur la ''portée'' des variables en Python ? Quelles autres expériences proposez-vous pour mieux comprendre ? }}} == Listes, chaînes, n-uplets == On a déjà décrit le cœur algorithmique, les opérations sur les types de base et le mécanisme d’affectation des variables. Légitimement, on pourrait s’arrêter là : on a déjà un modèle de calcul complet, (en un sens qui sera formalisé l’année prochaine). Mais Python, comme tout langage contemporain, nous permet de composer ces types de base en introduisant des types dits séquentiels : listes et n-uplets. Ceux-ci rassemblent un nombre quelconque de valeurs au sein d’un même objet composé. On forme un n-uplet avec des parenthèses : {{{#!highlight python z = (1,2,3) }}} une liste avec des crochets : {{{#!highlight python l = ['a','b','c'] }}} En fait, les parenthèses ne sont pas nécessaires autour d’un n-uplet : c’est la virgule qui sert de constructeur. {{{#!highlight python zz = 1,2,3 z == zz }}} On accède aux éléments d’une séquence avec les crochets : {{{#!highlight python print(z[1]) print(l[0]) print(l[1]) print(l[2]) print(l[3]) }}} Que remarquez-vous ? On peut concaténer les séquences avec le `+`, comme dans : {{{#!highlight python l = l + ['d'] }}} La différence entre les deux types, c’est qu’on peut changer les éléments d’une liste, mais pas ceux d’un n-uplet : {{{#!highlight python l[0] = 'A' z[0] = '0' }}} On dit que les éléments d’une liste sont ''mutables''. En fait, les chaînes de caractères sont en partie de la même nature que les n-uplets : ce sont des suites… de caractères. Et on ne peut pas les changer. {{{#!highlight python s = 'Bonjour.' s[0] s[0]='b' }}} La boucle `for` de Python permet de répéter un bloc d’instructions pour chacun des éléments d’une séquence. Par exemple : {{{#!highlight python for k in 1,2,3: print(k) s = '' for k in 'Un truc.': s = s + k + k print(s) }}} En fait, on peut librement mélanger les types au sein d’une séquence : {{{#!highlight python for k in 1, 'a', 100.0**.5 : print(k) }}} Et on peut même imbriquer les séquences : {{{#!highlight python def mat22 (a,b,c,d): return((a,b),(c,d)) M=mat22(1,2,3,4) M[1][0] def affiche22 (M): for l in M: print(l) affiche22(M) }}} La fonction `range`, très souvent utile, permet de générer une valeur qui se comporte comme une liste d’entiers consécutifs. Essayez-la : {{{#!highlight python for i in range(10): print(i) for i in range(1,10): print(i) }}} Notez que certains arguments des fonctions fournies par Python peuvent être optionnels. Pour l’instant, on s’en tiendra à la non-explication « magique »: `range` peut recevoir un ou deux arguments, et `print` peut en recevoir un nombre quelconque. == Méthodes == Cette section traite d’un sujet qu’on peut considérer comme avancé, même si c’est un peu saugrenu pour un TP d’initiation : les ''méthodes''. C’est tout-à-fait dispensable en théorie : les éléments traités ci-dessus suffisent pour répondre à tous les problèmes d’algorithmique. Mais on peut difficilement s’intéresser à Python sans aborder le sujet : la plupart des petites choses qui rendent la programmation Python agréable (Python est réputé « piles incluses ») sont accessibles via les méthodes des types de base. Mais de quoi s’agit-il au juste ? Une méthode est une fonction qui est « portée » par un objet, c’est-à-dire a priori par n’importe quelle valeur. On y accède par la syntaxe `valeur.methode(arguments)` : c’est presque comme un appel de fonction, sauf que c’est préfixé par une expression suivie d’un point. Un exemple: toutes les chaînes de caractères ont des méthodes `lower` et `upper`, qui retournent une version respectivement minuscule et majuscule de la même chaîne. {{{#!highlight python print('Bonjour'.upper(),'Bonjour'.lower()) }}} Ou encore, toutes les chaînes ont une méthode `split` qui prend un argument `séparateur`, et qui permet de découper la chaîne à chaque occurrence de `séparateur`, pour obtenir une liste de sous-chaînes. {{{#!highlight python tableau='nom\tprénom\tnote\nDuchamp\tMarcel\t12\nv. Gogh\tVincent\t16\nKoons\tJeff\t2' print('Voilà le tableau') print(tableau) lignes=tableau.split('\n') for i in range(1,len(lignes)): ligne = lignes[i] colonnes = ligne.split('\t') print(colonnes[1],colonnes[0],'a eu la note',colonnes[2] }}} On verra d’autres exemples de méthodes prédéfinies par la suite. Et on abordera la notion d’objet un peu plus en détail lors du TP 2.4. == Fin == Si vous êtes arrivés jusque là, vous avez toutes les briques pour traiter l’algorithmique courante en Python 3. :) Reste à pratiquer, avec [[TPAlgoÉlémentaire|quelques exercices classiques]].