Exemples de scripts Python

Un livre de Wikibooks.

Exemples de programmes écris dans le langage de programmation Python dans sa version 2.5.

Sections

[modifier] Exemples de codes représentatifs

[modifier] Une introduction

ageDeEricPraline      = 50
ageDeHenryWensleydale   = 20

# Test
if ( 0 > ageDeEricPraline > 150 ) or ( ageDeEricPraline > ageDeHenryWensleydale) :
    print "l'age de Eric Praline est incorrect"
    
#echange : swap
ageDeHenryWensleydale, ageDeEricPraline = ageDeEricPraline,ageDeHenryWensleydale
print "age de Henry Wensleydale = %d , age de Eric Praline = %d" %(ageDeHenryWensleydale,ageDeEricPraline)
    

#>>>
#l'age de Eric Praline est incorrect
#age de Henry Wensleydale = 50 , age de Eric Praline = 20

[modifier] Les structures de données en natif

# Les listes :
maListeDeMeubles = ['table','chaise','frigo']
maListeDeMeubles.sort()  #Tri de la liste
for unMeuble in maListeDeMeubles:
   print 'longueur de la chaîne ', unMeuble, '=', len(unMeuble)

#les listes imbriquées:
laListeDesNombresPair = [ unNombrePair for unNombrePair in xrange(1000) if (unNombrePair % 2 == 0)]

#Les dictionnaires :
unAnnuaire = {'Laurent': 6389565, 'Paul': 6356785}
for unNom in unAnnuaire.keys():
   print "le nom %s a pour numero de telephone %d" %(unNom, unAnnuaire[unNom])


#Les tuples (n-uplet) : sequence constante
Couleur = ('Rouge', 'Bleu','Vert')
print Couleur[0], Couleur[1],  Couleur[2]

PointDeReference = (100, 200)
print " x0 = %d   y0 = %d "  %(PointDeReference[0],PointDeReference[1])

[modifier] Accès a une base de données

# Avec MySql :
import MySQLdb, pprint

uneConnectionBDD = MySQLdb.connect(host   ='192.32.12.10',
                                   user   ='admin',
                                   passwd ='988',
                                   db     ='uneBase')
leCurseur        = uneConnectionBDD.cursor()
unAuteur         = "'Zola'"
leCurseur.execute(""" SELECT title, description FROM books WHERE author = %s """ % (unAuteur,))
pprint.pprint(leCurseur.fetchall())
leCurseur.query("update books set title='assommoir' where author='Zola'")
uneConnectionBDD.commit()


# Par ODBC :
import dbi, odbc
connection = odbc.odbc('mondsn/monlogin/monpassword')
leCurseur  = connection.cursor()
leCurseur.execute('select clientid, name, city from client')
print leCurseur.fetchall()

[modifier] Programmation réseau - Internet

#Lire une page Web et afficher le source HTML

import urllib
print urllib.urlopen("http://fr.wikipedia.org/wiki/Accueil").read()

#Usage de FTP : demonstration des parametres nommés

import ftplib                
uneSessionFTP  = ftplib.FTP( host   = '198.12.45.123',
                             user   = 'MonLogin',
                             passwd = 'MonMotDePasse')

unFichier = open('monFichier.txt','rb')                 
uneSessionFTP.storbinary( 'STOR monFichier.txt', unFichier )   #envoi du fichier      
unFichier.close()                                       
uneSessionFTP.quit()               

[modifier] Tracé de courbes avec matplotlib

from pylab import plot, axis, savefig, show, title

plot( [1,2,3,4], 
      [1,4,9,16])
axis( [1, 4, 0, 16] )
title( 'ma courbe' ) 
savefig( 'uneCourbeSauvee.png' )
show()

[modifier] Utilitaires de la bibliothèque standard

#Encodage d'une image binaire sous forme de chaîne (Pour les protocoles qui n'acceptent que l'ascii)

import zlib, base64
lesDonneesImage = open('uneImage.gif','rb').read()
laChaineZippee  = base64.encodestring( zlib.compress(lesDonneesImage ))

[modifier] Jython : scriptage de JAVA en Python

#Exemple d'une applet scripté

from javax.swing import *

class MyApplet( JApplet ): 
  def init( self ):    
    unLabel= JLabel("Jython améliore la productivité")
    self.getContentPane().add( unLabel )

[modifier] Mail

#Envoi par mail du contenu d'un fichier

import smtplib
from email.MIMEText import MIMEText

IPduServeur    = 'localhost'
monFichierMail = open     ('monMailAEnvoyer.txt', 'rb') # lecture du fichier
leMessage      = MIMEText ( monFichierMail.read() ) # création d'un message text/plain 
monFichierMail.close()

leMessage['Subject'] = "Confirmation de l'exigence A441"
leMessage['From']    = "expediteur@phales.com"
leMessage['To']      = "destinataire@ecn.com"

leServeurSMTP = smtplib.SMTP(IPduServeur) # envoi du messge 
leServeurSMTP.connect()
leServeurSMTP.sendmail('expediteur@phales.com',
                       'destinataire@ecn.com',
                        leMessage.as_string())
leServeurSMTP.quit()

[modifier] Classe

Exemple de classe (voir programmation orientée objet).

class Fruit :
    def __init__(self) :
        pass

class Pomme(Fruit):
    """
    Cette classe represente une pomme.
    """
    Mangeurs = ["Jacques", "Nicolas","Virgile"]
    
    def __init__(self, couleur):
        """
        Pour construire une Pomme, donnez sa couleur.
        """
        Fruit.__init__(self)
        self._couleur = couleur
    
    def couleur(self):
        """
        Retourne la couleur de la Pomme.
        """
        return self._couleur
    
    def comestible(self, mangeur):
        """
        Dit si la pomme est comestible ou non,
        en fonction du mangeur.
        """
        if mangeur in self.Mangeurs:
            print mangeur, "mange des pommes"
        else:
            print mangeur, "n'aime pas les pommes"

petitePomme = Pomme("verte")
petitePomme.comestible("Pierre")      # Pierre n'aime pas les pommes
petitePomme.comestible("Nicolas")     # Nicolas mange des pommes

On remarque notamment la présence de documentation (optionnelle bien sûr) directement dans le code. La commande help() permet d'obtenir, dans l'interpréteur Python, cette aide directement :

>>> help(Pomme)

donne :

Help on class Pomme in module __main__:

class Pomme(Fruit)
 |  Cette classe represente une pomme.
 |
 |  Methods defined here:
 |
 |  __init__(self, couleur)
 |      Pour construire une Pomme, donnez sa couleur.
 |
 |  comestible(self, mangeur)
 |      Dit si la pomme est comestible ou non,
 |      en fonction du mangeur.
 |
 |  couleur(self)
 |      Retourne la couleur de la Pomme.
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |
 |  Mangeurs = ['Jacques', 'Nicolas', 'Virgile']

[modifier] WMI (sous Windows 2000/XP)

Lister les processus et leur nom

import wmi
controler = wmi.WMI ()
for unProcessus in  controler.Win32_Process ():
  print unProcessus.ProcessId, unProcessus.Name

Rebooter une machine à distance

import wmi
controler  = wmi.WMI (computer   = "Nom_Machine_Distante",
                      privileges = ["RemoteShutdown"] )
os         = controler.Win32_OperatingSystem (Primary=1)[0]
os.Reboot ()

[modifier] Automation Win32

#Exemple de pilotage de CATIA par la technologie COM/DCOM
import win32com.client 

catiaApplication  = win32com.client.Dispatch("CATIA.Application") 
monDocument       = catiaApplication.ActiveDocument.Product
nombreDeProduit   = monDocument.Products.Count 

for produits in range(nombreDeProduit): 
  produits = produits + 1 
  print monDocument.Products.Item(produits).Name

#Exemple de pilotage du lecteur multimédia
from win32com.client import Dispatch
leMediaPlayer       = Dispatch("WMPlayer.OCX")
uneMorceauDeMusique = leMediaPlayer.newMedia("C:/mesDoc/monTitre.wma") # ou mp3 
leMediaPlayer.currentPlaylist.appendItem(uneMorceauDeMusique)
leMediaPlayer.controls.play()
raw_input("appuyez sur ENTRER pour arreter la musique")
leMediaPlayer.leMediaPlayer.stop()

[modifier] ctypes

ctypes permet d'accéder directement à des dll.

import ctypes
# modification du fond d'ecran de windows
SPI_SETDESKWALLPAPER = 20
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 
                                           0, 
                                           "C:\\Mes documents\\Mes images\\maPhoto.bmp" ,
                                           0)
# Resolution de l'écran
SM_CXSCREEN = 0
SM_CYSCREEN = 1
taille_x = ctypes.windll.user32.GetSystemMetrics(SM_CXSCREEN)
taille_y = ctypes.windll.user32.GetSystemMetrics(SM_CYSCREEN)
print "La résolution d'écran est %d par %d" % (taille_x, taille_y)

[modifier] Data Mining - Réseaux bayésiens avec reverend

# les filtres Baysesiens permettent de classifier des données. 
# Exemple d'application : reconnaissance automatique de la langue, anti-Spam, cryptographie... 

from reverend.thomas import Bayes

unReseauBayesiens       = Bayes()
uneListeDePropositions  = [('math',        'on fait des calculs , des additions, des multiplications'),
                           ('math',        '3 + 4 = 7 ; 10 + 7 = 17 ; 99/11 = 9'),
                           ('math',        '12 + 10 -5 = 17 ; 70-10 = 60'),
                           ('math',        'le carré des 2 cotés du triangle sont liés par une relation'),
                           ('math',        'la fonction sinus ( sin ) sert à representer les phénomènes cycliques'),
                           ('math',        'sin (PI) = 3.14159 et cosinus (0) = 1' ),
                           ('philosophie', 'je disserte sur le sens de la vie'),
                           ('philosophie', 'être ou ne pas être, telle est la question'),
                           ('philosophie', 'je sais que je ne sais rien'),
                           ('philosophie', 'les phénomènes sont réels à condition que nous le souhaitions'),
                           ('philosophie', 'la raison est-elle toujours raisonnable ?'),
                           ('philosophie', 'le cerveau peut-il être compris ?'),
                           ('philosophie',  "l'univers peut-il être l'objet de connaissance ?"),
                           ('philosophie', 'le calcul a-t-il des limites intrinsèques ?'),
                           ('philosophie', "une relation peut être durable si l'homme la souhaite")]
                           
for ( uneCategorie, uneProposition ) in uneListeDePropositions:
   unReseauBayesiens.train( uneCategorie, uneProposition )  # entrainement du réseau


phraseAnalyse1 =  'voici un resultat  : 66/6 = 11 '
phraseAnalyse2 =  "je ne saurais dire s'il  pourra tout comprendre ... "
phraseAnalyse3 =  "le phénomène de la pluie pourrait être d'origine divine"
phraseAnalyse4 =  'la représentation bourbakiste des chiffres assure leur détermination'

for unePhrase in  [phraseAnalyse1, phraseAnalyse2, phraseAnalyse3, phraseAnalyse4] :
   solutions   =  unReseauBayesiens.guess(unePhrase)     # calculs de la catégorie 
   categorie   = solutions[0][0]
   probabilite = solutions[0][1]
   print "la phrase '%s' est de categorie '%s' avec une probabilité de '%d /100'  " %(unePhrase,categorie,probabilite *100)
   
 
# Resultats:
# la phrase 'voici un resultat  : 66/6 = 11 ' est de categorie 'math' avec une probabilité de '99 /100'  
# la phrase 'je ne saurais dire s'il  pourra tout comprendre ... ' est de categorie 'philosophie' avec une probabilité de '99 /100'  
# la phrase 'le phénomène de la pluie pourrait être d'origine divine' est de categorie 'philosophie' avec une probabilité de '92 /100'  
# la phrase 'la représentation bourbakiste des chiffres assure leur détermination' est de categorie 'philosophie' avec une probabilité de '55 /100'  

[modifier] Implémentation du crible d'Ératosthène

Ce script calcule les nombres premiers inférieurs à 200 en appliquant la méthode du crible d'Ératosthène.

# calcul des nombres premiers inferieurs a N
#initialisation
 N     = 200
liste  = range(2, N)                           # liste de 2 à N
nombre = 2
while (nombre*nombre <= N):                    # tant que le nb premier < a la
                                               # racine carree de N
   for i in liste[ liste.index(nombre) + 1: ]: #parcourt la liste avec ce nombre
       if i % nombre == 0:                     #un multiple du nombre est trouve
           del( liste[ liste.index(i) ] )      # on le raye de la liste
   nombre = liste[liste.index(nombre) + 1]     # on prend le nombre suivant non raye

print liste                                    #affichage du resultat

Voici une version algorithmiquement équivalente mais beaucoup plus rapide qui exploite la puissance du type liste de Python :

N        = 1000             #calcule des nombres premiers inferieurs a N
liste    = range(N+1)       #creation d une liste  de 0 et N
liste[1] = 0
nombre = 2

while (nombre ** 2 <= N):   # tant que le nombre a examiner est inferieur a
                            # la racine carree de N
   
   liste[ nombre*2 :: nombre ] = [0] * ((N // nombre) - 1) #eliminer tous les
                                                           #multiples du nombre
   # passer au nombre non examine suivant
   nombre += 1
   while not liste[nombre]:
       nombre += 1

liste = filter (None, liste)
print liste                 # et a la fin, on affiche le resultat

Que l'on peut enfin réduire à :

N, nombre = 1000, 2
liste, liste[1] = range(N+1), 0

while nombre**2 <= N:
   liste[nombre*2 :: nombre] = [0]*len( liste[nombre*2 :: nombre] )
   nombre += 1
print filter(None, liste)

[modifier] Les fonctions, les types et les classes sont des objets

#Les fonctions sont des objets
def uneFonction ( unEntier, uneChaine):
    "documentation de la fonction"
    print "unEntier : " +  str( unEntier )
 
#Vous pouvez d'ailleurs ajouter des attributs à la fonction:

uneFonction.compteur = 10
  
print "la fonction a pour nom :"            + uneFonction.__name__
print "la fonction a pour documentation : " + uneFonction.__doc__
print uneFonction.compteur

>>la fonction a pour nom :uneFonction
la fonction a pour documentation : documentation de la fonction
10


#Les types de base sont des objets
valeurOpposee =  -25 .__neg__()  # equivalent à - (-25)
print "la valeur opposée de -25 est :  " + str ( valeurOpposee )

#Les classes sont des objets
class Insecte : pass            # On definit une classe mère, qui ne fait rien pour l'instant
class Fourmi(Insecte):          # Definition d'une classe dérivée
    def marcher (self):
        print "je marche"

print "la classe Fourmi a pour classe mère :" + str ( Fourmi.__bases__)

#l'opposé de -25 est :  25
#la classe Fourmi a pour classe mère :(<class __main__.Insecte at 0x02B69A20>,)

[modifier] Graphique

[modifier] Tkinter

Cet exemple montre comment se servir de la bibliothèque Tkinter pour créer une interface graphique.

from Tkinter import *
fen   = Tk()
text1 = Label(fen, text='Bonjour !')
entr1 = Entry(fen)
bout1 = Button(fen, text='Quitter', command=fen.quit)
text1.grid( row=1, column=1)
entr1.grid( row=1, column=2)
bout1.grid( row=2, column=1)
fen.mainloop()

[modifier] WxPython

Cet exemple crée en WxPython une fenetre et un boite modale sur appui bouton - l'utilisation d'editeur WYSIWYG comme glade ou boa constructor est recommandée pour les grandes applications

from wxPython.wx import * 
ID_OK_BOUTON=100 

class PanneauPerso( wxPanel ): 
      def __init__(self, parent, id): 
         wxPanel.__init__(self, parent, id)    
         self.unChampText  =  wxStaticText(self, -1, "TextAvantLeClic", wxPoint(5, 5)) 
         self.unChampBouton = wxButton(self, ID_OK_BOUTON, "CliquerMoi", wxPoint(100, 5))
         EVT_BUTTON(self, ID_OK_BOUTON, self.OnClick) #enregistrement de la callBack
      
      def OnClick(self,event): 
         self.unChampText.SetLabel('ApresLeClic')     #sur appui bouton, modifer le champ texte
         b = wxMessageDialog( self, "Une Boite de dialogue","titre", wxOK) 
         b.ShowModal()                                #montrer un e boite de dialogue
         b.Destroy()
      

monApplication = wxPySimpleApp() 
maFenetre      = wxFrame(None, -1, "Titre de l Application") 
PanneauPerso ( maFenetre , -1) 
maFenetre.Show(1) 
monApplication .MainLoop()

[modifier] Turtle

Exemples de scripts Python/Turtle