Introduction à Python
Ahmed Kachkach <ahmed.kachkach@gmail.com> - ETIC / INSA de Lyon - Novembre 2013
Avant-propos
. Nous allons utiliser la version 2.7 de Python
. La branche 3.x n'est pas *tellement* différente
. Vous pouvez télécharger l’interpréteur Python sur:
http://www.python.org/getit/
. Vous pourrez retrouver ces slides sur:
https://slid.es/halflings/python-intro/
. La branche 3.x n'est pas *tellement* différente
. Vous pouvez télécharger l’interpréteur Python sur:
http://www.python.org/getit/
. Vous pourrez retrouver ces slides sur:
https://slid.es/halflings/python-intro/
Qu'est ce que Python?
. Un langage de programmation moderne... créé en 1989 par Guido Van Rossum (ex-Google, maintenant chez Dropbox)
. L'accent est mis sur la lisibilité et la simplicité du code.
. Syntaxe épurée: pas d’accolade, pas de point-virgule, ...
. Un langage interprété, avec garbage collector
. Orienté-objet et dynamiquement typé...
. Syntaxe épurée: pas d’accolade, pas de point-virgule, ...
. Un langage interprété, avec garbage collector
. Orienté-objet et dynamiquement typé...
Langage Interprété?
. Le code n'est pas compilé en "langage machine" mais en un langage intermédiaire (bytecode) interprété par Python
. Avantage: "compilation" instantanée, possibilité de tester son code rapidement (sur l'interpréteur)
. Inconvénients: Performances théoriquement beaucoup plus faibles qu'un langage 'compilé'... rarement le cas en pratique.
Garbage collector?
Python utilise un garbage collector: les objets inutilisés sont automatiquement libérés de la mémoire.
Pas de pointeurs, pas de malloc, pas de free !
Attention: Un garbage collector ne rend pas les memory leaks impossibles... juste plus difficiles.
100% orienté-objet ?
Oui et non.
Les structures manipulées sont (presque) toutes des objets:
Plusieurs paradigmes possibles en plus de l'orienté-objet:
Les structures manipulées sont (presque) toutes des objets:
Fonctions, classes, modules, ...
Plusieurs paradigmes possibles en plus de l'orienté-objet:
Procédural, Fonctionnel...
Typage dynamiquE
Contrairement à C/C++ et Java qui sont statiquement typés, Python adopte un typage dynamique.
Le type d'une variable n'est déterminé qu'à l'exécution.
Le type d'une variable n'est déterminé qu'à l'exécution.
n = '42'
n = int(n)
n /= 2.5
DUCK TYPING
"Si je vois un oiseau qui vole comme un canard, nage comme un canard et cancane comme un canard... alors j'appelle cet oiseau un canard"
Le développeur se concentre sur le comportement et la sémantique des objets (méthodes, attributs, ...) plutôt que leur type "formel".
Le développeur se concentre sur le comportement et la sémantique des objets (méthodes, attributs, ...) plutôt que leur type "formel".
types couramment utilisés
Immutable: str / int / float / tuple
Mutable: list / set / dict"Python", 'a', "a" -> str 12390, -52, 0 -> int
3.14, -1.0, 0.0 -> float
(1,2), ('a',-1.0,42) -> tuple
["Python", 3.14, 300, [1, 2] ] -> list
{2, 3, 3, 3, 4, 5, 3, 1} (== {2, 3, 4, 5, 1}) -> set {"Pizza au thon": 8.25, "Pizza pepperoni": 9.25} -> dict
LIST
Liste chaînée, contenant tout type d'élément, préserve l'ordre d'ajout des éléments et les doublons.
ingredients = ['Oignon', 'Tomate', 'Steak']
ingredients.append('Oeuf')
# ['Oignon', 'Tomate', 'Steak', 'Oeuf']
ingredients += ['Sel', 'Cumin']
# ['Oignon', 'Tomate', 'Steak' , 'Oeuf', 'Sel', 'Cumin']
ingredients.pop(1)
# ['Oignon', 'Steak', 'Oeuf', 'Sel', 'Cumin']
liste_variee = ['Du texte', 42, ['Une', 'sous-liste'], (12, 0), 42]
SET
Ensemble d'éléments uniques (implémenté comme une hashtable). Ne préserve pas l'ordre et ne peut contenir que des éléments "hashables".
mon_set = {'a', 'b', 'a', 'c', 'e', 'c'}
# {'a', 'b', 'c', 'e'}
mon_set = set([1, 2, 1, 1, 3, 2])
# {1, 2, 3}
mon_set.add(42)
# {1, 2, 3, 42}
mon_set.remove(42)
# {1, 2, 3}
DICT
Structure qui fait la liaison entre une clé et une valeur.
(la clé doit être "hashable")
(la clé doit être "hashable")
mon_dico = dict()
mon_dico['canard'] = "Animal amphibien" mon_dico['poney'] = 42 mon_dico.items() # [('canard', "Animal amphibien"), ('poney', 42) ] mon_dico == {'canard': "Animal amphibien", 'poney' : 42} del mon_dico['poney'] # {'canard': "Animal amphibien"}
STR
Une chaîne de caractère (peut être composée d'un seul caractère). Immutable, donc impossible de modifier un de ses caractères.
name = "Sésame Ouvre Toi"
name.lower() == "sésame ouvre toi"
name.replace("Sésame", "Porte") == "Porte Ouvre Toi"
"mon.nom@domain.com".split('@') == ["mon.nom", "domain.com"]
"ahmed.kachkach@insa-lyon.fr".endswith("@insa-lyon.fr") == True
"{} {}!".format("Hello", "world") == "Hello world!"
Syntaxe de base
Instanciation, affectation
Conditions (sexistes !)x = 2.04
x += 1.1
alpha, beta = 'a', "b"
x = y = 0
un_dictionnaire = dict()
if (sexe == 'm' and salaire > 2500) or (sexe == 'f' and cuisine):
print "Tu es mariable !"
elif name in ["Emma Stone", "Brad Pitt", "Catherine Zeta-Jones"]: print "Mouais. Ça se discute."
else: print "Tu va mourir seul (ou avec tes 11 chats)."
ITERABLES
Plusieurs types "iterable": list, set, dict, string et même les fichiers !
SLICING
Un iterable peut être très simplement divisé en parties:
ma_liste[i:j] # de l'élément d'indice i inclus à l'élém. d'indice j exclus
ma_liste[i:] # de l'élément d'indice i à la fin
ma_liste[:j] # du début à l'élément d'indice j exclus
Itérations & BOUCLEs
Simple et efficace !
nains = ["Timide", "Atchoum", "Joyeux", "Simplet"]
for nain in nains:
print "{} est un nain".format(nain)
for i, nain in enumerate(nains):
print "{} se trouve à la place {}".format(nain, i)
liste_prix = {'Tomate': 2.5, 'Oignon': 0.95, 'Cake': 3.2}
for produit, prix in liste_prix.items():
print "{} coûte {}€".format(produit, prix)
while len(nains) < 10:
nains.append("Nain #{}".format(len(nains)))
LIST COMPREHENSION
Attention, c'est magique:
menu = ['oeuf mayo', 'spaghettis', 'oeufs durs', 'steak']
menu_sain = [plat.capitalize() for plat in menu if not 'oeuf' in plat]
# ['Spaghettis', 'Steak']
ipt = "aHmed@kAc##HkACh#.com;aKachkACh@i##nsA-LY#on.fR;InFo@clUB#iC.cOm"
emails = [mail.lower().replace('#', '') for mail in ipt.split(';')]
# ["ahmed@kachkach.com", "akachkach@insa-lyon.fr", "info@clubic.com"]
{email.split('@')[1] : email.split('@')[0] for email in emails}
# {'kachkach.com' : 'ahmed', 'insa-lyon.fr': 'akachakch', 'clubic.com': 'info' }
EXERCICE
Créez une liste contenant les mots: "Banane", "Pamplemousse", "Datte", "Orange" et "Pomme".
Créez une nouvelle liste contenant uniquement les mots ayant une longueur impaire.
Fonctions
Arguments sans type, possibilité de valeurs par défaut.
def une_fonction(arg_obligatoire, arg_optionnel=10): r = arg_obligatoire * arg_optionnel arg_obligatoire = 300 # ne sert à rien return r
une_fonction # <function une_fonction at 0x000000000022AD828> une_fonction.func_name # 'une_fonction' une_fonction(42) == une_fonction(42, arg_optionnel=10)
Et ... CLASSES !
class Pipeau(object):
def __init__(self, puissance=5):
self.puissance = puissance
def jouer(self):
print "tututu" * self.puissance
class Saxophone(Pipeau):
attribut_de_classe = "Epic ___ Guy"
def __init__(self, puissance=20, matiere="Bronze"):
super(Saxophone, self).__init__(puissance)
self.matiere = matiere
def jouer(self):
print "popopo" * self.puissance
depart_if = Pipeau()
depart_gi = Saxophone(100, matiere="Carton")
GESTION DE FICHIERS
# Lecture itérative fichier = open('notes_eleves') for ligne in fichier: print ligne fichier.close()
# Lecture en un coup fichier = open('autes_notes') print fichier.read() fichier.close()
# Écriture fichier = open('fichier_ecriture', 'w') fichier.write('Bla bla bla') fichier.close()
Gestion de FICHIERS
Si on n'est pas sûr que le fichier existe
fichier = open('mon_fichier.txt', 'w+')
Pour une ouverture plus "sûre"
with open('mon_fichier.txt', 'w') as fichier:
fichier.write('a\n')
fichier.write('b\n')
Exceptions
Attraper une exception
try:
f = open('fichier_inexistant') except IOError as e: print "Le fichier '{}' n'existe pas".format(e.filename) print "Exception: {}".format(e)
Provoquer une exception
poids = -25
if poids < 0:
raise ValueError("Poids négatif. Menteur !")
Librairies !
Riche librairie standard ("Python comes with batteries included") : networking, parsing, multiprocess, gestion de dossiers, appels système, etc.
Si vous voulez faire quelque chose, il y a 3 chances sur 4 * qu'une librairie Python le fasse déjà (très bien).
* Chiffres de l'institut de Pifometrie
* Chiffres de l'institut de Pifometrie
import urllib2
print urllib2.urlopen('http://google.com').read()
# <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title>...
COMMUNAUTÉ ET LIBRAIRIES
Au delà de la syntaxe et de la technique, l'un des plus gros points forts de Python est sa communauté.
Des milliers de librairies sont disponibles:
. Frameworks web: Flask, Django, Bottle, ...
. Networking : Tornado, requests, ...
. Parsing : lxml, BeautifulSoup, scraply, ...
Des milliers de librairies sont disponibles:
. Frameworks web: Flask, Django, Bottle, ...
. Networking : Tornado, requests, ...
. Parsing : lxml, BeautifulSoup, scraply, ...
. Calcul scientifique: numpy, scikit, matplotlib, scipy
. Jeu-vidéo : PyGame, Pyglet, PySFML, Ogre3D, ...
. Jeu-vidéo : PyGame, Pyglet, PySFML, Ogre3D, ...
Installer des librairies
1) Installez pip
sudo apt-get install python-pip
# ou
sudo easy_install pip
2) Puis installez facilement n'importe quelle librairie
sudo pip install requests
sudo pip install flask
sudo pip install lxml
3) Profit !!!111§§§§§Exemple
import lxml.html
url = "http://www.google.com/search?q={}"
query = raw_input("Que souhaitez vous chercher? ")
q_url = url.format(query)
print [n.text_content() for n in lxml.html.parse(q_url).xpath('//h3')]
FIN
Questions?
Ahmed Kachkach <ahmed.kachkach@gmail.com> - ETIC / INSA de Lyon - Novembre 2013
Introduction à Python
By Ahmed Kachkach
Introduction à Python
- 4,160