Modifications entre les versions 11 et 12
Version 11 à la date du 2012-02-24 12:32:07
Taille: 8963
Éditeur: DavinBaragiotta
Commentaire:
Version 12 à la date du 2012-02-24 12:33:55
Taille: 8955
Éditeur: DavinBaragiotta
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 393: Ligne 393:
  * créer une chaîne de caractères unique
   avec les infos des derniers items modifiés
   
(titre, URL... et éventuellement la date de dernière modification)
  * créer une chaîne de caractères unique : avec les infos des derniers items modifiés (titre, URL... et éventuellement la date de dernière modification)

Python : Atelier de base


INTRODUCTION


NOTIONS DE BASE

Interpréteur

  • python, ipython
  • interactivité / introspection

$ ipython

Syntaxe

Variables

  • nom, valeur, référence

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

Types

  • typage dynamique (pas besoin déclarer)

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é)
  • unpacking

a, b = 34, 56
  • fortement typé (pas de transtypage implicite)
  • transtypage str(), int(), float(), bool(), list(), tuple(), dict(), set()

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

  • objet.attribut
  • objet.methode()
  • objet.attribut.methode()

Introspection

  • variable. [+ tab]
  • variable?
  • type()
  • dir()
  • help()
  • exploration des types
  • concaténation : s1 + s2

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

  • imbrication

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

l[2], d[1611]
  • slicing

l[0:2]

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

Itération

  • while

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

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

Comparaisons et opérateurs logiques

  • false = 0, "", (), [], {}, None
  • and, or, not
  • < > <= >= == !=

  • x < y <= z

  • is, is not
  • in, not in

Conditionnel

  • if, elif, else

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

Fichiers

  • ouvrir, manipuler, fermer

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

Formattage de chaînes de caractères

  • substitution : %

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

  • créer une liste à partir d'un itérable avec un "one-liner"

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


Scripts

   1 #! /usr/bin/env python
   2 # -*- encoding: utf-8 -*-
   3 
   4 def coucou(nom):
   5     return u"Coucou %s!" % (nom,)
   6         
   7 if __name__ == '__main__':
   8     print u"--------------------------------------------------"
   9     print u"DÉBUT du script"
  10     print u"--------------------------------------------------"
  11     nom = raw_input("Quel est votre nom? ")
  12     print coucou(nom)
  13     print u"-----------------------------------------------"
  14     print u"FIN du script"
  15     print u"-------------------------------------------------"
  • shebang : #! /usr/bin/env python
  • encoding : # -*- encoding: utf-8 -*-
  • if __name__ == '__main__':

  • raw_input()
  • créer un répertoire projet/annuaire

  • créer dans ce répertoire un script Python nommé form.py qui :

    • demande à l'utilisateur son nom, prénom et année de naissance
    • salue l'utilisateur en affichant son prénom et son nom en majuscule
  • exécution ipython : run script
  • exécution python :

$ python script.py

Fonctions

  • convention de nommage
  • output : None par défaut
  • input : paramètres positionnels, nommés, *args, **kwargs
  • portée des variables

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 module
  • from module import nom
  • from module import nom as mon_nom
  • built-in : pas besoin d'import
  • standard library (shipped in) : import sans install
  • packages : importable si installé dans le path

import sys
sys.path
  • dans le répertoire projet/annuaire, créer un script Python nommé lib.py

  • déclarer la fonction age dans ce script

  • dans ipython, s'assurer d'être dans projet/annuaire puis tester l'import de la fonction

import lib
mon_annee_naissance = 1975
lib.age(mon_annee_naissance)
  • améliorer form.py en saluant le user qui a rempli le form et en lui donnant son âge

Modules

  • __init__.py

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

  • ajouter un fichier __init__.py dans le répertoire projet/annuaire pour le convertir en module

  • créer un fichier tests.py à la racine du répertoire projet/ (pour créer une suite de tests)

  • importer la fonction age dans tests.py pour la tester

Permanence de l'information

  • fichiers
  • sérialisation : import pickle

import pickle

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

exit()

import pickle

f = open('pickles')
pickle.load(f)
#objets = []
#for obj in pickle.load(f):
#    objets.append(obj)
f.close()
  • DB : sqlite3, mysqldb, psycopg2
  • ORM : sqlalchemy

EXERCICE

Objectif

Créer un script flux.py dans le répertoire projet/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

  • sudo apt-get install 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 le script qui fera le traitement voulu

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

6. servir froid

Algorithme

  • capter le flux RSS de www.auf.org
  • retenir le nombre d'items voulus
  • traiter les items retenus :
    • créer une chaîne de caractères unique : avec les infos des derniers items modifiés (titre, URL... et éventuellement la date de dernière modification)

Solution

Prenez le temps de coder vous-mêmes une solution... ... ensuite vous pouvez comparer avec : le solutionnaire

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

CONCLUSION

  • documentation + interactivité + introspection
  • scripts + modules
  • enjoy!

Ateliers/2012-02-23/Plan (dernière édition le 2012-02-24 12:33:55 par DavinBaragiotta)