Atelier 2012-02-23 : Python : Atelier de base


INTRODUCTION


NOTIONS DE BASE

Interpréteur

$ ipython

Syntaxe

Variables

a = 12
b = a
id(a)
id(b)

Types

n = None        # NoneType : type spécial voulant dire... rien
b = True        # bool : booléen... True ou False n'oubliez pas les majuscules

i = 15          # int : entier
f = 15.5        # float : décimal

s = "chaine"    # str : chaine de caractère, instancié avec "" ou ''
u = u"chaîne"   # unicode : chaîne de caractère unicode, instancié avec u"" ou u''

l = []          # list : liste d'objets (ordonné)
t = ()          # tuple : liste immuable d'objets
d = {}          # dict : dictionnaire de données (unique, non-ordonné)

ens = set([])   # set : ensemble (unique, non-ordonné)

a, b = 34, 56

float(a)

Built-in : fonctions built-in et structure du langage

type()                  # retourne le type de l'objet
dir()                   # retourne les noms derrière l'objet
help()                  # retourne l'aide
callable()              # dit si un objet est appelable, exécutable...

bool(), int(), str()... # initialisation ou transtypage
getattr()
isinstance(objet, Type) # teste le classe (ou type) d'un objet
issubclass()
super()
len()
min()
max()
open()
range()
raw_input()

print
del

Objets et namespaces

Introspection

nom = "Davin Baragiotta"
prenom, nom = nom.split()
nom.upper()
nom.lower()
nom.ljust(30)
nom = [prenom.lower(), nom.lower()]
username = ".".join(nom)

nom = "Davin Baragiotta"
username = ".".join(nom.split()).lower()

users = []
users.append(username)

davin = {'prenom':'Davin', 'nom':'Baragiotta'}
pascal = {'prenom':'Pascal', 'nom':'Bou Nassar'}

personnes = []
personnes.append(davin)
personnes.append(pascal)

statuts = [
    (1, u'Nouveau'),
    (2, u'En cours'),
    (3, u'Rejeté'),
    (4, u'Retenu'),
]

Conteneurs

l = [[1,2,3],[4,'salut',6],[7,8,9]]
d = {1611: {'nom':'Baragiotta', 'prenom':'Davin'}, 123: {'nom':'Bou Nassar', 'prenom':'Pascal'}}

l[2], d[1611]

l[0:2]

personne = {'nom':'x', 'prenom':'y'}
personnes = []

Itération

annee = 2012
while annee <= 2015:
    print annee
    annee = annee + 1   # annee += 1

for i in range(2012, 2016):
    print i

Comparaisons et opérateurs logiques

Conditionnel

liste = range(6)
if 5 in liste:
    print 'hourra 5'
elif 4 in liste:
    print 'hourra 4'
else:
    print 'pas hourra'

Fichiers

f = open('texte.txt')
for line in f.readlines():
    print line,
f.close()

Formattage de chaînes de caractères

for n in range(10):
    print "La puissance 2 de %d est : %d" % (n, n**2)

for p in personnes:
    print "Bonjour %s %s" % (p['prenom'], p['nom'].upper())

Compréhension de liste

cible = 'egypte'
contexte = [ligne for ligne in f.readlines() if cible in ligne]
commentaires = [ligne for ligne in f.readlines() if l.startswith('#')]


Scripts

if __name__ == '__main__':

Fonctions

def age(annee_naissance):
    return 2012 - annee_naissance

def ma_fonction(param1, param2, param3=None, param4=0, *args, **kwargs):
    """Ceci est ma fonction."""
    output = True
    return output

Import

import sys
sys.path

import lib
mon_annee_naissance = 1975
lib.age(mon_annee_naissance)

Modules

__init__.py
__name__ : nom du module, nom de fichier si importé, '__ main __' si exécuté (utile pour tests)

Permanence de l'information

import pickle

f = open('pickles', 'w')
pickle.dump(statuts, f)
pickle.dump(personnes, f)
f.close()

exit()

import pickle

f = open('pickles')
objets = []
for obj in pickle.load(f):
    objets.append(obj)
f.close()

EXERCICE

Objectif

Créer un script 'actualites' qui retournera les 5 dernières actualités affichées sur le site institutionnel de l'AUF : http://www.auf.org/flux/actualite/

Approche

1. utiliser python-feedparser

2. lancer interpréteur et suivre exemple de la doc :

3. introspecter (et imprimer dictionnaire pour voir ses clés) au besoin

4. coder un script qui fera le traitement voulu

5. lancer le script dans l'interpréteur pour confirmer son exécution correcte

6. servir froid

Algorithme

Solution

Des solutionnaires à cet exercice vous sont présentés dans : exercice-solutions.txt

Pour info, la solution ne fait que 8 lignes Python.

CONCLUSION