Nicolas Dumoulin nicolas.dumoulin@irstea.fr
7 Juin 2017
Ce document est librement réutilisable selon les termes de la licence GNU FDL version 1.2 et supérieures.
Vous pouvez charger ce document interactif en version notebook (extension .ipynb), en démarrant ipython notebook
(version 2.7) depuis le répertoire contenant ce document, ou bien en faisant glisser le document sur la page web du notebook après l'avoir démarré. Voir aussi la documentation de notebook.
Ressources en lignes :
Deux modes d'utilisation :
Premier contact, démarrer la console interactive : python
(version 2.x selon les systèmes)
Pour quitter la console : [Ctrl] + [D]
ipython
est un interpréteur plus évolué qui propose de nombreuses extensions.
On peut taper une opération arithmétique et on obtient le résultat.
2 + 5 / 2
4*2
Vous pouvez taper les mêmes commandes dans un fichier texte (extension .py) et l'exécuter :
python monScript.py
Le typage d'une variable est dynamique, le type est inféré lors de l'affectation.
i = 1
d = 0.7
s = "bonjour"
nb = 3 + 2j
type(nb)
type(i)
type(d)
type(s)
La variable spéciale _
contient la dernière valeur affichée
3*2
_+2
s1 = "N'importe quoi" # avec des guillemets double, cela permet d'utiliser une apostrophe dans le texte
s2 = 'N\'importe quoi' # avec des guillemets simple, l'apostrophe doit être échappée avec l'antislash \
s3 = 'Je disais "N\'importe quoi"' # avec des guillemets simple, cela permet d'utiliser des guillemets doubles dans le texte
s4 = """Je disais "N'importe quoi" """ # avec trois guillemets doubles (ou simples), pas besoin d'échapper les guillemets et apostrophes
s5 = """Les triples guillemets permettent d'écrire
plusieurs lignes"""
print(s5)
i + d
Problème avec des types non compatibles
i + s
On doit alors transtyper (caster) les variables
"Votre valeur est : "+str(d)
str(i) + s
Variables booléenes
true = True
vrai = true
faux = False
On les trouve sous le nom de builtin functions dans la documentation anglophone.
La fonction print()
permet d'afficher le contenu d'une variable, et plus généralement une chaîne de caractère.
print(s1)
print("Ceci est un entier : "+str(i))
j=4
print("i = %d, j = %d" % (i,j))
%d pour les entiers, %f pour les flottants et %s pour les chaînes
La fonction help()
permet d'obtenir la documentation d'une fonction (python 3).
La fonction len
permet de connaître la taille d'un tableau
len("Bonjour")
Opérateurs et fonctions arithmétiques
Documentation : http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
5/2 # division entière en python 2.x mais division flottante à partir de 3.0
5.0/2
5.0//2
int(5.0//2) # conversion de float en int
5%2 # reste de la division entière
b = True
"oui" == "oui"
3+1 == 4 and 5*2 == 20
b == False or not 2 == 2 # utilisation du "et" logique et de la négation
not b == False and 2 != 2 # la négation ne sera appliquée qu'à la première expression
not (b == False and 2 != 2) # notez la différence avec les parenthèses
Documentation : http://docs.python.org/2/tutorial/controlflow.html
Attention à l'indentation !
i = 30
if i<30:
print("petit")
elif i==30:
print ("i vaut 30")
if i == 30:
print("fin")
else:
print ("grand")
if i%5 == 0:
print("multiple de 5")
if i==30: print("OK")
La fonction range
permet de créer des intervalles
len(range(3,10))
for i in range(4):
print(str(i) + " ici, c'est la boucle")
print("ici, c'est fini")
i=0
while i<5:
print("i monte")
i += 1 # i = i + 1
print(i)
L'indiçage des séquences commence à 0
t = [ 'un', 'deux', 'trois', 3.14 ]
t[0]
m = [[1,2],[3,4]]
m
Documentation :
Les chaînes de caractères sont des tableaux
s = "Bonjour, comment allez-vous?"
s[0:7] # slicing
s[:7] # l'indice de début est optionnel quand c'est 0
s[9:16]
s[-5:]
t[-1]='!' # modification du dernier élément du tableau
t
s1="un"
s2="deux"
s3 = s2
s2 = "rien"
print (s3) # s3 n'est pas modifé
l2 = [2,4,6]
l3 = l2
l4 = l2[:] # le slicing produit un nouveau tableau et donc un nouvel objet
l2[2]=12
print(l3) # l3 subit la modification sur l2, car les deux référencent le même objet
print(l4) # l4 n'est pas affecté, car il ne référence pas le même objet que l2
print("vous" in s) # test d'appartenance
Pour faire une boucle sur les éléments du tableau :
for element in t:
print(element)
for i in range(len(t)):
print(t[i])
Si vous voulez aussi l'indice, la fonction zip
est pour vous.
zip
retourne une liste d'éléments à 2 valeurs, qui sont donc affectés dans la boucle aux variables indice et element
zip(range(len(t)),t)
Bon, OK c'est un objet "zip" sur lequel on pourra itérer. Si on veut "voir" son contenu, on peut le convertir en liste.
list(zip(range(len(t)),t))
for indice,element in zip(range(len(t)),t):
print(str(indice) + " -> " + element)
Comment fonctionne l'affectation multiple
a,b = 1,2
print ("a = "+str(a))
print("b = "+str(b))
def mafonction():
return ["plop","tagada"]
s1,s2 = mafonction() # le premier élément du tableau retourné va dans s1, le deuxième dans s2
print(s1)
Listes d'associations clé/valeur
d = {'Janvier':31,'Février':28,'Mars':31,'Avril':30,'Mai':31,'Juin':30,
'Juillet':31,'Août':31,'Septembre':30,'Octobre':31,'Novembre':30,u'Décembre':31}
print("d = %s" % d)
print("septembre %s" % d['Septembre'])
print("boucle :")
for cle,valeur in d.items():
if valeur==31:
print(cle)
d2 = { "Paul" : { "categorie" : "VM1", "mean": 3.4, "sd": 1}, "Pierre" : {"categorie":"CM1", "mean":2, "sd":0.4}}
print(d2["Paul"]["mean"])
d2
Affichage disgracieux pour les caractères accentués dû à l'encodage en unicode, mieux géré avec python 3. Plus d'information sur la gestion de l'unicode avec Python 2.7.x ici.
d.pop('Septembre')
# print(d['Septembre']) # n'existe plus
print('Septembre' in d)
t = [1,4,8,5,4,7,10]
Comment récupérer les nombres pairs ?
Avec une boucle classique :
resultat = []
for element in t:
if element%2 == 0:
resultat.append(element)
print(resultat)
Avec les compréhensions de listes :
resultat = [element*2 for element in t if element%2 == 0]
resultat
[cle for cle,valeur in d.items() if valeur==30]
Avec la fonction filter
et une fonction anonyme lambda
def monfiltre(element):
return element%2 == 0
monfiltre(6)
list(filter(monfiltre, t))
resultat = filter(lambda element:element%2 == 0, t) # prend en argument une fonction de filtre et la liste à filtrer
print(resultat)
resultat = list(resultat) # nécessaire en python 3 car filter retourne un objet itérable de type "filter"
print(resultat)
resultat = map(lambda x:str(x), t) # applique une fonction à chaque élément
list(resultat)
print(str(t))
eval(str(t))
t2=t
t[0]=42
print(t)
t[0]=1
map(str, t) # simplification de l'exemple précédent, car la fonction str est adéquate au `map`
t[2]=8
t2= t[:]
t[2]=5
t2
def salut(nom):
print("Salut " + nom)
salut("Nicolas")
def salut2(nom, majuscule):
message = "Salut " + nom
if majuscule:
message = message.upper()
print(message)
salut2("Nicolas", True)
# salut2("Nicolas") # erreur car il faut 2 arguments
def salut3(nom, majuscule=True):
message = "Salut " + nom
if majuscule:
message = message.upper()
print(message)
salut3("Nicolas")
salut3("Nicolas", False)
salut3("Nicolas", majuscule=False) # argument nommé pour plus de clarté et lever des ambiguités
salut3(majuscule=False, nom="Nicolas")
Fonction avec retour de valeur en utilisant l'instruction return
def selection(liste, pair=True):
"""
Fais quelquechose.
"""
return [element for element in liste if (element%2 == 0) == pair]
print(selection([1,4,7,12]))
print(selection([1,4,7,12], pair=False))
help(selection)
Pour graver dans la silice vos fabuleuses lignes de code, vous pouvez les écrire dans un fichier.
Exemple avec ce fichier script.py :
a = 3
b = 4
print(a*b)
Vous pouvez déclarer plusieurs fonctions dans votre scripts et du code principal (hors fonction, qui sera exécuté) :
def salut(nom):
print("Salut " + nom)
salut("Nicolas")
Pour exécuter ce script :
python script.py
%run script.py
%run script.py
bonjour("Robert")
f = open('script.py', 'r')
print("Lit la ligne suivante dans le fichier :")
print(f.readline())
print("Lit le reste du fichier")
print(f.read())
f.close()
sortie = open('sortie.txt', 'w')
for valeur in ['un','deux','trois']:
sortie.write(valeur + "\n")
sortie.close()
%%bash
cat sortie.txt
with open('sortie.txt', 'r') as f:
num = 1
for ligne in f:
print(str(num) + " : " + ligne)
num += 1
Documentation : http://docs.python.org/2/tutorial/modules.html
Les bibliothèques additionnelles fournissent des fonctions et données supplémentaires en utilisant des modules pour éviter les conflits de nommage. Pour accéder à ces fonctions, vous devez au préalable importer le module correspondant.
import math
print(math.pi)
from math import pi
print(pi)
from math import *
print(pi)
from math import pi as thepi
print(thepi)
Ces modules peuvent être fournis par votre installation python, mais aussi par de simples scripts python.
import script
script.bonjour("Paul")
Si on importe un module du même nom, il écrase le précédent, d'où l'intérêt des alias si on veut utiliser les deux
from script import pi
print(pi)
print(thepi)
Le chargement du script a provoqué l'exécution du code hors-fonction (bonjour("Nicolas")
). Nous pouvons alors modifier notre script pour que ce code d'exemple (ou par défaut) ne soit exécuté que lorsque le script est invoqué directement :
if __name__ == "__main__":
bonjour("Nicolas")
import script2
from script2 import bonjour
bonjour('Nicolas')
%%bash
cat script2.py
Utilisation d'arguments avec %run, équivalent à exécuter le script avec la commande python script2.py Bernard
.
%run script2.py Bernard
help(bonjour)
sys
sys.argv
contient les arguments d'un script
if __name__ == "__main__":
import sys
bonjour(sys.argv[1])
import csv
with open('donnees.csv','r') as f:
for ligne in csv.reader(f):
print(map(int,ligne))
import csv
f= open('donnees.csv','r')
monCsvReader = csv.reader(f)
toutesMesDonnees = []
for ligne in monCsvReader:
donnees = list(map(int,ligne))
toutesMesDonnees.append(donnees)
f.close()
print(toutesMesDonnees)
import math
math.cos(math.pi)
from math import *
exp(0)
import requests
r = requests.get('http://overpass-api.de/api/interpreter?data=%5Bout%3Ajson%5D%3Bnode%5B%22short%5Fname%22%3D%22ISIMA%22%5D%3Bnode%28around%3A500%29%5B%22emergency%22%3D%22defibrillator%22%5D%3Bout%20ids%3B%0A')
data = r.json()
aeds = len(data[u'elements'])
print(str(aeds) + " défibrillateurs à moins de 500 mètres d'ici")
Documentation : http://docs.python.org/3/tutorial/errors.html
class Signet:
def __init__(self, name, url):
self.name = name
self.url = url
def updateURL(self, url):
self.url = url
def test(self):
from urllib import request, error
try:
request.urlopen(self.url)
except error.URLError:
return False
return True
docPython = Signet("doc python", "http://docs.python.org")
print(docPython.url)
print(docPython.test())
docPython.updateURL("http://")
print(docPython.url)
print(docPython.test())
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
frame=pd.read_csv('compareDistances-absolute.csv',names=("from","to","abs","rel","odo","osm","dabs","drel","dodo","dosm"))
plt.scatter(frame['abs'],frame.rel)
plt.ylabel("Erreur relative")
plt.xlabel("Erreur absolue (km)")
plt.title("Erreurs relatives des distances OSM/OdoMatrix")
plt.xlim(xmin=0)
plt.ylim(ymin=0)