D'autres programmes et activités.

Algorithme de dichotomie

Téléchargements des fichiers :

Le jeu des 8 erreurs

Les 8 erreurs

Retrouver les 8 erreurs dans ce code :

def makeList(deb,fin,max)
lst==[]
    s=0
    while s<max
    a=randint(deb,fin)
    lst.randint(a);
    s=s+a
    return lst,a

Code de déblocage de la correction :

Jeu inspiré de l'algorithme de l'algorithme de dichotomie.

Activité proposée par Stéphane ROEBROECK

Vous avez un "bac à sable" à disposition pour vos essais.

Un aperçu des fichiers jupyter proposés en téléchargement.

Le fichier à télécharger ici

Le fichier en docx à télécharger ici

Transformer une version procédurale en fonctionnelle

Voici une version procédurale de la recherche des racines d'un trinôme.

from math import *
print("Recherche des racines du trinôme ax²+bx+c=0")
print("Veuillez entrer a, b, c")
a=float(input("a= "))
b=float(input("b= "))
c=float(input("c= "))
delta=b**2-4*a*c
if delta>0 :
	print("Il y a deux racines : ")
	x1=(-b+sqrt(delta))/(2*a)
	x2=(-b-sqrt(delta))/(2*a)
	print("x1 = ",x1)
	print("x2= ",x2)
else :
	if delta==0 :
		print("Il y a une racine :")
		x3=-b/(2*a)
		print(" La racine est : ",x3)
	else :
		print("Il n'y a pas de racine")
	
	

Le but est de transformer ce programme en un ensemble de fonctions.

Code de déblocage de la correction :

Ensemble de fonctions : périmètre et aire

Le but de l'activité est de réaliser un ensemble de fonctions qui permet de calculer l'aire et le périmètre des figures de base.

L'activité en PDF ici.

Voici un exemple réalisé par des élèves de seconde


# réalisé par des éléves de seconde
# -*- coding: utf-8 -*-

from math import *
from random import *
import matplotlib.pyplot as plt
import numpy as np


def perimetre_carre(c):
    "Renvoie le périmètre d'un carré de côté c"
    assert(c>=0)
    return 4*c

def aire_carre(c):
    "Renvoie l'air d'un carré de coté c"
    return c*c

def peri_rect(l, L):
    "Renvoie le périmètre d'un rectangle de longeur L, et largeur l"
    return (l+2)+(L+2)

def aire_rect(l, L):
    "Renvoie l'air d'un rectangle de longeur L, et largeur l"
    return l * L

def aire_triangle(base, hauteur):
    "Renvoie l'air d'un rectangle quelconque avec une base et une hauteur"
    return (base * hauteur) / 2

def peri_tri_isocelle(h, b):
    "Renvoie le périmètre d'un triangle isocelle avec h comme hauteur, et b comme base"
    return b+2*( sqrt( h**2 + (b/2) ) )

def peri_tri_rectangle(h, b):
    "Renvoie le périmètre d'un triangle rectangle avec h comme hauteur, et b comme base"
    return h + b +(sqrt(h**2 + b**2))

def peri_tri_equilateral(b):
    "Renvoie le périmètre d'un triangle équilatèral avec b comme base"
    return b * 3
def peri_cercle(r):
    "Renvoie le périmètre d'un cercle de rayon r"
    return 2 * pi * r
def aire_cercle(r):
    "Renvoie l'aire d'un cercle de rayon r"
    return pi * r**2

def periFigure():
    return peri_cercle(1)+ peri_cercle(1)
def aireFigure():
    return (aire_cercle(1)*2)+aire_carre(2)

Ensemble de fonctions : La géométrie analytique (avec des réalisations d'élèves)

Le but est de construire un ensemble de fonctions de géométrie analytique afin de déterminer la nature de différentes quadrilatères.

L'activité en PDF ici.

Différentes réalisations d'élèves.


from math import *

def milieu(xA,yA,xB,yB):
    xI=(xB+xA)/2
    yI=(yB+yA)/2
    return(xI,yI)


def distance(xA,yA,xB,yB):
    return sqrt((xB-xA)**2+(yA-yB)**2)


def parallélogramme(xA,yA,xB,yB,xC,yC,xD,yD):
    return(milieu(xA,yA,xC,yC)==milieu(xB,yB,xD,yD))



def losange(xA,yA,xB,yB,xC,yC,xD,yD):
    return(parallélogramme(xA,yA,xB,yB,xC,yC,xD,yD)== True and distance(xA,yA,xB,yB)==distance(xC,yC,xB,yB))




def rectangle(xA,yA,xB,yB,xC,yC,xD,yD):
    return(parallélogramme(xA,yA,xB,yB,xC,yC,xD,yD)== True and distance(xA,yA,xC,yC)== distance(xB,yB,xD,yD))


def carré(xA,yA,xB,yB,xC,yC,xD,yD):
    return(rectangle(xA,yA,xB,yB,xC,yC,xD,yD) and losange(xA,yA,xB,yB,xC,yC,xD,yD))

# Créé par GOBILLOTJ, le 10/01/2019 en Python 3.4
from math import*

def d(xa,ya,xb,yb):
    "formule distance dans un repère orthonormé"
    return sqrt((xb-xa)**2+(yb-ya)**2)

def m(xa,ya,xb,yb):
    "formule millieu dans un repère orthonormé"
    return (xa+xb)/2 ,(ya+yb)/2

def p(xa,ya,xb,yb,xc,yc,xd,yd):
    """renvoie true si les coordonées donné
     forment un parallélogramme sinon renvoie false"""
    if m(xa,ya,xc,yc)==m(xb,yb,xd,yd):
        return True
    else: return False
def l(xa,ya,xb,yb,xc,yc,xd,yd):
    """renvoie true si les coordonées donné
     forment un losange sinon renvoie false"""
    return p(xa,ya,xb,yb,xc,yc,xd,yd)==True and d(xa,ya,xb,yb)==d(xa,ya,xd,yd)

def r(xa,ya,xb,yb,xc,yc,xd,yd):
    """renvoie true si les coordonées donné
     forment un rectangle sinon renvoie false"""
    return p(xa,ya,xb,yb,xc,yc,xd,yd)==True and d(xa,ya,xc,yc)==d(xb,yb,xd,yd)

def c(xa,ya,xb,yb,xc,yc,xd,yd):
    """renvoie true si les coordonées donné
     forment un carré sinon renvoie false"""
    return r(xa,ya,xb,yb,xc,yc,xd,yd) and l(xa,ya,xb,yb,xc,yc,xd,yd)


représenter une fonction

Voici un ensemble de fonctions qui permet de traiter différentes formes de représentation graphique. A tester.

# coding: utf-8
'''
======================
Initiation à Matplotlib
Formation Python Académie de Reims 2019-2020
====================
'''
from math import *
from random import *
import matplotlib.pyplot as plt # importation classique du module matplotlib.pyplot sous l'alias plt
import numpy as np

# La première ligne permet d'éviter des soucis d'encodage
# Suit l'entête qui présente le programme
# Les quatre lignes suivantes importent des modules qui nous seront nécessaires.
# Par défaut, on gagnera à mettre ces lignes en début de chaque programme.

def f(x):
    return x**2

def demo1():
    "Affiche basique la courbe de la  fonction f"
    # A partir de deux listes, on peut créer un graphique.
    # La première instruction crée le graphique et nous verrons que l'on peut ajouter des éléments supplémentaires à ce graphiqe.
    # La seconde instruction affiche l'ensemble.
    lx=np.linspace(-2,2,15) #crée une liste de 15 nombres allant de -2 à 2
    # On peut créer une listes de valeurs en calculant les images de tous les éléments de lx en écrivant f(lx):
    plt.plot(lx,f(lx))
    plt.show()

def demo2():
    "Affiche avec quelques options la courbe de la  fonction f"
    lx=np.arange(-4,6,0.01)
    plt.title("demo2")
    plt.plot(lx,f(lx),color='r')
    plt.axis([-3,4,-1,17])
    plt.axhline(color="b")
    plt.axvline(color="g")
    plt.show()


def demo3():
    " Création d'un histogramme à pas inégaux"
    plt.title("demo3")
    lvaleurs=[2,5,5,5,7,8,8,9,9,9,10,10,12,13,13,15,17,18,19]
    lbornes=[0,6,8,10,12,15,18,20]
    plt.hist(lvaleurs,lbornes,normed=True)

    plt.savefig("graphique.png")  #que l'on peut-même enregistrer comme image
    plt.show()   #Affichage du graphique

def demo4():
    "Affichage d 'un nuage de points aléatoires"
    lx=np.random.uniform(0,1,1000)
    ly=np.random.uniform(0,1,1000)
    plt.title("demo4")
    plt.scatter(lx,ly,color="r")
    plt.axis([-0.2,1.2,-0.2,1.2])
    plt.axhline(color="k")
    plt.axvline(color="k")
    plt.show()

def demo4b(nb=1000):
    "Affichage d 'un nuage de points aléatoires et test de leurs présence dans un dique"
    plt.title("demo4b")
    plt.axhline(color="k")
    plt.axvline(color="k")
    disque=0
    for i in range(nb):
        x=uniform(-1,1)  #Renvoie un nombre aléatoire de entre -1 et 1
        y=uniform(-1,1)
        R=sqrt(x**2+y**2)
        if R<1:
            plt.plot(x,y,"og")
            disque=disque+1
        else:
            plt.plot (x,y,"or")
        #plt.pause(0.01)  #fonctionne mal sous Jupyter mais bien sous EduPython
    print(disque/nb)
    print(disque/nb)
    plt.show()




# In[11]:


def g(x,a=1):
    return 1/(x-a)
def demo5():
    'Annotations dans un graphique en Latex et  Axes du repère'
    lx= np.linspace(-1,4,120)
    plt.plot(lx,g(lx,2),'rx')
    plt.title("demo5")
    #Déplace les axes du repère
    #Aller voir : https://python.developpez.com/tutoriels/graphique-2d/matplotlib/#LII-G
    ax = plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))


    #xy=(1, 0) désigne la pointe de la flèche
    #xytext=(-120, +30) désigne le décalage du texte par rapport à cette pointe

    plt.annotate(r"$(\frac{1}{x-a})$ n'est pas définie en $a$",
             xy=(2, 0), xycoords='data',
             xytext=(-100, +30), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
    plt.show()


def demo6():
    "afficher plusieurs sous-graphique dans un même graphique"
# En testant puis en copiant-collant le code ci-dessous, afficher les graphiques des fonctions composées nommées g,h,k et définies par (f(x)+2) ; (f(x+2)) et (-f(x)) en y ajoutant tous les commentaires nécessaires.


    lx= np.linspace(-3, 3, 100) #rempli la liste lx de valeurs allant de -2 à 2

    plt.subplot(221)  #Pour s'occuper du graphique numéro dans un tableau de graphique 2×2
    plt.subplots_adjust(hspace=0.4)  #Pour espacer les graphiques

    plt.title("Graphique 1 de la demo6")
    plt.plot(lx,f(lx))

    plt.subplot(222)
    plt.title("Sous Graphique 2")
    plt.plot(lx,f(lx))

    plt.subplot(223)
    plt.title("Sous Graphique 3")
    plt.plot(lx,f(lx))

    plt.subplot(224)
    plt.title("Sous Graphique 4")
    plt.plot(lx,f(lx))


    plt.show()


def h(x):
    if x<0:
        return -x
    else:
        return x

def demo7():
    "Le graphique d'une fonction qui n'est pas définie par une simple formule"
    lx=np.arange(-4,6,0.5)
    #ly=f(lx) cette commande ne peut alors pas fonctionner car on ne peut effectuer le test lx<0
    # Il faut plutôt faire la méthode suivante pour forcer le calcul pour chaque élément de la liste
    ly=[h(x) for x in lx]   #la liste ly est crée à partir de chaque élément de la liste lx
    plt.title("demo7")
    plt.plot(lx,ly)
    plt.show()

def demo8():
    "Et pour aller plus loin"
    "Tout est possible, le mieux est toujours de partir d'exemples et de les copier-coller pour se les approprier"
    lx=np.linspace(-3,5,20) #Une liste de 20 nombres de -2 à 2

    plt.title("La courbe de la fonction f demo8")
    plt.plot(lx,f(lx))
    plt.xlim(-3,5)
    plt.ylim(-5,5)
    plt.scatter(-1,f(-1))
    plt.show()

def demo9():
    "encore plus loin"
    lx=np.linspace(-3,5,20) #Une liste de 20 nombres de -2 à 2

    plt.title("La courbe de la fonction f demo9")

    lx=np.linspace(-10,10,200)
    plt.plot(lx,f(lx),"r--",label='Courbe de f')  #Pour la couleur et la forme

    lx2=np.linspace(-10,10,20)  #seulement 20 points
    plt.plot(lx2,f(lx2),"o", label='Images des entiers')

    plt.grid(True)          #Pour afficher une grille
    plt.ylim(-2,20)
    plt.legend(loc='upper right')  #Pour afficher les label définis plus haut
    plt.savefig('Courbe de f.png')  #On peut même l'enregistrer dans un fichier image
    plt.show()


def demo10(xmin=-10,xmax=+10,pas=0.001,lxp=[-6,-4,2,3],p_graduations_abs=1,p_graduations_ord=2):
    "Affiche la courbe de f dans un repère quadrillé en parquant les points dont les abscisses sont dans lxp"
    "et la graduation de la grille dans p_graduations_abs=1,p_graduations_ord=2"
    lx=np.arange(xmin,xmax+pas,pas)
    #ly=f(lx)
    ly=[f(x) for x in lx]
    ymin,ymax=min(min(ly),0),max(max(ly),0) #valeurs min et max de l'axe des ordonnées


    plt.title("La courbe de la fonction f demo10")
    plt.xlim(xmin,xmax) # valeurs min et max de l'axe des abscisses
    plt.axis([xmin,xmax,ymin,ymax])
    plt.yticks(range(int(ymin),int(ymax+1),p_graduations_ord)) # graduations des axes des ordonnées
    plt.xticks(range(int(xmin),int(xmax+1),p_graduations_abs)) # graduations des axes des abscisses
    plt.grid(True) #affiche un quadrillage
    # plt.axis('equal')
    # plt.title("fonction de la leçon")
    axes = plt.gca()
    axes.spines['right'].set_color('none')
    axes.spines['top'].set_color('none')
    axes.xaxis.set_ticks_position('bottom')
    axes.spines['bottom'].set_position(('data',0))
    axes.yaxis.set_ticks_position('left')
    axes.spines['left'].set_position(('data',0))


    plt.plot(lx,ly) # Affichage dela courbe de f

    lyp=[f(x) for x in lxp]  # Affichage des points supplémentaires
    plt.scatter(lxp,lyp,c='red',marker='x')

    plt.show()  #Affichage du graphique

def demo():

    demo1()
    demo2()
    demo3()
    demo4()
    demo4b(300)
    demo5()
    demo6()
    demo7()
    demo8()
    demo9()
    demo10(-4,4,lxp=[-1,0,1])

demo()

Une animation avec Python

Fluctuation des frèquences de succès. Animation tirée de l'espace Eduscol. Ressources n°8 d'Eduscol

				

Créer et importer sa propre bibliothèque

Vous pouvez créer votre propre bibliothèque. Il faut enregistrer votre fichier au format .py . Il existe plusieurs méthodes. L'exemple proposé concerne un fichier de mathématiques appelé analytique.py qui possède des fonctions de géométrie analytique (distance, milieu, etc.).

Une partie du fichier analytique.py

from math import *


def milieu(xA,yA,xB,yB):
    """ Renvoie les coordonnées du milieu du segment [AB]
    pour appeler la fonction milieu, il faut écrire milieu(1,1,3,-1) pour A(1;1 et B(3;-1)"""

    return (xA+xB)/2,(yA+yB)/2


# Ecrire la fonction distance(xA,yA,xB,yB) qui renvoie la distance AB

def distance(xA,yA,xB,yB):
    """ Renvoie la distance AB
    pour appeler la fonction distance, il faut écrire distance(1,1,3,-1) pour A(1;1) et B(3;-1)"""

    d=sqrt((xB-xA)**2+(yB-yA)**2)
    # x**2 correspond à x²
    # sqrt(x) correspond à la racine carrée de x
    return d

# méthode 1 : cette commande fonctionne si les deux fichiers sont dans le même dossier.
from analytique import *
	
# méthode 2 : cette commande fonctionne si le fichier est dans le sous-dossier module
from module.analytique import *
	
# Méthode 3 : créer votre module dans C:/EduPython/Lib/site-packages
from analytique import *
	
# Méthode 4 : plus compliquée
import sys
sys.path
sys.path.append("C:\\Users\\Pascal\\Google Drive\\Lycée général\\Python\\ModulesPersonnels")   # Chemin à adapter à votre configuration
	

Exemple d'exécution

from analytique import *
distance(1,1,2,2)
help(distance)

La bibliothèque turtle

Activité proposée par Stéphane ROEBROECK

De jolis dessins :

L'activité à télécharger : Téléchargement ici

Les solutions ici :

import turtle
turtle.speed('fast')

def triEqui(x,y,c):
    """trace un triangle équilatéral sur la gauche,
    à partir du point de coordonnées (x;y) et de côté c (points)"""
    turtle.up() #lève le stylo
    turtle.goto(x,y) #se rend sur le point de coordonnées (x;y)
    turtle.down() #descend le stylo
    for i in range(3):
        turtle.forward(c)
        turtle.left(120)

for i in range(8):
    triEqui(-200+20*i,-100+10*i,100)
for i in range(8,16):
    triEqui(-80+20*i,50-10*i,100)
turtle.mainloop()



import turtle
turtle.speed('fast')

def triEqui(x,y,c):
    """trace un triangle équilatéral sur la gauche,
    à partir du point de coordonnées (x;y) et de côté x (points)"""
    turtle.up() #lève le stylo
    turtle.goto(x,y) #se rend sur le point de coordonnées (x;y)
    turtle.down() #descend le stylo
    for i in range(3):
        turtle.forward(c)
        turtle.left(120)

def ligneTriangles(x,y,c,n):
    """Fait une ligne de n triangles à partir du point (x;y)."""
    turtle.up() #lève le stylo
    turtle.goto(x,y) #se rend sur le point de coordonnées (x;y)
    turtle.down() #descend le stylo
    for i in range(n):
        triEqui(x,y,c)
        x=x+c #augmente l'abscisse de c pour faire le triangle qui suit à côté du précédent

def ligneComplete(x,y,c):
    for i in range(3):
        ligneTriangles(x,y,c,4)
        x=x+5*c

ligneComplete(-300,0,40)
turtle.mainloop()