Présentation de Python

Les différentes manières d'utiliser Python

On peut programmer avec Python de plusieurs manières :

Il existe aussi des consoles en ligne.

Le logiciel Edupython

Aspect général d'EduPython

Pour compiler et exécuter un programme, il faut utiliser la touche .

Première partie : les bases du langage Python

La console

Le mode console se repère facilement avec les symboles >>> devant l'instruction.

Le but est d'ouvrir le logiciel EduPython et/ou le logiciel Jupyter afin de copier-coller les codes proposés. Attention : ne pas copier-coller les symboles >>>

Une vidéo de présentation de la console et d'EduPython. Cette vidéo commence par l'installation d'EduPython.

Quelques commandes

>>>print("hello world !")

Quelques exemples d'affectation de variables en mode console

L'instruction (en mode console) :
>>>x = 2
Le symbole = est utilisé pour affecter des valeurs aux variables

>>>print(x)

Remarquez l'absence de " ". Testez les lignes suivantes :

>>>x = "Hello world !"
>>>print("x")
>>>print(x)
L'instruction
>>>x = x+1
est très fréquente en informatique.

Sous python, on peut affecter une valeur à plusieurs variables simultanément :

>>>a,b=2,3
>>>a
>>>b

Les fonctions

A partir de cette section, vous devez écrire vos programmes dans l'espace des scripts et utiliser le symbole pour exécuter vos programmes.

En Python une fonction est définie par l'instruction composée def suivie du nom de la fonction et se termine obligatoirement par deux points : puis le bloc d'instructions qu'il ne faut pas oublier d'indenter.

Une fonction est utilisée comme une instruction quelconque. Dans le corps d'un programme, un appel de fonction est constitué du nom de la fonction suivi de parenthèses.

La notion de fonction en informatique relève du même concept qu'une fonction mathématiques, c'est-à-dire qu'on définit une fonction puis on l'applique à différentes valeurs.

def carree(a) :
		""" 
		Fonction permettant de renvoyer le carré du nombre a qui est en paramètre
		"""
		return a**2 # renvoie l'image de a par la fonction carree
	

Vous remarquerez le symbole : très important en Pyton qui marque le début d'un bloc.

C'est l'indentation qui délimite le bloc d'instructions.

Lorsqu'on définit la fonction carree(), a est appelé paramètre de la fonction. Lorsqu'on appelle la fonction avec une valeur explicite pour a, comme dans carree(3), on dira plutôt que 3 est un argument de la fonction.

En appelant la fonction carree() d'argument 3, on obtient 9

Quelques remarques.

Différence entre fonction et procédure.

Une fonction renvoie une valeur et une procédure ne renvoie rien. Le langage Python ne fait pas la différence entre les deux, il utilise l'instruction def pour les deux. Par contre l'instruction return n'est pas obligatoire dans le cadre d'une procédure.

Il est conseillé d'écrire return None dans le cadre d'une procédure, mais ce n'est pas une obligation.

Tester le programme suivant :

def affichage(mot1,mot2):
    print(mot1,mot2)
    

affichage("SNT","Python")

Transformer cette procédure en ajoutant return None à la fin de la fonction affichage . Tester la procédure.

Chercher l'erreur ( il y a une erreur à corriger).


def carré(x):
return x**2 
    
print(carré(1.7))

Chercher l'erreur ( il y a une erreur à corriger).


def quotient(x,y)
    return x/y 
    
print(carré(1.7))

Ecrire une procédure moyenne qui reçoit deux nombres (nb_1 et nb_2) en paramètres et qui affiche la moyenne.

Ecrire une fonction moyenne qui reçoit deux nombres (nb_1 et nb_2) en paramètres et qui retourne la moyenne.

Ecrire une fonction vitesse, qui reçoit deux paramètres (la distance d en mètre et le temps de parcours t en seconde) et qui retourne la vitesse en m/s.

Les structures conditionnelles

Un programme doit souvent prendre en compte différents cas et s'adapter à différentes situations.

Il est alors nécessaire d'écrire des conditions, c'est-à-dire des expressions logiques dont le résultat est soit "Vrai" soit "Faux".

Voici comment s'écrit la structure conditionnelle en python :

if condition :
	instruction(s)
else :
	instruction(s)

Vous remarquerez le symbole : très important en Pyton qui marque le début d'un bloc.

C'est l'indentation qui délimite le bloc d'instructions


# Premier exemple pour vérifier si le code saisi par l'utilisateur est bien Ktimo2004
identifiant=input("Identifiant?")
if identifiant=="Ktimo2004":   #  l'égalité est testée avec ==
	print("Connexion autorisée") # l'instruction est  réalisée si la condition est vraie
				

Dans le cas où la condition est fausse, on peut donner des instructions à l'aide de la commande else .


identifiant=input("Identifiant?")
if identifiant=="Ktimo2004":   
	print("Connexion autorisée")
else:
	print("accès refusé")
	

La structure elif :

if condition1 :
	instruction(s)
elif condition2 :
	instruction(s)
elif condition3 :
	instruction(s)
else :
	instructions

a=float(input("Entrer un nombre : "))
if a>0 :
	print("Vous avez entré un nombre strictement positif.")  
elif a==0 :
	print("Vous avez entré un nombre nul.")
else :
	print("Vous avez entré un nombre strictement négatif.")
				

Il est possible d'utiliser plusieurs conditions en utilisant les connecteurs logiques AND et OR.


# Vérification de l'identifiant Ktimo2004 et du mot de passe Mprx24§
identifiant=input("Identifiant?")
motdepasse=input("Mot de passe ?")
if identifiant=="Ktimo2004" and motdepasse=="Mprx24§":   
	print("Connexion autorisée")
else:
	print("accès refusé")

Tester la luminosité d'un pixel

Niveau : accessible

Inspiré de Delagrave p120

On propose le code suivant :


def testLuminosite(R,V,B):
	if R+V+B > 255 :
		reponse = "c'est un pixel foncé"
	else :
		reponse = "ce n'est pas un pixel foncé"
	return reponse
	

Tester la fonction :


testLuminosite(12,7,5)
			

Abonnement et réseau social

Niveau : accessible

Inspiré de Delagrave p145>

" Un abonnement sur un réseau social de vidéo coûte 9.99 € par mois avec trois mois d'essai gratuit pour une seule personne ou 15.99 € avec 1 mois d'essai gratuit pour toute la famille".

Compléter la fonction suivante qui a pour argument le nombre de mois et qui renvoie le prix à payer.


def prix(mois):
	abonnement=input("Abonnement ? : seul ou famille ?")
	# faire afficher "abonnement minimal d'un an" si le nombre de mois est inférieur à 12
	# ...
	return(prix)
				

Tester la fonction avec :


print(prix(12))

Vous devriez observer :

Abonnement ? : seul ou famille ? seul 89.91

Niveau : plus difficile !

Proposer une fonction prenant pour argument un tuple des couleurs RGB codé en base 16 (Codage Hexadécimal). Cette fonction retourne None, elle permettra d'afficher pour chaque composante RGB si c'est plutôt clair ou plutôt foncé en positionnant un seuil à 127.

Chaque composante RGB est une couleur codée en hexadécimal sous 1 octet (de 00 à FF en hexadécimal ou de 0 à 255 niveau de couleur en base décimale).

Convertir les composantes en base 10 décimale et dire pour chaque couleur si la composante est plutôt claire ou plutôt foncée.


# Exécuter cette fonction
# coding: utf-8
				   
def pixelHexa(tupleHexa:tuple)->tuple:
	(hexaR, hexaG, hexaB) = tupleHexa
	#Extraction des valeurs du tuple et conversion en base décimale
	decR, decG, decB = (int(hexaR, 0), int(hexaG, 0), int(hexaB, 0))
	# Si la valeur decR est supérieure à 127 alors pixel plutôt foncé
	# Sinon pixel plutôt claire
	if decR > 127 :
		print ("Composante rouge plutôt foncée.")
	else : print("Composante rouge plutôt claire")
	# Reproduire pour decG et decB
	# ...
	return None
				   

Tester le code suivant :


tupleHexa = ("0x10","0x45","0xab")
pixelHexa((tupleHexa))
	   

Vous devriez observer :

Composante rouge plutôt claire

Composante verte plutôt claire

Composante bleu plutôt foncée.

Une vidéo qui donne offre une autre présentation :

Les boucles bornées - for

La boucle pour est utilisée quand on connait le nombre de fois où l'on doit répéter une suite d'instructions.

Pour illustrer cette structure nous allons partir sur un premier exemple : Obtenir la somme des n premiers entiers naturels. Pour n=4, on veut écrire un programme qui renvoie la valeur de 0+1+2+3=6.

La première ligne fait que la suite du code va être répétée n fois en incrémentant de manière automatique la variable i de 0 à n-1.

Dans un premier temps l'attribut dans range sera un entier, nous verrons dans la suite qu'il peut en être autrement.


for i in range(n):
	...
	les différentes instructions à répéter 
	...
		

def somme(n): #les int sont ici pour indiquer le typage des variables d'entrée et de sortie. Ici l'attribut est de type int et la sortie également   
    """""La fonction somme renvoie la somme des n+1 premiers entiers naturels.
    la fonction somme a pour attribut un entier (int) : n et renvoie un autre entier :S
    Pour n=4 : S=0+1+2+3=10""""" 
    S=0 #initialisation de la somme à 0
    for i in range(n):
     
        S=S+i
    return S
somme(20)

Programmer un signal clignotant : créer une fonction qui renvoie une liste contenant alternativement des 0 et des 1 symbolisant une led qui clignote.


def clignotant():
    led=[]
    for i in range(10):
        led.extend([1,0])
	return led
	

print(clignotant())
			

Un programme permettant d'afficher le mot clignotement.


import time #importe la bibliothèque time
for i in range (10):
    print ('Clignotement') # Affichage du mot Clignotement dans la console
    time.sleep(3) #Permet de suspendre durant 3 secondes l'exécution du programme
					

Modifier le code pour afficher 20 fois le mot "bonjour" toutes les secondes.

Le but est compter le nombre de 'e' dans une phrase.


def nbre_de_e(phrase):
    compteur=0
    for lettre in phrase:
        if lettre=="e":
            compteur=compteur+1
    return compteur

print("Le nombre de e est :",nbre_de_e("hello world!"))
			

Transformer l'algorithme pour qu'il compte le nombre de voyelles.

Une vidéo sur les boucles for :

Les boucles non bornées - while

Ces boucles, aussi appelées boucles "Tant que" ou boucles "While" effectuent les instructions situées dans le corps de la boucle tant qu'une condition est vérifiée. En langage Python, la syntaxe est la suivante :


			while condition_est_vraie:
				instruction 1
				instruction 2
				

A l'instar des structures conditionnelles (si alors sinon) et des boucles bornées (pour), le corps de la boucle est constitué d'instructions indentées.

Cas général : nombre d'itérations non connu :

On utilise cette boucle lorsque l'on ne sait pas à l'avance combien de fois seront effectuées les instructions du corps de la boucle. Cela peut être lié à la valeur d'une ou de plusieurs variables dont la valeur évolue, parfois à cause de la décision de l'utilisateur.

Niveau : accessible

Le nombre de connexions à un serveur double chaque jour. Au bout de combien de jours dépassera-t-il 100 000 ?


nb_jours=1
nb_connexions=400
while nb_connexions<100000:
	nb_connexions=nb_connexions * 2
	nb_jours=nb_jours+1
				
print(nb_jours)
					

Condition dépendante des valeurs d'une liste :

Niveau : accessible

Dans cet exemple, la condition dépendra de valeurs d'une liste (liste obtenue par un capteur ou issue d'un fichier au format .txt ou .csv par exemple).

Imaginons un capteur qui mesure les masses de marchandises sur un tapis roulant et les stocke au fur et à mesure dans une liste. Ces marchandises arrivent dans un camion. Le tapis roulant doit s'arrêter lorsqu'une certaine masse maximale, de 3000 kg est atteinte, le temps que le camion parte et un autre arrive. A ce moment un signal est émis.


def signal(chargement):              # la fonction signal, ici un message, pouvant être une vraie sonnerie ou l'allumage d'une led.
	print("SONNERIE")
  	print("Le camion est constitué de",chargement)
			

march=[100,500,200,1000,150,1000,2000]    # liste des masses des marchandises
masse=march[0]                            # la masse initiale est celle de la première marchandise
i=0
camion=[]                                  # liste du chargement du camion
while masse<= 3000:
	camion.append(march[i])                               
	i=i+1
	masse=masse+march[i]
					
signal(camion) 
							

Condition dépendante des valeurs d'un fichier

Niveau : plus difficile

Dans cet exemple, la condition dépendra de l'atteinte de la fin d'un fichier marchandises.csv comme ci-dessous

On veut ajouter les masses de toutes les lignes du fichier csv : le fichier marchandises.csv.


f=open("marchandises.csv","r")
entete=f.readline()              # on lit l'entête objet ; masse qui ne nous intéresse pas ici
ligne=f.readline()               # lecture de la 2ème ligne
masse=0
while ligne!="":                 # tant que la ligne n'est pas vide...
	liste=ligne.split(";"); masse_objet=int(liste[1])          # on transforme la ligne en liste, par ex ['objet1','100'] puis on affecte à la variable masse_objet le 2ème élément, transformé en entier.
	masse=masse+masse_objet
	ligne=f.readline()
print("la masse totale est",masse)
f.close
							

Les exemples ci-dessus peuvent illustrer les chapitres "données structurées et traitement" et "informatique embarquée et objets connectés" (les données captées peuvent alors être incluses dans un fichier .csv ou traitées à la volée).

Mot de passe

Ecrire la fonction mot_de_passe ci-dessous demande le bon mot de passe tant que celui-ci n'est pas fourni :


login='PYTHON'
def mot_de_passe():
	mdp=input('Entrez votre mot de passe :  ')
	...
mot_de_passe()
print('Vous pouvez continuer...')
						

Connexion au réseau d'un téléphone

Niveau : plus difficile

Ce programme demande à l'utilisateur s'il veut activer la connexion réseau de son téléphone tant qu'il répond "non".


localisation = "oui"
connexionReseau = "non"
while localisation == "oui" and connexionReseau == "non":
	print("Votre localisation est enregistrée mais n'est pas envoyée au serveur")
	connexionReseau = input("Voulez-vous activer la connexion réseau ?")
print("Votre localisation est enregistrée et est envoyée au serveur")
					

Ecrire un programme dans lequel la connexion réseau n'est pas activée et qui demande à l'utilisateur s'il veut activer le partage de localisation tant qu'il répond "non". A l'activation de la localisation, il affiche "Votre localisation est enregistrée".

Une vidéo de présentation des boucles while :

Et une autre :

Observer le déroulement d'un programme en Python

Pour observer l’exécution d’un programme, nous pouvons utiliser une application web : pythontutor

Une vidéo présentant le fonctionnement de pythontutor :

Deuxième partie : des programmes plus avancés dans les thèmes de SNT

Dans cette partie, nous vous proposons une succession d'activités pour SNT qui demandent un certain niveau d'expertise en python.

Quelques activités sur les structures conditionnelles à travers quelques thèmes de SNT

Au format jupyter : Pour aller plus loin sur les conditions.

Au format pdf : Pour aller plus loin sur les conditions.

Le fichier de corrections et les fichiers nécessaires à la réalisation des activités : Corrections et les fichiers nécessaires.

Quelques activités sur les structures bornées et non bornées à travers quelques thèmes de SNT

Au format jupyter : Pour aller plus loin sur les boucles bornées.

Au format pdf : Pour aller plus loin sur les les boucles bornées.

Au format jupyter : Pour aller plus loin sur les boucles non bornées.

Au format pdf : Pour aller plus loin sur les boucles non bornées.

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)

Des ressources supplémentaires par thèmes

Dans les applications proposées les docstring et commentaires décrivent les actions du code.

Le thème web

# Créé G.V. en Python 3.4
# coding: utf-8

'''
=================

Lecture de pages web
Formation SNT Académie de Reims 2019-2020


====================
'''

import urllib.request
#https://docs.python.org/fr/3/library/urllib.html

def nb_occurrences(mot,adrWeb):
    "Renvoie le nombre d'occurrences de la chaine de caractères 'mot' dans la page Web"
    pageWeb=urllib.request.urlopen(adresseWeb)
    codeHTML=str(pageWeb.readall()) # code de la page web
    nbocc=codeHTML.count(mot)  #l est du type byte. On utilise donc str(l) pour le convertir en chaine de caractères
    return nbocc

def listeLiens(adrWeb):
    "Renvoie le nombre d'occurrences de la chaine de caractères 'mot' dans la page Web"
    import re
    expRegLienWeb = re.compile('<a href="?(.*?)"?>',re.IGNORECASE)
    pageWeb=urllib.request.urlopen(adresseWeb)
    codeHTML=str(pageWeb.readall()) # code de la page web

    lLiens=expRegLienWeb.findall(codeHTML)
    return lLiens

def nbLiensPagesLiees(adrWeb):
    "renvoie le nombre de pages liées à adrWrb ainsi que le total des liens de ces pages"
    lLiens=listeLiens(adrWeb)
    nbLiens=0

    for lien in lLiens:
                nbLiens=nbLiens+nb_occurrences("< href=",lien)
    return nbLiens,len(lLiens)


def afficheInfos(adresseWeb):
    "Affiche des informations sur la page"
    pageWeb=urllib.request.urlopen(adresseWeb)
    print("Informations sur la page ",adresseWeb)
    print(pageWeb.info())
    print('code de la réponse :',pageWeb.getcode())


adresseWeb="https://fr.m.wikipedia.org/wiki/Jude_Law"
print("             Pour la page ",adresseWeb)
lLiens=listeLiens(adresseWeb)
print("Liste des liens de cette page :")
print(lLiens)
#afficheInfos(adresseWeb)
monMot="acteur"
nbo=nb_occurrences(monMot,adresseWeb)
print(" On a trouvé %d fois le mot %s dans le code source de la page web %s"%(nbo,monMot,adresseWeb))


nbl,nbp=nbLiensPagesLiees(adresseWeb)
print(" la page %s pointe sur %d pages web qui elles-mêmes pointent sur %d pages web soit une moyenne de %1.1f liens par pages filles"%(adresseWeb,nbp,nbl,nbl/nbp))

Le thème internet

Pour ce code, le fichier csv nécessaire à son exécution se trouve après le code en téléchargement.

# Créé G.V. en Python 3.4
# coding: utf-8

'''
=================


Formation SNT Académie de Reims 2019-2020
====================
'''
import os

def repondAuPing(adresse):
    #renvoie True si le serveur correspondant à l'adresse a répondu à un ping
    #cette adresse est une chaine de caractères comme "216.58.213.131" ou "www.google.fr"

    reponseAuPing=os.popen('ping '+adresse+' -n 1 -w 500').read()
    if reponseAuPing.find('TTL')>1:
        return True
    else:
        return False

def afficheTestAdresse(adresse):
    if repondAuPing(adresse):
            print (adresse, "a répondu au ping")
    else:
            print (adresse, "n'a pas répondu au ping")
    return

def afficheTestPlage(chaine3premiersOctets):
    for k in range(256):
        afficheTestAdresse(chaine3premiersOctets+"."+str(k))
    return

def afficheTestListe(lAdresses):
    "Affiche les résultats d'un ping auprès de chaque adresse de la liste"
    for adr in lAdresses:
        afficheTestAdresse(adr)
    return 0

def afficheTestCSV(nomFichier="adrverbes.csv"):
    "Affiche les résultats d'un ping auprès de chaque adresse d'un fichier texte"
    monfichier = open(nomFichier, "r")
    for adr in monfichier:
        afficheTestAdresse(adr)
    monfichier.close()
    return




print(repondAuPing("192.168.1.1"))
print(repondAuPing("192.168.1.11"))
print(repondAuPing("216.58.213.131"))


afficheTestListe(['www.etre.fr','www.avoir.fr','www.faire.fr','www.dire.fr','www.pouvoir.fr','www.aller.fr','www.voir.fr','www.vouloir.fr'])

afficheTestPlage("192.168.1")
afficheTestCSV("adrverbes.csv")

Fichier csv à placer dans le même répertoire que le fichier Python.

Les réseaux sociaux, parcours de graphes

Représentation simple d'un graphe à l'aide de la bibliothèque networkx.

On cherche à représenter un réseau social où les sommets sont numérotés. Dans l'exemple ci-dessous, on numérote de 0 à 4.


import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

# Définir un graphe avec des sommets représentés par des nombres.
                       
g=nx.Graph() # Définition du graphe
g.add_nodes_from(range(5)) # Cinq sommets pour le graphe

g.add_edges_from([(0,1),(3,4),(4,2),(1,3),(4,0),(1,2)]) # Définition des liaisons entre les sommets.

options = {
    'node_color' : 'yellow',
      'node_size'  : 550,
      'edge_color' : 'tab:grey',
      'with_labels': True
}

plt.figure()
nx.draw(g,**options) # Dessin du graphe
plt.show() # Affichage du graphe

# Exercice : modifier la couleur du graphe, la taille, les liens.

Dans la cellule suivante, modifier le code de la cellule pour ajouter un lien entre le noeud 0 et le noeud 3 puis entre le noeud 0 et le noeud 2. Ajouter le sommet 5. Ajouter un lien entre le noeud 5 et le noeud 3.

Pour continuer ce travail, vous pouvez télécharger le fichier jupyter.

La photographie numérique et la cartographie

Pour ce code, le fichier jpg nécessaire à son exécution se trouve après le code en téléchargement.

# -*- coding: utf-8 -*-
'''
======================
Traitement d'images
Créé par G.Valance en Python 3.4
Formation Python Académie de Reims 2018-2019

Ceci est un début de programme de traitement d'images selon le programme SNT.

'''

from PIL import Image
from PIL.ExifTags import TAGS #Pour avoir les intitulés des Tags présents dans les données exif d'une image

def coordGPS(mon_image):
    "Renvoie les coordonnées GPS en mode texte"
    "copiable/collable dans Geoportail https://www.geoportail.gouv.fr/carte"
    "On gagnera beaucoup à faire exécuter ce code pas à pas dans la console ou en mode debug "
    "afin de permettre aux élèves de voir combien, en fait, le code de cette fonction est trivial"

    dexif=mon_image._getexif()  #le dictionnaire correspondant aux données exif de l'image
    coord=dexif[34853]  #l'élément correspondant aux coordonnées GPS

    N_ou_S=coord[1] # N ou S
    tlat=coord[2] #tuple contenant les fractions correspondant aux degrés minutes secondes
    latdeg=tlat[0][0]/tlat[0][1] #Valeurs décimales à partir des fractions
    latminf=(tlat[1][0]/tlat[1][1]) #Valeur décimale des minutes
    latmin=int(latminf)             #Valeur entière des minutes
    latsec=int(tlat[2][0]/tlat[2][1]+(latminf-latmin)*60)  #Aux secondes on ajoute la partie fractionnaire des minutes
    latdec=latdeg+latmin/60+latsec/3600 #Valeur décimale de la latitude

    E_ou_W=coord[3]   #E ou W
    tlong=coord[4]  #tuple contenant les fractions correspondant aux degrés minutes secondes de la longitude
    longdeg=tlong[0][0]/tlong[0][1]
    longminf=(tlong[1][0]/tlong[1][1])
    longmin=int(longminf)
    longsec=int(tlong[2][0]/tlong[2][1]+(longminf-longmin)*60)
    longdec=longdeg+longmin/60+longsec/3600

    s="%d°%d'%d""%s "%(latdeg,latmin,latsec,N_ou_S)+"%d°%d'%d""%s"%(longdeg,longmin,longsec,E_ou_W)#Coordonnées Sexagécimales
    s="%f%s,%f%s"%(latdec,N_ou_S,longdec,E_ou_W)   #Coordonnées Décimales
    return s

def demo(mon_image):
    dexif=mon_image._getexif()  #le dictionnaire correspondant aux données exif de l'image
    for k in [272,306,34853]:
        nomk = TAGS.get(k)  #Pour récupérer l'intitulé du tag N°k présent dans dexif
                            #On pourra aller voir http://www.exiv2.org/tags.html
        print("Donnée n°%d %s :%s"%(k,nomk,dexif[k]))
    print("Coordonnées de la prise de vue à copier coller dans Geoportail : %s"%coordGPS(mon_image))



mon_image=Image.open("leonard.jpg") #48°51'40" N 2°20'12" E  ou 48.861111111111114 2.336666666666667

demo(mon_image)

Fichier jpg à placer dans le même répertoire que le fichier Python.

La photographie numérique

Pour ce code, le fichier jpg nécessaire à son exécution se trouve après le code en téléchargement.

# -*- coding: utf-8 -*-
'''
======================
Traitement d'images
Crée par G.Valance en Python 3.4
Formation Python Académie de Reims 2018-2019

Ceci est un début de programme de traitement d'images selon le programme SNT.

'''

from PIL import Image

def negatif(mon_image):
    "Renvoie le négatif de mon_image"
    image2=mon_image.copy()
    (l, h) = image2.size
    for y in range(h):
        for x in range(l):
            c = image2.getpixel((x, y))
            inv = (255-c[0],255-c[1],255-c[2])
            image2.putpixel( (x, y), inv)
    return image2

mon_image=Image.open("buse.jpg")
mon_image.show()
mon_image_neg=negatif(mon_image)
mon_image_neg.show()

Fichier jpg à placer dans le même répertoire que le fichier Python.
# -*- coding: utf-8 -*-
'''
======================
Traitement d'images
Créé par G.Valance en Python 3.4
Formation Python Académie de Reims 2018-2019

Ceci est un début de programme de traitement d'images selon le programme SNT.

'''

from PIL import Image

def image_avec_un_point(l=200,h=200):
    "Renvoie une image avec un pixel blanc au centre"
    image1 = Image.new('RGB', (l,h))
    image1.putpixel( (50, 50),(255,255,255))
    return image1

mon_image=image_avec_un_point(l=100,h=100)
mon_image.show()

# -*- coding: utf-8 -*-
'''
======================
Traitement d'images
Créé par G.Valance en Python 3.4
Formation Python Académie de Reims 2018-2019

Ceci est un début de programme de traitement d'images selon le programme SNT.

'''

from PIL import Image

def image_avec_un_point(l=200,h=200):
    "Renvoie une image avec un pixel blanc au centre"
    image1 = Image.new('RGB', (l,h))
    image1.putpixel( (50, 50),(255,255,255))
    return image1

def image_avec_une_ligne(l=200,h=200):
    "Renvoie une image avec un pixel blanc au centre"
    image1 = Image.new('RGB', (l,h))
    for i in range(l):
        image1.putpixel( (i, h//2),(i % 256,100,0)) # // division entière. % Pour que la composante Rouge soit entre 0 et 255
    return image1

def image_avec_un_degrade(l=200,h=200):
    "Renvoie une image avec un pixel blanc au centre"
    image1 = Image.new('RGB', (l,h))
    for i in range(l):
      for j in range(h):
        image1.putpixel( (i, j),(i % 256,j%256,0)) # // division entière. % Pour que la composante Rouge soit entre 0 et 255
    return image1

mon_image=image_avec_un_degrade(l=256,h=256)
mon_image.show()

Ressources supplémentaires

Le parcours france IOI

Sur le site FranceIOI, vous avez la possibilité de créer un groupe et demander aux élèves de s'inscrire à ce parcours.

Vous pourrez visualiser l'avancée des élèves.

Site france IOI

Des ressources eduscol

Les ressources Eduscol pour SNT

Des vidéos

Quelques espaces vidéos

Le programme de SNT

Lien vers le programme

Les ressources produites par les formateurs

Les ressources produites pour cette formation.

Un mémo Python

Téléchargement du mémo en version pdf Téléchargement du mémo en version docx

L'ensemble de ce site

Le squelette complet de ce site .