Python L1, TD/TP 21.01

Nous avons raté les TD d'aujourd'hui, désolé. Ma voiture est tombée en panne au milieu de nulle part, et je suis heureux d'avoir pu régler tout indispensable au bout de 2 heures.
En TP nous travaillerons ensemble, et vite, afin de pouvoir commencer l'épreuve notée après une certaine préparation de votre part.


Attention, la page de la semaine dernière contient quelques solutions d'exercices. Dans l'avenir, je ne vous en avertirai pas, vérifiez mes pages régulièrement, si tel est votre souhait.

Attention, le dernier exercice en TP aujourd'hui sera à rendre par mail à mon adresse, et évalué.
Votre sujet n'est pas encore accessible, il sera dévoilé 15 minutes avant la fin des TP.

Il se trouve en bas de page.


Sauf erreur de ma part, selon le calendrier de Françoise, la semaine prochaine verra un exercice "interro" à réaliser en TD sur papier.

J'ignore encore le type d'exercices/questions, mais revisez le cours ET les TD/TP si vous avez un instinct de survie. Voici quelques questions inventées, que je peux imaginer pour la semaine prochaine, ceci n'a rien à voir (en principe) avec la réalité, mais peut vous inspirer...

 

Quels sont les résultats (peuvent être multiples : y1, y2, y3, par ex.) d'évaluation (ou diagnostic d'exception) des expressions / instructions ci-dessous.

Chaque expression ou instruction, ou séquence, est évaluée dans une machine Python "vide" sans aucune déclaration ni importation préalable. Si une question vous bloque, passez aux autrez, revenez plus tard.

  1. import math; print(sqrt(9.0)

  2. s=2*"0123456789"; y1=s[-7 : -3]; y2=s[10 : -3]; y3=s[-3 : -7]


  3. L'inégalité logique entre deux valeurs x et y, qui s'appelle parfois XOR (exclusive-or), c'est ... inégalité. On obtient Vrai si x est Vrai et y Faux, ou vice-versa, sinon, c'est Faux. Écrire une expression logique, avec les opérateurs not, and, et or, qui donne ce résultat pour x, y interprétés logiquement. Vous ne pouvez pas utiliser l'égalité ou l'inégalité.

  4. Supposons que x="12.87". Vous pourrez convertir la chaîne en nombre (réel flottant) par la fonction float(x). Cependant int(x) ne marchera pas et déclenchera une exception, car ceci est visiblement une valeur non-intégrale. Comment facilement trouver la partie entière "cachée" dans cette chaîne?


Exercices

Mécanismes decisionnels (conditionnelles, etc.)

Instructions conditionnelles

Ceci a été couvert par le cours :

if CND:
   Instr_Vrai
else:
   Instr_Faux
Instr_Vrai, Instr_Faux sont des instructions quelconques : affichage, affectation des variables, etc., éventuellement des blocs : séquences d'instructions qui peuvent contenir d'autres conditionnelles par exemple:
x=7  # ou autre
...
if x>3:
   y=x*x-8
   print(x,y)
else:
   y=0
   print("x vaut",x,", y est spécial")

Vous devez savoir que Python vous permet de placer UNE instruction après les deux points dans la conditionnelle (ou dans une boucle, etc.) : if B: x=99 . Ceci peut être commode, le code devient plus court, mais Spyder a un bug, et ajoute un autre deux points à la fin de cette instruction. Le bug a été signalé 3 fois, il y a longtemps... Visiblement les auteurs veulent décourager les utilisateurs de profiter de cette forme syntaxique.

Puisque nous aurons besoin de la racine carrée, exécuter avant le reste du code : import math, ou from math import *, selon vos souhaits.

Étant données trois variables : a, b et c, considérées comme des coefficients d'une équation quadratique : \(\mathrm{a} \cdot x^2 + \mathrm{b}\cdot x + \mathrm{c} = 0\), écrire un programme qui trouve et imprime la ou les solutions \(x\) de cette équation, éventuellement affiche le message diagnostique, notifiant l'absence de solution.

Expressions conditionnelles

(Sauf erreur de ma part, ceci n'a pas été discuté en cours)

En Python il existe une structure syntaxique qui s'appelle expression conditionnelle :

EXVR if CND else EXFA
if et else sont des mots clés, et les autres sont des expressions. La valeur de cette expression est le résultat du raisonnement suivant. Si la valeur de la condition CND est vraie, alors c'est EXVR, sinon, c'est EXFA. Répétons, que contrairement aux instructions conditionnelles, ceci est une valeur !


Boucles

Avec les constructions itératives (boucles for et boucles while exposées un peu plus tard en cours, mais je les considère comme assez fondamentales) nous pourrons enfin faire de la vraie programmation. Désormais les exercices deviennent plus longs.

En cours vous avez vu, disons

for x in range(100):
   print(100-2*x)

Mais on pourrait écrire également une autre boucle, "tant-que" : while :

x=0
while x<20:
  print("Encore : ",20-x)
  x+=1

Il n'est pas difficile de comprendre le sens de cette construction.Les instructions dans ce bloc sont effectuées itérativement tant que la condition dans l'entête soit vraie.

On a parlé de la méthode de Newton de calcul approximatif de la racine carrée de x : \(\displaystyle{r_0=1; \ldots{} r_{n+1} = \frac{1}{2}\left(r_n+\frac{x}{r_n}\right)}\)
Cependant, on a traité le problème en style "calculatrice", l'écriture de quelques instructions sans mécanismes décisionnels...

Après la boucle on devra imprimer la valeur obtenue, et la comparaison avec la valeur de math.sqrt(x).

Votre premier rencontre avec les fonctions.

Le cours prévoit les fonctions (procédures, sous-programmes paramétrés, "routines"... la terminologie varie) un peu plus tard, mais il n'y a aucun mystère dedans. Si vous effectuez un calcul, par exemple le calcul approximatif de la racine carrée par une simple boucle, comme demandé ci-dessus, alors vous pouvez vouloir réutiliser cet algorithme plusieurs fois, pour plusieurs valeurs de x, et ne pas être obligé de lire chaque fois l'argument depuis le clavier. Python dispose de plusieurs fonctions prédéfinis (soit dans le noyau, soit dans les modules de support), par ex. sqrt(x) dans math, etc. Rien ne nous empêche de définir nos fonctions / procédures à nous.

Une procédure est un bloc d'instructions qui suit – indenté – l'entête qui spécifie le paramètre : une variable locale, utilisée dedans, et qui n'a a priori rien à voir avec des variables portant le même nom, mais spécifiées ailleurs. Voici la "procéduralisation" de notre programme :

def racine(x):
    # ... on calcule la valeur de r en fonction de x
    return r

Il suffit dans le programme appeler, par ex. : zz=racine(9) et récupérer la réponse. Notez le suivant :

"Procéduraliser" le calcul de la racine par la méthode de Newton. (Exo de 3 minutes, le contenu, vous le connaissez déjà...).


Palindromes

Un palindrome est une phrase (ici : chaîne) identique à son inverse, comme "Ésope reste ici et se repose" ou "kayak". (Pour nous : pas d'espaces, pas de majuscules, pas d'accents, donc : "esoperesteicietserepose", etc.). On indexe les éléments de la chaîne s par s[k], et on récupère leur longueur par len(s).

Ecrire un programme qui vérifie si une chaîne Python est un palindrome ou non. Faire une boucle qui parcourt la chaîne en deux sens, et qui s'arrète soit quand on arrive au centre, ou quand on trouve des caractères différents.

Procéduraliser cet exercice : construire une fonction palind(s) qui prend une chaîne en paramètre, et qui répond (retourne) True ou False en réponse à la question : est-ce un palindrome?


Exemple d'une fonction récursive (qui s'appelle elle-même).

La factorielle \(N! = 1\cdot 2\cdot 3\cdot 4 \cdots\ \cdot N\) peut être définie récursivement. La factorielle de \(N\) vaut \(1\) si \(N=0\), sinon c'est le produit : \(N\) fois la factorielle de \(N-1\). Coder ceci en Python.


Exercice à rendre : sujet ici.


Dans quelques jours vous aurez (probablement...) le corrigé.

Semaine dernière
Semaine suivante
Retour à l'index