Outils personnels
Vous êtes ici : Accueil Blog Python
Navigation
 
Actions sur le document

Python

Filed Under:

Du vrac pour Python

Python


Apprendre à programmer Day 11

Filed Under: Python

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


Donc première journée sur Python.
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
L'affectation copie la référence pas la valeur
x=3
x=y=3
x,y=i,j
Les nombres en Python :
  • entier : 0 1 4
  • entier long : 0L 4L 3L
  • nombre à virgule flottante : 1.0e100
  • nombre imaginaire
Apostrophes triples ou doubles pour plus de richesse
>>> 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 chaines ont des méthodes

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

Un module contient des instructions, des fonctions et des classes, est un fichier d'extension .py
utiliser dir() pour avoir la liste des attributs d'un module ou ipython en shell
import math
dir(math)
Les divers modules Python :
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

Les données et les méthodes sont encapsulées dans des objets. La classe est l'abstraction d'une collection d'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

Filed Under: Python

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

Filed Under: Python

J'ai commencé par la lecture suivante http://wikipython.flibuste.net/

Qui donne de nombreux liens

[en] Site officiel de Python:

[fr] Autres sites :

[en] Autres sites :

dont une excellente carte sur python.

Les bonne pratique sous Python :
  • Importer un module python ne faisant pas partie de la distribution standart

Si un programme utilise un module ne faisant pas partie de la distribution standard de Python, il peut être difficile pour un utilisateur de deviner de quel module il s'agit et où le télécharger.
try:
    import win32com.client
except ImportError:
    raise ImportError, 'This program requires the win32all extensions for Python. See http://starship.python.net/crew/mhammond/win32/'
On utilise donc un try/except en début de programme.
  • 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

Pour cela il faut créer une méthode repr dans tous les objets.
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
Si maintenant on créé un client et qu'on l'affiche:

  1 
  2 
mon_client = client(5,"Dupont")
print mon_client
On obtient:
<__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)
Maintenant, si on affiche un client:

  1 
  2 
mon_client = client(5,"Dupont")
print mon_client
On obtient:
<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

Ne pas faire
 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

Filed Under: Python
Une lecture instructive que je viens de trouver

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

Filed Under: Python

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"
On vois ici une méthode pas encore vu.
n=float(raw_input("Entrez la note N : "))
La possiblité de faire la conversion et l'interaction avec l'utilisateur en même temps.


  • 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] 
  • Exercice N°5

       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

Les modules sont des programmes Python qui contiennent des fonctions que l'on est amené à réutiliser souvent (l'équivalent en C serait les librairies). Les développeurs de Python ont mis au point toute une série de modules effectuant une quantité phénoménale de tâches.

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

Les chaînes de caractères présentent une différence notable, elles sont non modifiables. Une fois définie, vous ne pouvez plus modifier un de ses éléments; dans un tel cas Python renvoie un message d'erreur.

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