Premiers pas en python (et IPython Notebook)

Cette note est très courte car tous les documents nécessaires pour survivre en python sont disponibles en ligne: http://docs.python.org/2/tutorial/

On pourra aussi consulter:

Utiliser IPython comme une calculatrice (évoluée)

En python, attention A L'INDENTATION du code, voir les exemples ci-dessous.
In [1]:
for i in range(2):
    # boucle for, attention à l'indentation du code en python.
    # Elle se fait automatiquement dans IPython.
    print i," Bonjour python"
print range(2)
# Attention, le premier indice est 0 (et non 1 comme en matlab) 
0  Bonjour python
1  Bonjour python
[0, 1]

In [2]:
%pylab inline
# permet d'utiliser les modules pylab pour faire des graphiques et numpy pour le calcul scientifique.
Populating the interactive namespace from numpy and matplotlib

In [3]:
# Attention à la division par un entier.
3/4
Out[3]:
0
In [33]:
3/4.
Out[33]:
0.75
Les listes permettent de stocker des données de différents types:
In [5]:
a = [1,"e"]
for x in a:
    print x
1
e

In [6]:
# Ajouter un élément à la liste:
a.append("nouvel element")
# Eviter les accents dans les données de type string.
In [7]:
print a
[1, 'e', 'nouvel element']

In [8]:
# et pour enlever deux éléments consécutifs:
a[0:2] = []
# Attention, on enlève ici les deux premiers éléments d'indice 0 et 1.
print a
['nouvel element']

In [9]:
# On peut sommer les listes pour les concaténer:
b = []
for i in range(3):
    b += a
print b
['nouvel element', 'nouvel element', 'nouvel element']

Les dictionnaires sont aussi très utiles pour stocker des données triées par clés:
In [10]:
# Création du dictionnaire
dictionnaire = {}
dictionnaire["Martin"] = 18
dictionnaire["Pierre"] = 20
for nom in dictionnaire.keys():
    print dictionnaire[nom]
for nom,note in dictionnaire.
  File "<ipython-input-10-120965d4a860>", line 7
    for nom,note in dictionnaire.
                                 ^
SyntaxError: invalid syntax

Tracer des graphes

In [16]:
X = linspace(0,3,100)
Y = linspace(0,3,4)
plot(X,sin(X))
plot(Y,cos(Y),'-o')
show()

Comme en Matlab, différentes options sont possibles pour le tracé de graphiques: voir le site de matplotlib: http://matplotlib.org/gallery.html

Algèbre linéaire

Le module numpy de python dispose d'une classe matrix permettant de faire les opérations simples d'algèbre linéaire.
In [21]:
M = matrix([[1, 2],[3, 4]])
print shape(M)
print "Inverse de la matrice M: ",M.I
print "Verification par le produit: ",M.I*M
(2, 2)
inverse de la matrice M:  [[-2.   1. ]
 [ 1.5 -0.5]]
verification par le produit:  [[  1.00000000e+00   0.00000000e+00]
 [  2.22044605e-16   1.00000000e+00]]

Voir la page http://docs.scipy.org/doc/numpy-1.7.0/reference/generated/numpy.matrix.html pour la liste de fonctions accessibles dans cette classe.

In [24]:
# sommer les elements d'une matrice
somme = sum(M)
print somme
10

Exemple de code plus compliqué

Python est un langage orienté objet. La plupart des structures utilisées dérivent d'une classe objet. C'est une des differences principales avec matlab.
In [31]:
#Un code pour le calcul des partitions d'un entier
class Part(object):
    def __init__(self,dic_list):
        """ The structure of the partition of n is a list of dictionnaries whose keys are elements of range(n)
            and values are weights such that sum_keys weights = n """
        self.partition = dic_list
    
    def Agregate(self,key_value):  
        for dictio in self.partition:  
            try:
                dictio[key_value[0]]+=key_value[1]
            except:
                dictio[key_value[0]]=key_value[1]
def Clean(liste):
    result = [liste[0]]
    for x in liste:
        indicator = 0
        for z in result:
                indicator+=DictionaryEquality(x,z)
        if indicator==0:
            result.append(x)
    return result       


    
 
def DictionaryEquality(dict2,dict1):
    shared_keys = set(dict2.keys()) & set(dict1.keys())
    sum = 0
    for k in shared_keys:
        sum+=dict1[k]*k
        if dict2[k]!=dict1[k]:
            return 0
    if SumDictionary(dict1) == sum:
        return 1 
    else:
        return 0

def Partition(x):
    if x==0:
        return [{0:1}]
    if x == 1:
        return [{1:1}]
    else:
        result = [{x:1}]
        for j in range(1,x):
            temp = Partition(j)
            temp_2 = Part(temp)
            temp_2.Agregate((x-j,1))
            result+=temp_2.partition
            result = Clean(result)
        return result
In [32]:
from pprint import pprint
o = Partition(5)
pprint(o)
[{5: 1},
 {1: 1, 4: 1},
 {2: 1, 3: 1},
 {1: 2, 3: 1},
 {1: 1, 2: 2},
 {1: 3, 2: 1},
 {1: 5}]

Pour aller plus loin

Vous aurez à importer des fichiers que vous enregistrerez quelque part sur votre disque: "path_to_fichier" est l'adresse de votre fichier. Ensuite, vous pouvez importer les fonctions contenues dans le fichier comme ci-dessous. Enregistrez le texte suivant sous un fichier nommé mon_fichier.py dans le répertoire "path_to_fichier": def MaFonction(x): return 2*x
In [34]:
from os import sys
In [44]:
print sys.path
# sys.path est la liste des repertoires dans lesquels python va chercher les importations de fichiers 
# quand on utilise la commande 
# import mon_fichier
['', '/Users/vialard/anaconda/python.app/Contents/lib/python27.zip', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/plat-darwin', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/plat-mac', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/lib-tk', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/lib-old', '/Users/vialard/anaconda/python.app/Contents/lib/python2.7/lib-dynload', '/Users/vialard/anaconda/lib/python2.7/site-packages', '/Users/vialard/anaconda/lib/python2.7/site-packages/PIL', '/Users/vialard/anaconda/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info', '/Users/vialard/anaconda/lib/python2.7/site-packages/IPython/extensions', '/Users/vialard/Documents/workspace/PythonTest/']

In [52]:
sys.path.append('/Users/vialard/Documents/workspace/PythonTest/')
In [53]:
from mon_fichier import *
In [54]:
print MaFonction(4)
8

In []: