diff --git a/TD01/code/.gitkeep b/TD01/code/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/TD01/code/01-git.py b/TD01/code/01-git.py new file mode 100644 index 0000000000000000000000000000000000000000..918d1b34da3f0ad82511ea5e52a089385e438e7a --- /dev/null +++ b/TD01/code/01-git.py @@ -0,0 +1,13 @@ +##################################### +## GitLab de l'Ecole Centrale de Lyon +# +# https://gitlab.ec-lyon.fr/ +# +##################################### + +## Comment vous connecter ? +# Avec vos identifiants ECL. + +## A quoi ça sert ? +# Nous utiliserons GitLab pendant les cours d'informatique afin de vous +# distribuer le code et vous permettre de le sauvegarder. GitLab est très utilisé en entreprise, il vous est donc important de l'utiliser très rapidement car cela vous sera utile pour vos stages, projects, etc. \ No newline at end of file diff --git a/TD01/code/01-git_exercices.py b/TD01/code/01-git_exercices.py new file mode 100644 index 0000000000000000000000000000000000000000..a77707ae7fde08e7212f41785a7f650a91bee4c5 --- /dev/null +++ b/TD01/code/01-git_exercices.py @@ -0,0 +1,8 @@ +# Faire un premier commit avec une fonction déjà existante + +def addition(a, b): + return a + b + +# Tester que cela fonctionne + +# Afficher le résultat sur le site gitlab diff --git a/TD01/code/02-python.py b/TD01/code/02-python.py new file mode 100644 index 0000000000000000000000000000000000000000..ad9b69f3ef20161761b264536d1139d76326d8c5 --- /dev/null +++ b/TD01/code/02-python.py @@ -0,0 +1,9 @@ +# Faire un premier test d'une fonction Python + +## Vérifiez votre numéro de version +# Afficher le numéro de version avec la commande suivante +# dans un terminal + +# python ––version + +# > La version doit être égale ou supérieure à 3.7 \ No newline at end of file diff --git a/TD01/code/02-python_exercices.py b/TD01/code/02-python_exercices.py new file mode 100644 index 0000000000000000000000000000000000000000..9d9143c57c95be52ed9f3240829f716000f4354d --- /dev/null +++ b/TD01/code/02-python_exercices.py @@ -0,0 +1,9 @@ +# Vous devez valider ce code qui affiche le numéro de version +# Rien d'autre à faire ! +import sys + +if not sys.version_info.major == 3 and sys.version_info.minor >= 7: + print("Python 3.7 ou supérieur est nécessaire !") +else: + print("Vous utilisez {}.{}.".format(sys.version_info.major, sys.version_info.minor)) + sys.exit(1) \ No newline at end of file diff --git a/TD01/code/03-commentaires.py b/TD01/code/03-commentaires.py new file mode 100644 index 0000000000000000000000000000000000000000..0c574e7bea0939dbf4c532a1059a0ee4538fe53a --- /dev/null +++ b/TD01/code/03-commentaires.py @@ -0,0 +1,15 @@ +# Un commentaire court commence par un # et se limite à la fin de la ligne + +""" +On peut aussi créer un commentaire long = une zone de +commentaires sur plusieurs lignes placées +entre une paire de triple-guillements dont le second suit : +""" + +# Remarques : +# Un ';' à la fin d'une ligne rend la ligne muette (pas d'affichage des résultats). +# Il permet également de placer plusieurs expressions sur la même ligne. + +# Si vous placez un commentaire immédiatement après la signature d'une fonction} +# (ou une méthode, une classe, etc.) entre un couple de """, +# votre commentaire (appelé docstring) devient accessible avec help \ No newline at end of file diff --git a/TD01/code/04-bases.py b/TD01/code/04-bases.py new file mode 100644 index 0000000000000000000000000000000000000000..12652e49dabfc5af5f65e54fd55b77215c052114 --- /dev/null +++ b/TD01/code/04-bases.py @@ -0,0 +1,38 @@ +# Exemple 1 : moyenne +# Calcul de la moyenne de deux entiers + +a=input('Donner la valeur de a : ') +b=input('Donner la valeur de b : ') +print('la moyenne = ', (int(a) + int(b))/2) # int(a) : conversion de 'a' en entier + +# Une seconde méthode : on convertit en lisant les valeurs en int +a=int(input('Donner la valeur de a : ')) +b=int(input('Donner la valeur de b : ')) +print('la moyenne = ', (a+b)/2) + +# Exemple 2 : racines carrées +import math; + +a=int(input('Donner le coefficient a : ')) +b=int(input('Donner le coefficient b : ')) +c=int(input('Donner le coefficient c : ')) + +if (a == 0): + if ( b != 0) : + print("Pas quadratique : racine simple x = ",-c/b) + else: + print("une blague ! ") +else : + delta=b*b-4*a*c #ou b**2 + if(delta < 0) : + print("pas de racines reelles") + else : + assert(a != 0) # Déjà vérifié mais pour montrer l'intérêt de "assert". + if(delta>0) : + x1 = (-b+math.sqrt(delta))/(2*a) + x2 = (-b-math.sqrt(delta))/(2*a) + print("x1 = ",x1) + print("x2 = ",x2) + else : + x1 = x2 = -b/(2*a) + print("racine double x1 = x2 = ",x1) \ No newline at end of file diff --git a/TD01/code/04-bases_exercices.py b/TD01/code/04-bases_exercices.py new file mode 100644 index 0000000000000000000000000000000000000000..8c8a08e8ff4ce503402c15e11154cbecccb8de22 --- /dev/null +++ b/TD01/code/04-bases_exercices.py @@ -0,0 +1,7 @@ +# Exercice : pair/impair +# Lire un entier au clavier et décider (et afficher) s'il est pair ou impair. +a=int(input('Donner un entier positif : ')) +if (a%2 ==1): + print(a, " est impair") +else : + print(a, " est pair") diff --git a/TD01/code/05-fonctions.py b/TD01/code/05-fonctions.py new file mode 100644 index 0000000000000000000000000000000000000000..76267678416ac268d6a55863a93bf3698c63db87 --- /dev/null +++ b/TD01/code/05-fonctions.py @@ -0,0 +1,11 @@ +# 5 Introduction aux fonctions + +## Exemple : moyenne de deux entiers +# Calcul de la moyenne de deux entiers par une fonction (de signature entier x entier -> reel) +def moyenne(a,b): + return (a+b)/2 + +# --- Partie Principale ---- +a=input('Donner la valeur de a : ') +b=input('Donner la valeur de b : ') +print('la moyenne = ', moyenne(int(a),int(b))) \ No newline at end of file diff --git a/TD01/code/05-fonctions_exercices.py b/TD01/code/05-fonctions_exercices.py new file mode 100644 index 0000000000000000000000000000000000000000..0be4025eee77488ccc7c28d2bd07072fb4cf1eef --- /dev/null +++ b/TD01/code/05-fonctions_exercices.py @@ -0,0 +1,68 @@ +## 5.2 Exercice : Racines d'une quadratique avec une fonction +# Reprendre l'exemple du calcul des racines d'une équation de seconde degré +# et placer les calculs dans la fonction {\tt quadratique(a, b, c)} qui +# reçoit en paramètre les coefficients {\it a,b} et {\it c} et renvoie les +# racines de cette équation. + +from math import sqrt + +def quadratique(a, b, c): + if (a == 0): + if ( b != 0) : + return ("Pas quadratique : racine simple x "+str(-c/b)) + else: + return ("une blague ! ") + else : + delta=b*b-4*a*c #b*b OU b**2 + if(delta < 0) : + return ("pas de racines réelles") + else : + if(delta>0) : # Le test initial sur la valeur de "a" montre son intérêt ici. + assert(a != 0) # Pas utile mais on montre aux élèves l'intérêt de "assert". + x1=(-b+math.sqrt(delta))/(2*a) + x2=(-b-math.sqrt(delta))/(2*a) + return ("x1 = "+str(x1)+ " x2 = "+ str(x2)) + else : + x1 = x2 = -b/(2*a) + return ("racine double x1 = x2 = "+str(x1)) + +# La partie principale +a=int(input('Donner le coefficient a : ')) +b=int(input('Donner le coefficient b : ')) +c=int(input('Donner le coefficient c : ')) +print(quadratique(a,b,c)) + +## 5.3 Exercice : Moyenne et écart type +# Créer une liste de 100 nombres de la distribution N(16,2). +import random +echantillon=[random.gauss(16,2) for n in range(100)] + +def moyenne_liste(liste): + return sum(liste)/len(liste) + +def variance(liste): + moy=moyenne_liste(liste) + return moyenne_liste([(x-moy)**2 for x in liste]) + +# ---------- Partie Principale ---------- +# Pour tester nos calculs sans lire des entiers, on fait un tirage Normale +echantillon=[random.gauss(16,2) for n in range(100)] + +print("Moyenne = " , moyenne_liste(echantillon)) +print("Ecart type = " , variance(echantillon)**0.5) # %* {\color{magenta} $\sqrt{Var}$} *) + + +""" TRACE : +Moyenne = 15.92301989946788 +Ecart type = 1.9934234202474366 +""" + +# 5.4 Variante : Exercice (suite écart type) + +echantillon=[random.gauss(16,2) for n in range(100)] +varia = moyenne([x**2 for x in echantillon])-moyenne(echantillon)**2 +print("De la seconde façon : ", varia**0.5) + +""" Trace : +De la seconde façon : 1.8839867058987951 +""" diff --git a/TD01/code/06-script.py b/TD01/code/06-script.py new file mode 100644 index 0000000000000000000000000000000000000000..8af4da9adb789110606cc99ccd1cf58820da1274 --- /dev/null +++ b/TD01/code/06-script.py @@ -0,0 +1,16 @@ +# 6 Créer un script Python indépendant + +from racines import trinome; +print(trinome(2.0, -4.0, 2.0)) + + +# --- Partie Principale --------- +print(trinome(1.0, -3.0, 2.0)) +print(trinome(1.0, -2.0, 1.0)) +print(trinome(1.0, 1.0, 1.0)) + +""" On obtient +(2, 1.0, 2.0) +(1, 1.0) +(0,) """ + diff --git a/TD01/code/07-types.py b/TD01/code/07-types.py new file mode 100644 index 0000000000000000000000000000000000000000..2352a64a4bd826d78511b9230c73c1caff63ca69 --- /dev/null +++ b/TD01/code/07-types.py @@ -0,0 +1,39 @@ +# 7 Types principaux en Python + +if type(1) is not int : print('oups') + +if type('1') is not int : print(1) + +type(3.14) +# float + +type(None) +# NoneType + +f = lambda c : c if type(c) is str and c.isalpha() else '?' +type(f) +# function + +# Utilisation de f (voir plus loin les "lambda expressions") : +f('a') # donne 'a' car 'a' est alphabétique +f('1') # donne '?' car '1' n'est pas alphabétique +f(1) # donne '?' car 1 n'est pas une chaine + +import sys; + +print(sys.int_info) +# sys.int_info(bits_per_digit=30, sizeof_digit=4) + +print(sys.float_info) +# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, +# min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, +# mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) + +print(sys.getsizeof(float)) # La taille de la classe float +# 400 +print(sys.getsizeof(float())) # La taille d'un float +# 24 # Ce que coute en octes un réel + # (valeur + infos supplémentaires) + + + diff --git a/TD01/code/08-conversion.py b/TD01/code/08-conversion.py new file mode 100644 index 0000000000000000000000000000000000000000..3554dc2f20d534f2182cc80605685a12fded7289 --- /dev/null +++ b/TD01/code/08-conversion.py @@ -0,0 +1,141 @@ +# 8 Conversion de types + +list1 = ['1', '2', '3'] +str1 = ''.join(list1) + +str1 +# '123' + +list1 = [1, 2, 3] +str1 = ''.join(str(e) for e in list1) # ou avec "" à la place de '' + +str1 +# '123' + + +a = "545.2222" +float(a) +# 545.2222 suivant le système, on peut avoir des '0' après les '2' + +int(float(a)) +# 545 + +def is_float(value): + try: + float(value) + return True + except: + return False + +# On peut aussi utiliser la prédéfinie eval() qui évalue du code Python +eval("1.5") +# 1.5 + +# Une alternative plus sûre à eval() +import ast +ast.literal_eval("545.2222") +545.2222 + +ast.literal_eval("31") +31 + +# Des cas d'erreur +eval(toto) # toto non défini ou n'est pas un str/octes/code +ast.literal_eval(toto) +# Erreur dans les 2 cas + + +# Converstion en binaire +st = "hello Debase" +' '.join(format(ord(x), 'b') for x in st) +# '1101000 1100101 1101100 1101100 1101111 100000 1000100 1100101 1100010 1100001 1110011 1100101' + +# Conversion de string en hexadécimal +s='Hello Debase of Ecl' +' '.join(format(ord(x), 'x') for x in s) +# '48 65 6c 6c 6f 20 44 65 62 61 73 65 20 6f 66 20 45 63 6c' + +# Conversion entier en Unicode +chr(16) # Quelle est la forme hexa de 16 ? +#'\x10' + +# Conversions décimal <==> base xx + +int('12',8) # Quelle est la valeur décimale du nombre octal '12' (octal car base = 8) +# 10 + +int('12',16) # Quelle est la valeur décimale du nombre hexa '12' (hexa car base = 16) +# 18 + +int('12') # Quelle est la valeur décimale du nombre décimale '12' (décimal car base par défaut = 10) +# 12 + +int('1000',2) # Que donne le nombre binaire '1000' en décimal (binaire car base = 2) +# 8 + +# Pour convertir un entier en octal + +oct(12) +# '0o14' #un 'O' au début (pour Octal) + +oct(8) +# '0o10' + +# Autres conversions + +# octal +eval('0o010') == 10 # La valeur décimale de '0o010' est-elle 10 +# False + +eval('0o010') +# 8 + +oct(42) # La valeur octale de l'entier 42 +# '0o52' + +int('0o52', 0) # La valeur décimale de l'octale '0o52' (si base=0 alors base est dans le string) +# 42 + +int('1101', 2) # La valeur décimale du binaire '1101' (base explicite = 2) +#13 + +int('0b1101', 2) # Idem, base explicitée = 2, peut importe '0b' +#13 + +int('0b1101', 0) # La valeur décimale du binaire '0b1101' (base = 0 --> la base '0b' est dans le string) +#13 + +from struct import * + +pack('hhl', 1, 2, 3) +# b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00' +# b veut dire byte (2 octes). \x veut dire hexa + +pack('b', 1) +# b'\x01' + +pack('b', 16) # signed char de taille 1. On convertie 16 en signed char +# b'\x10' + +In [39]: pack('B', 16) # unsigned char de taille 1 +# b'\x10' + +pack('h', 1) +# b'\x01\x00' + +calcsize('h') +# 2 + +calcsize('b') +# 1 + +unpack('b', b'\x10') +# (16,) + +type(unpack('b', b'\x10')) +# tuple + +unpack('b', b'\x10')[0] # Première élé. Il y a virgule car taille tuple >= 2 +# 16 + +pack('B',65) # donne b'A' = i.e. le caractère dont le code = 65 \ No newline at end of file diff --git a/TD01/code/08-conversion_exercices.py b/TD01/code/08-conversion_exercices.py new file mode 100644 index 0000000000000000000000000000000000000000..d8ec3d39246e59bef5299bf2715f2a741fb6a797 --- /dev/null +++ b/TD01/code/08-conversion_exercices.py @@ -0,0 +1,74 @@ +# 8 Conversion de types + +# Exercice + +# Écrire la fonction convertir(S) qui convertit son paramètre (un string) +# en un entier. Pour que la conversion soit possible, le paramètre S doit +# être être composé de chiffres éventuellement précédé d'un signe. + +def convertir(S) : # S est une liste de caractères + + # Il y a un signe au début ou pas ? + signe= +1 # Initialisation du signe + if S[0:1] in '+-': + if S[0:1]=='-' : signe=-1 + S = S[1:] # On enlève le signe + + if S.isdigit(): return int(S) * signe # On peut aussi écrire : str.isdigit(xs) ! + else: return (S + " n'est pas un nombre") + +S=input('Donner une chaine de chiffres: ') +print(convertir(S)) + +# Donner une chaine de chiffres: -124 +# -124 +# Donner une chaine de chiffres: 12a + +# Une version qui n'utilise ni int() ni isdigit() +def convertir02(S1) : # S est une liste de caractères + assert(S1 != '' and S1 != None) + signe= +1 # Initialisation du signe + val = 0; S=S1 + if S[0] in '+-': + if S[0:1]=='-' : signe=-1 + S = S[1:] + for car in S : + if car in "0123456789": val = 10*val+ord(car)-ord('0') + else : return (S1 + " n'est pas un nombre") + return val * signe # On peut aussi écrire : str.isdigit(xs) ! + +S=input('Donner une chaine de chiffres : ') +print(convertir02(S)) + +# Exercice +# Écrire la fonction {\tt convertir2r(S)} qui convertit son paramètre (un +# string) en un réel (loat). Pour que la conversion soit possible, le +# paramètre {\it S} doit être être éventuellement précédé d'un signe, puis +# composé de chiffres suivis d'un '.' puis une série de chiffres. La +# présence d'un '.' est obligatoire, et qui est forcément suivi d'au moins +# un chiffre. + +def convertir2r(S) : # S est une liste de caractères + assert('.' in S) # '.' obligatoire + lst_2_parties=S.split('.') # une liste des 2 parties + val_int=0 + if lst_2_parties[0] != '' : val_int=convertir02(lst_2_parties[0]) + + # vérifier que la partie décimale ne comporte pas un second signe ! + assert(lst_2_parties[1][0] not in '+-') + + val_reel=0 + if lst_2_parties[1] != '' : val_reel=convertir02(lst_2_parties[1]) + + # La partie décimale s'ajoute ou se retrache suivant le signe de val_int' + if val_int >= 0 : + return val_int + val_reel/(10**len(lst_2_parties[1])) + else : return val_int - val_reel/(10**len(lst_2_parties[1])) + + +S=input('Donner une chaine de chiffres (un réel) : ') +print(convertir2r(S)) +convertir2r('12.34') +convertir2r('0.12') +convertir2r('13.0') +convertir2r('-3.001') \ No newline at end of file diff --git a/TD01/code/09-modules.py b/TD01/code/09-modules.py new file mode 100644 index 0000000000000000000000000000000000000000..c692833f46826a0cf7bca5972c554f84f68ce828 --- /dev/null +++ b/TD01/code/09-modules.py @@ -0,0 +1,22 @@ +# Modules Python + +# import tel_module as mod1 +# import un_module as mod2 +# mod1.fonc(..) #appel de la fonction fonc du tel_module +# mod2.fonc(..) #appel de la fonction homonyme du un_module + +# import tel_module +# +# def ma_fonction(): +# localname = tel_module.fonc +# foo = localname(bar) + +import scipy.stats as st +st.nanmean() + +# Si vous obtenez le message +# ModuleNotFoundError: No module named 'scipy' +# ..vous devez installer le module avec la commande +# +# pip3 install scipy +# \ No newline at end of file diff --git a/TD01/code/10-range.py b/TD01/code/10-range.py new file mode 100644 index 0000000000000000000000000000000000000000..c692833f46826a0cf7bca5972c554f84f68ce828 --- /dev/null +++ b/TD01/code/10-range.py @@ -0,0 +1,22 @@ +# Modules Python + +# import tel_module as mod1 +# import un_module as mod2 +# mod1.fonc(..) #appel de la fonction fonc du tel_module +# mod2.fonc(..) #appel de la fonction homonyme du un_module + +# import tel_module +# +# def ma_fonction(): +# localname = tel_module.fonc +# foo = localname(bar) + +import scipy.stats as st +st.nanmean() + +# Si vous obtenez le message +# ModuleNotFoundError: No module named 'scipy' +# ..vous devez installer le module avec la commande +# +# pip3 install scipy +# \ No newline at end of file diff --git a/TD01/code/racines.py b/TD01/code/racines.py new file mode 100644 index 0000000000000000000000000000000000000000..b5c6a1b7844b47795b048ec5b47f469500be02c5 --- /dev/null +++ b/TD01/code/racines.py @@ -0,0 +1,17 @@ +from math import sqrt; +# résolution équation quadratique +def trinome(a, b, c): + delta = b**2 - 4*a*c + if delta > 0.0: + assert(a != 0) + racine_delta = sqrt(delta) + return (2, (-b-racine_delta)/(2*a), (-b+racine_delta)/(2*a)) + elif delta < 0.0: return (0,) + else: + assert(a != 0) + return (1, (-b/(2*a))) + +if __name__ == "__main__": + print(trinome(1.0, -3.0, 2.0)) + print(trinome(1.0, -2.0, 1.0)) + print(trinome(1.0, 1.0, 1.0)) \ No newline at end of file diff --git a/TD01/td1.pdf b/TD01/td1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..357ef4089c4750baaffc54c212ede72bf6ad23cf Binary files /dev/null and b/TD01/td1.pdf differ