Skip to content
Snippets Groups Projects
Commit ec1e7df9 authored by Romain Vuillemot's avatar Romain Vuillemot
Browse files

Ajout du TD1 (sujet et codes)

parent 1267ecb7
No related branches found
No related tags found
No related merge requests found
Showing
with 509 additions and 0 deletions
#####################################
## 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
# 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
# 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
# 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
# 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
# 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
# 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")
# 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
## 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
"""
# 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,) """
# 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)
# 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
# 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
# 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
# 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
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
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment