Actions sur le document
Python
Du vrac pour Python
Python
Apprendre à programmer Day 11
Ma premiére journée de formation man to man avec l'équipe de Pilot Systems Consulting que je remercie au passage.
La formation en question : http://www.pilotsystems.net/activites/formations/sessions/formation_zope_mai_2006/fr
Mini résumé de la journée :
Python est un langage interprété avec un typage fort mais dynamique et orienté objet, la gestion de la mémoire est implicite, tout est objet, peu de ponctuation, l'intentation définit les blocs.
Les variables :
- pas besoin d'être déclaré
- doivent recevoir une valeur avant d'être utilisé
- suit une convention de nommage classique : to_to toto3 mais pas 3toto
- sont des références : copier une variable ne copie pas son contenu
- l'objet rien est None
x=3Les nombres en Python :
x=y=3
x,y=i,j
- entier : 0 1 4
- entier long : 0L 4L 3L
- nombre à virgule flottante : 1.0e100
- nombre imaginaire
>>> str = ''' l'aouette dit "cui cui" '''Les chaines sont des séquences :
- récuperer un caractére par l'indentation
- récuperer une sous-chaine par le slicing
Les tuples sont des séquences et ne peuvent pas être modifiés, utiliser + pour concaténer les tuples
Les listes, append() pour ajouter un élément, del pour supprimer, utiliser + pour concaténer les listes
Les dictionnaires associent des clefs à des valeurs
Manipuler des clefs et valeurs :
- v.keys()
- v.values()
- v.items()
Mesure de taille : pour obtenir le nombre d'éléments d'une séquence ou d'un dictionnaire : len ()
Pour itérer sur un intervalle numérique, utiliser range()
Tests de vérité :
- Faux : 0, False, None, (len(x) == 0)
- Vrai : nombre non-nul, True, (len(x) != 0)
- Comparaison : == != > <= >= >
- Identité (de référence) : is is not
- Appartenance (séquence) : in not in
Les modules
utiliser dir() pour avoir la liste des attributs d'un module ou ipython en shell
import mathLes divers modules Python :
dir(math)
Module glob pour créer des listes de noms de fichiers à partir d'un motif de recherche
- Module re pour des recherche sur les sous-chaines
- Module math pour différentes fonctions matheuses
- Module random fournit des générateurs aléatoires
- Module urllib permet de lire le contenu d'un site web
- Module smtplib permet d'envoyer des emails
- Module datetime permet de manipuler les dates et les heures
- Module zlib, gzip, bz2, zipfile, tarfile pour la compression de données
- Module xmlrpc permet d'accéder à des procédures distantes
- Module Products.PythonScripts.standard des fonctions utilitaires pour les Python Scripts dans Zope
IMPORTANT : Dans Zope seul les modules standards sont autorisés
# Autorisation de tout un module
allow_module('nom_du_module')
Programmation orienté objet
La classe est un espace de nom pour ses attributs
On instancie une classe en appelant la classe comme une fonction
Un constructeur : la méthode __init__ est appelée si elle existe
Les méthodes sont des fonctions de classe
Héritage : réutilisation d'attributs, un héritage multiple permet une synthèse de plusieurs comportements
La gestion des exceptions :
chaque erreur provoque le lancement d'une exception
utilisation du try ... except...
la section finally ... permet une récupération des erreurs
Astuce du jour :
Avec ipython :
import os
os? : aide en ligne sur le module
os?? : code source en ligne du module
Listes des modules standarts de Python : http://docs.python.org/modindex.html
python exo.py -v pour passer un test simple
Apprendre à programmer avec Python Day 8
Objectifs
Savoir développer en Python. Connaître les types et builtins de base et les modules couramment utilisés (re, minidom, urllib, xmlrpclib, sys, random, math, sets, os, time)
Pistes pour la formation
Divers tutoriels existent pour Python, dont :
- la doc officielle de Python : http://docs.python.org/tut/tut.html
- dive into Python de Mark Pilgrim : http://diveintopython.org/toc/index.html
- how to think like a computer scientist Learning with Python : http://www.ibiblio.org/obp/thinkCSpy/
Apprendre à programmer avec Python Day 6
J'ai commencé par la lecture suivante http://wikipython.flibuste.net/
Qui donne de nombreux liens
[en] Site officiel de Python:
- http://www.python.org/
- http://www.python.org/download/ (téléchargement)
- http://www.python.org/doc/ (docs en général)
- http://www.python.org/doc/Intros.html (introductions)
- http://www.python.org/doc/FAQ.html (Foire Aux Questions)
- http://www.python.org/doc/Hints.html (Conseils, Guides)
- http://www.python.org/sigs/ (groupes d'intérêts spécifiques)
[fr] Autres sites :
- http://www.afpy.org
- http://www.python-fr.org
- http://www.p3b.org
- http://fr.diveintopython.org
- http://pythonfr.org/
- livre en ligne "Aprendre à programmer avec Pythyon" de Gérard Swinnen http://www.ulg.ac.be/cifen/inforef/swi/python.htm
- http://python.gnu-gml.net (Planète)
[en] Autres sites :
- http://py-howto.sourceforge.net/ (HOWTOs)
- http://www.faqts.com/knowledge_base/index.phtml/fid/199 (base de connaissances)
- http://rgruet.free.fr/#QuickRef (Page de référence rapide)
- http://perso.limsi.fr/pointal/python/pqrc/ (Carte de Références Rapides - à imprimer)
- http://www.pythonware.com/daily/ (actualité sur python)
Les bonne pratique sous Python :
-
Importer un module python ne faisant pas partie de la distribution standart
try:
import win32com.client
except ImportError:
raise ImportError, 'This program requires the win32all extensions for Python. See http://starship.python.net/crew/mhammond/win32/'
-
Concaténer des chaines sans le +
Si on a un grand nombre de chaîne à concaténer, on n'utilise pas l'opération +.
1 2 3 4 |
a = "coucou"
resultat = ""
for i in range(100000):
resultat = resultat + a
|
On ajoute plutôt les éléments à une liste, puis on fusionne les éléments de la liste.
1 2 3 4 5 |
a = "coucou"
b = []
for i in range(100000):
b.append(a)
resultat = "".join(b)
|
-
Concaténer les chemins et noms de fichiers
Si on a des chemins des noms de fichiers à concaténer, ne pas faire :
1 2 3 |
chemin = "mes fichiers" fichier = "monfichier.txt" chemin_complet = chemin + "\\" + fichier |
Si on ne sais pas sur quelle plateforme va fonctionner le programme, cela peu se révéler problématique.
Pour être sûr que le programme fonctionne partout, on utilise os.path.join:
1 2 3 4 |
import os.path chemin = "mes fichiers" fichier = "monfichier.txt" chemin_complet = os.path.join(chemin,fichier) |
Pour connaître le séparateur : os.path.sep.
-
Avoir des objets lisibles
Par exemple définissons une classe client. Chaque client possède simplement un numéro et un nom.
1 2 3 4 |
class client:
def __init__(self,numero,nom):
self.numero = numero
self.nom = nom
|
1 2 |
mon_client = client(5,"Dupont") print mon_client |
<__main__.client instance at 0x007D0E40>Ce qui n'est pas très parlant.
Changeons notre classe client et ajoutons la méthode repr (notez les deux underscore avant et après le nom repr):
1 2 3 4 5 6 7 |
class client:
def __init__(self,numero,nom):
self.numero = numero
self.nom = nom
def __repr__(self):
return '<client id="%s" nom="%s">' % (self.numero, self.nom)
|
1 2 |
mon_client = client(5,"Dupont") print mon_client |
<client id="5" nom="Dupont">Ce qui est nettement plus parlant.
-
Utiliser des chaînes avec des accents
L'utilisation d'accents dans les chaînes de caractères provoque souvent des déconvenues. Entre autre des erreurs "UnicodeEncodeError: 'ascii' codec can't encode." ou autres joyeusetées. Pour éviter cela, il faut indiquer qeul est l'encodage utilisé dans le fichier source et utiliser des chaines unicode.
1 2 3 |
# -*- coding: latin1 -*- good = u"Une chaîne avec des accents, correctement traitée." bad = "Une chaîne avec des accents, qui va poser des problèmes..." |
-
Faille potentiel dans une requête SQL
curs.execute("SELECT * FROM tbl WHERE id='%s'" % id)
Mais
curs.execute("SELECT * FROM tbl WHERE id=%s", [id])
Si nous avons plusieurs variables on utilisera dans ce cas un dictionnaire.Apprendre à programmer avec Python Day 5
http://ludovic.pinelli.free.fr/Python/PythonAmiHTML/PythonAmi-node2.htm.
Petit et concis, voilà ce que j'ai retenu du cours. Il touche des concepts déjà vu il y quelques jours mais aussi quelques suprises.
Comme par exemple dans un boucle while l'instruction continue.
Ensuite lecture du livre Python en concentré d'Alex Martelli que je recommande chaudement.
En prévision d'achat livre :
http://www.amazon.fr/exec/obidos/ASIN/2841773604/qid=1145978380/sr=2-3/ref=sr_2_9_3/403-6230327-9029246
Voilà pour aujourd'hui sur Python...
Apprendre à programmer avec Python Day 4
On commence la journée avec une série d'exercice sur les fichiers
-
Exercice n°1
Ecrivez un script ( ou programme) qui convertisse en mètres par seconde et en Km/heure une vitesse fournie par l'utilisateur en miles/heure. (Rappel 1mile : 1609 mètres).
Afficher seulement deux chiffres après la virgule.
#!/usr/bin/python # Message pour l'utilisateur print "Entrez la vitesse en miles/heure :" # Lis la chaine de l'utilisateur ch=raw_input() # Conversion d'un entier en réel mph=float(ch) # Calcul pour la conversion m/s mps=(mph*1609)/3600 # Conversion mile en metre kmph=mph*1.609 # Affichage print mph, "miles/heure", kmph, " Km/h", mps, "m/s" # Affichage formatee à 2 chiffre après la virgule print "Vitesse= %.2f miles/heures: %.2f Km/h ou %.2f m/s \n"%(mph,kmph,mps)
-
Exercice N°2
Déterminer si une année (dont le millésime est introduit par l'utilisateur) est bissextile ou non.
Une année A est bissextile si A est divisible par 4.
Elle ne l'est cependant pas si A est un multiple de 100, à moins que A soit multiple de 400.
#!/usr/bin/python # Pour préciser le codage sinon petit warning # -*- coding: iso-8859-15 -*- print "Entrez l'année :" ch=raw_input() annee=int(ch) if annee%4 == 0: bs = 1 else: if annee%100 == 0: bs = 0 elif annee%400 == 0: bs = 1 else: bs = 0 if bs == 1: print "L'année",annee,"est bissextile" else: print "L'année",annee,"n'est pas bissextile"
-
Exercice N°3
Convertir une note scolaire N quelconque, entrée par l'utilisateur sous forme de points (par exemple 27 sur 85), en une note standardisée suivant le code suivant:
Note Appréciation
N>= 80% A
80% > N >= 60% B
60% > N >= 50% C
50% > N >= 40% D
N < 40% E
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
n=float(raw_input("Entrez la note N : "))
max=float(raw_input("Entrez la valeur MAX :"))
pourcent=(n/max)*100
print "Pourcentage = %.2f \n" %(pourcent)
if pourcent >= 80.:
print "La note correspond à un A"
elif pourcent < 80. and pourcent >= 60.:
print "La note correspond à un B"
elif pourcent < 60. and pourcent >= 50.:
print "La note correspond à un C"
elif pourcent < 50. and pourcent >= 40.:
print "La note correspond à un D"
else :
print "La note correspond à un E"
n=float(raw_input("Entrez la note N : "))
-
Exercice N°4
Expliquez ce résultat:
>>> file = open('fichier.txt','r')
>>> lignes = file.readlines()
>>> for i in lignes:
print i
Ceci est
la premiere ligne
Ceci est
la deuxieme ligne
Ceci est
la troisieme ligne
Ceci est
la quatrieme et derniere
ligne
>>> file.close()
Réécrivez les instructions ad-hoc pour que Python écrive le contenu du fichier sans sauter de ligne.
On lis toutes les lignes du fichiers. Pour ne pas sauter de ligne rajouter print i[:-1]
Ecrivez
un
script qui génère automatiquement un
fichier texte (multi.txt)
contenant les tables de multiplications de 2
à 30
(chacune d'entre elles incluant 20 termes seulement).
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
file = open('multi.txt','w')
# generation de la table de 2 à 30
table=2
while table < 31:
i=0
while i < 20:
i+=1
file.write(str(i*table)+" ")
file.write("\n")
table=table+1
file.close()
Les modules Python
La plupart de ces modules sont déjà installés dans les versions standards de Python.
# Import du module
import random
# Utilisation de lafonction du module
>>> random.randint(0,10)
# La même mais plus simple
from random import randint
# La même mais on importe le tout
from random import *
Les Chaînes de caractères pour aller plus loin
Par conséquent, on peu modifier une chaîne mais il faut en créer une nouvelle. Par exemple les opérateurs de concaténation (+) et de duplication (*). On peut également générer une liste, qui elle est modifiable, puis revenir à une chaîne.
Il exist
