Notes de Cours Python Scientifique
Notes de Cours Python Scientifique
Premiers pas▲
• soit en tapant ipython depuis un terminal Linux/Mac, ou depuis cmd sous Windows ;
• soit en démarrant le programme depuis un menu, par exemple Python(x,y) ou EPD si vous
avez installé une de ces suites Python pour scientifiques.
Si vous n'avez pas IPython d'installé sur votre ordinateur, sachez que d'autres shell Python sont
disponibles, comme le shell Python de base que vous pouvez lancer en tapant python dans un
terminal, ou encore l'interpréteur IDLE. Cependant, nous vous recommandons d'utiliser le shell
IPython en raison de ses fonctionnalités avancées, spécialement en ce qui concerne le calcul
scientifique interactif.
Cacher/Afficher le codeSélectionnez
Hello, world!
Le message Hello, world ! est alors affiché à l'écran. Vous venez juste d'exécuter votre première
instruction Python, toutes nos félicitations !
Pour continuer sur votre lancée, veuillez saisir l'ensemble des instructions suivantes :
Sélectionnez
>>> a = 3
>>> b = 2*a
>>> type(b)
<type 'int'>
>>> print b
>>> a*b
18
>>> b = 'hello'
>>> type(b)
<type 'str'>
>>> b + b
'hellohello'
>>> 2*b
'hellohello'
Deux variables a et b sont définies ci-dessus. Veuillez noter qu'on ne déclare pas le type d'une
variable avant de lui assigner une valeur. En C, nous aurions dû écrire :
Sélectionnez
int a = 3;
De plus, le type d'une variable peut changer, comprenez que dans un premier temps, la variable peut
être d'un type donné, puis que dans un second temps, la variable sera d'un type différent. Ainsi, b fut
d'abord un entier, puis devint une chaîne de caractères (string), quand on lui assigna la
valeur "hello". Les opérations sur les entiers (exemple : b=2*a) sont codées de manière naturelle en
Python, de même que les opérations sur les chaînes de caractères. Ainsi l'utilisation des additions et
des multiplications sur une chaîne de caractères correspondront respectivement à une concaténation
et à une répétition.
Sélectionnez
>>> 1 + 1
>>> a = 4
>>> type(a)
<type 'int'>
Sélectionnez
>>> c = 2.1
>>> type(c)
<type 'float'>
Sélectionnez
1.5
>>> [Link]
0.5
>>> type(1. + 0j )
<type 'complex'>
Sélectionnez
>>> 3 > 4
False
>>> test
False
>>> type(test)
<type 'bool'>
Un shell Python peut parfaitement remplacer votre calculatrice de poche, avec les opérateurs
arithmétiques de base +, -, *, /, % (modulo), implémentés nativement.
Sélectionnez
>>> 7 * 3.
21.0
>>> 2**10
1024
>>> 8 % 3
Transtypage :
Sélectionnez
>>> float(1)
1.0
Division entière :
Sélectionnez
>>> 3 / 2
Sélectionnez
>>> 3 / 2.
1.5
>>> a = 3
>>> b = 2
>>> a / b
>>> a / float(b)
1.5
Sélectionnez
>>> 3.0 // 2
1.0
Python fournit différents types de conteneurs puissants, dans lesquels nous pouvons stocker des
listes ou des objets.
II-B-1. Listes▲
Une liste est un jeu de données ou d'objets qui peuvent être de différents types. Par exemple :
Sélectionnez
>>> type(L)
<type 'list'>
Sélectionnez
>>> L[2]
'green'
Sélectionnez
>>> L[-1]
'white'
>>> L[-2]
'black'
Sélectionnez
>>> L
>>> L[2:4]
['green', 'black']
Veuillez noter que L[start:stop] contient les éléments pour lesquels start <= i < stop (i va alors
de start à stop-1). Autrement dit, L[start:stop] extrait (stop-start) éléments de la liste.
Sélectionnez
>>> L
>>> L[3:]
['black', 'white']
>>> L[:3]
>>> L[::2]
Les listes sont des objets mutables et peuvent par conséquent être modifiées :
Sélectionnez
>>> L
>>> L
Sélectionnez
>>> L
(-200, 'hello')
Pour un jeu de données numériques qui sont toutes du même type, il est souvent plus efficace
d'utiliser un Array, un tableau, issu du module NumPy. Un tableau NumPy est un bloc mémoire
contenant des éléments identiques. Avec les tableaux NumPy, les opérations peuvent être plus
rapides car la disposition des éléments en mémoire est régulière et permet l'utilisation de routines
en C à la place de boucles Python.
Python offre un large panel de fonctions pour modifier des listes, ou les interroger. Voici quelques
exemples ; pour plus d'informations, veuillez
consulter [Link]
Sélectionnez
>>> L
'pink'
>>> L
>>> L
>>> L = L[:-2]
>>> L
Sélectionnez
>>> r = L[::-1]
>>> r
>>> r2 = list(L)
>>> r2
>>> r2
Sélectionnez
>>> r + L
['white', 'black', 'green', 'blue', 'red', 'red', 'blue', 'green', 'black', 'white']
>>> r * 2
['white', 'black', 'green', 'blue', 'red', 'white', 'black', 'green', 'blue', 'red']
Sélectionnez
>>> r
>>> r
Méthodes et POO
La notation [Link]() (par exemple [Link](3) et [Link]()) constitue notre premier exemple de
POO. Étant une liste, l'objet r possède la fonction method qui est appelée en utilisant la notation ".".
Il n'y a aucun autre principe de la POO plus important que de comprendre la notation "." pour
continuer ce tutoriel.
Méthodes de découvertes
Sélectionnez
In [28]: r.<TAB>
Sélectionnez
how are you''' # the string to span more than one line
s = """Hi,
what's up?"""
Sélectionnez
------------------------------------------------------------
Les chaînes de caractères (strings) constituent un jeu de données au même titre que les listes. Aussi
peuvent-elles être indexées et échantillonnées, en utilisant les mêmes syntaxes et règles.
Indexation :
Sélectionnez
>>> a = "hello"
>>> a[0]
'h'
>>> a[1]
'e'
>>> a[-1]
'o'
Échantillonnage (slicing) :
Sélectionnez
'lo,'
'lo o'
'hl r!'
Une chaîne de caractères (string) est un objet immuable et il n'est pas possible de modifier son
contenu. On peut cependant créer un nouveau string à partir d'un objet existant.
Sélectionnez
---------------------------------------------------------------------------
Python offre des possibilités évoluées pour manipuler les chaînes de caractères, la recherche de
motifs (pattern) ou encore le formatage. Pour les plus passionnés, référez-vous à :
[Link]
[Link]
Sélectionnez
>>> 'An integer: %i; a float: %f; another string: %s' % (1, 0.1, 'string')
>>> i = 102
>>> filename
'processing_of_dataset_102.txt'
II-B-3. Dictionnaires▲
Un dictionnaire est basiquement un tableau associatif qui connecte ensemble des clés à des valeurs.
C'est un conteneur non ordonné.
Sélectionnez
>>> tel
>>> tel['sebastian']
5578
>>> [Link]()
>>> [Link]()
True
Il peut être utilisé pour stocker/rechercher de manière pratique des valeurs associées à un nom
(un string pour une date, un nom…).
Sélectionnez
>>> d
TUPLES
Les tuples sont des listes immuables. Les éléments d'un tuple s'écrivent entre parenthèses, ou juste
séparés par des virgules :
Sélectionnez
>>> t[0]
12345
>>> t
>>> u = (0, 2)
SETS
Sélectionnez
>>> s
La librairie de référence Python indique que : les déclarations d'affectations sont utilisées pour
(re)nommer des valeurs et modifier les attributs ou les éléments d'un objet mutable.
1. L'expression à droite est analysée, puis l'objet correspondant est créé ou récupéré.
Sélectionnez
In [1]: a = [1, 2, 3]
In [2]: b = a
In [3]: a
Out[3]: [1, 2, 3]
In [4]: b
Out[4]: [1, 2, 3]
In [5]: a is b
Out[5]: True
In [7]: a
Sélectionnez
In [1]: a = [1, 2, 3]
In [3]: a
Out[3]: [1, 2, 3]
In [5]: a
Out[6]: 138641676
In [8]: a
Out[8]: [1, 2, 3]
In [9]: id(a)
Une très bonne explication, très détaillée, sur le cas ci-dessus peut être lu dans un article de David
M. BEAZLEY
III-A. if/elif/else▲
Sélectionnez
>>> if 2**2 == 4:
...
Obvious!
Saisissez les lignes suivantes dans votre interpréteur Python, et prenez garde à bien respecter
l'indentation. Le shell IPython augmente automatiquement l'indentation après le caractère ":" ; pour
diminuer l'indentation, pressez 4 fois la touche <backspace>. Appuyez sur <Entrée> deux fois pour
quitter le bloc logique de code.
Sélectionnez
In [1]: a = 10
In [2]: if a == 1:
...: print(1)
...: elif a == 2:
...: print(2)
...: else:
...:
A lot
L'indentation est obligatoire dans les scripts. Afin de vous exercer un peu, ressaisissez les lignes
précédentes, avec la même indentation dans un script que vous nommerez [Link] et exécutez-
le avec la commande run [Link] dans IPython.
III-B. for/range▲
Sélectionnez
... print(i)
Mais le plus souvent, il est plus pratique et plus lisible d'itérer sur les valeurs.
III-C. while/break/continue▲
Sélectionnez
>>> z = 1 + 1j
... z = z**2 + 1
>>> z
(-134+352j)
Sélectionnez
>>> z = 1 + 1j
... if [Link] == 0:
... break
... z = z**2 + 1
Sélectionnez
>>> a = [1, 0, 2, 4]
... if element == 0:
... continue
1.0
0.5
0.25
expressions conditionnelles :
None.
e reste.
avec logique :
: il doit s'agir du même objet des deux côtés :
3]
Vous pouvez itérer n'importe quel type d'objet (string, liste, clés de dictionnaire, ligne de fichier…) :
Sélectionnez
... if i in vowels:
... print(i),
oeu
Sélectionnez
...
Hello
how
are
you?
Peu de langages (particulièrement les langages à but scientifique) permettent de boucler sur autre
chose que des entiers ou des indices. Avec Python, il est possible de boucler sur ce qui vous intéresse
sans vous soucier des indices qui ne vous intéressent pas. Cela permet souvent d'obtenir du code
plus lisible.
Il n'est pas recommandé de modifier la séquence que vous êtes en train d'itérer.
Une des tâches classiques est d'itérer une séquence tout en gardant en mémoire le numéro de
l'élément.
Vous pouvez utiliser une boucle while avec un compteur. Ou une boucle for :
Sélectionnez
0 cool
1 powerful
2 readable
Sélectionnez
>>> for index, item in enumerate(words):
0 cool
1 powerful
2 readable
Utilisez iteritems :
Sélectionnez
Sélectionnez
[0, 1, 4, 9]
III-F. Exercice▲
....:
....:
In [57]: test()
in test function
Les blocs de code des fonctions doivent être indentés au même titre que les blocs de contrôle de
flux.
Sélectionnez
...:
In [8]: disk_area(1.5)
Out[8]: 7.0649999999999995
• le corps de la fonction ;
Sélectionnez
....: return x * 2
....:
In [82]: double_it(3)
Out[82]: 6
In [83]: double_it()
---------------------------------------------------------------------------
Sélectionnez
....: return x * 2
....:
In [85]: double_it()
Out[85]: 4
In [86]: double_it(3)
Out[86]: 6
Les mots clés vous permettent de définir des valeurs par défaut.
Les valeurs par défaut sont à communiquer quand la fonction est définie, et non quand elle est
appelée. Cela peut être d'autant plus problématique quand on utilise des types mutables (c'est-à-
dire des dictionnaires ou des listes par exemple) et qu'on les modifie dans le corps de la fonction,
puisque les modifications se propageront au-delà de l'appel de la fonction.
Sélectionnez
In [124]: bigx = 10
.....: return x * 2
.....:
Out[128]: 20
Utilisation d'un type mutable comme argument mot clé (et modification de ce dernier dans le corps
de la fonction) :
Sélectionnez
...: args[i] += 1
...:
In [3]: add_to_dict
In [4]: add_to_dict()
{'a': 2, 'b': 3}
In [5]: add_to_dict()
{'a': 3, 'b': 4}
In [6]: add_to_dict()
{'a': 4, 'b': 5}
Sélectionnez
....:
In [101]: rhyme = 'one fish, two fish, red fish, blue fish'.split()
In [102]: rhyme
In [103]: slicer(rhyme)
Sélectionnez
Mais il est considéré comme bonne pratique de garder le même ordre que dans la définition de la
fonction.
Les mots clés comme arguments sont très pratiques afin de définir des fonctions avec un nombre
variable d'arguments quand les valeurs par défaut doivent être utilisées dans la plupart des appels.
Pouvons-nous modifier la valeur d'une variable à l'intérieur d'une fonction ? La plupart des langages
(C, Java…) distinguent « passage par valeur » et « passage par référence ». En Python, une telle
distinction est un peu superficielle, et il est subtil de savoir si vos variables vont être modifiées ou
non. Heureusement, il existe des règles claires.
Les paramètres de fonctions sont liés à des objets, lesquels sont passés par valeur. Quand vous
passez une variable à une fonction, Python communique la référence à l'objet auquel la variable se
réfère, pas la variable elle-même. Si la valeur passée dans une fonction est immuable, la fonction ne
modifie pas la variable de l'appelant. Si la variable est mutable, la fonction peut modifier la variable
de l'appelant.
Sélectionnez
... x = 23
... [Link](42)
... print(x)
... print(y)
... print(z)
...
>>> c = [28]
>>> try_to_modify(a, b, c)
23
[99, 42]
[99]
>>> print(a)
77
>>> print(b)
[99, 42]
>>> print(c)
[28]
Les fonctions possèdent une table de variables locales appelées « espace de nom local ».
Les variables déclarées en dehors de la fonction peuvent être référencées à l'intérieur de la fonction :
Sélectionnez
In [114]: x = 5
.....: return x + y
.....:
In [116]: addx(10)
Out[116]: 15
Mais ces variables globales ne peuvent être modifiées à l'intérieur des fonctions, à moins de les
déclarer comme globales (mot clé global) dans la fonction.
Sélectionnez
.....: x=y
.....:
.....:
In [118]: setx(10)
x is 10
In [120]: x
Out[120]: 5
Sélectionnez
.....: global x
.....: x=y
.....:
In [122]: setx(10)
x is 10
In [123]: x
Out[123]: 10
• **kwargs : n'importe quel nombre d'arguments nommés (mots clés) sous forme de
dictionnaire.
Sélectionnez
....:
Il s'agit de la documentation concernant ce que fait la fonction et ses paramètres. Voici la convention
générale :
Sélectionnez
....:
....: pass
....:
In [68]: funcname?
Type: function
Namespace: Interactive
Definition: funcname(params)
Docstring:
Aussi, les modules Numpy et Scipy ont défini un standard précis pour la documentation des fonctions
scientifiques, que vous devrez peut-être suivre pour vos propres fonctions avec une
section Parameters, une section Examples…
Les fonctions sont des objets multitâches, ce qui signifie qu'elles peuvent être :
Sélectionnez
In [38]: va = variable_args
Les méthodes sont des fonctions attachées à des objets. Vous avez déjà pu le constater dans nos
exemples sur les listes, les dictionnaires, les chaînes de caractères…
Écrire une fonction qui affiche les n premiers éléments de la suite de Fibonacci, définie par :
wikipedia :
Sélectionnez
function quicksort(array)
return array
select and remove a pivot value pivot from array for each x in array
Jusqu'à présent, nous avons saisi l'intégralité de nos instructions directement dans l'interpréteur.
Pour des jeux d'instructions plus longs, il nous faut changer de direction et écrire le code dans des
fichiers texte (avec un éditeur de texte), ce que nous appellerons « scripts » ou encore « modules ».
Utilisez votre éditeur de texte préféré (peut-être propose-t-il aussi la coloration syntaxique Python),
ou l'éditeur fourni avec la Scientific Python Suite que vous utilisez peut-être (par exemple, Scite avec
Python(x,y)).
Pour commencer, écrivons un script, c'est un fichier avec une suite d'instructions qui sont exécutées
chaque fois que le script est appelé.
Les instructions peuvent être par exemple copiées-collées depuis l'interpréteur (mais attention à
respecter l'indentation).
L'extension des fichiers Python est .py. Écrivez ou copiez-collez les lignes suivantes dans un
fichier [Link] :
[Link]
Sélectionnez
print word
Dans IPython, la syntaxe pour exécuter un script est %run [Link]. Par exemple :
Sélectionnez
Hello
how
are
you?
In [2]: message
Le script a été exécuté. De plus, les variables définies dans le script (comme message) sont
maintenant disponibles dans l'espace de nom de l'interpréteur.
Les autres interpréteurs offrent également la possibilité d'exécuter des scripts (par
exemple, execfile dans l'interpréteur Python).
Il est également possible d'exécuter ce script comme un programme standalone, en lançant ce script
à l'intérieur d'un terminal shell(console Linux/Mac, ou cmd pour Windows). Par exemple, si nous
sommes dans le même dossier que notre script, nous pouvons exécuter les lignes suivantes dans une
console :
Sélectionnez
$ python [Link]
Hello
how
are
you?
Les scripts standalone peuvent également prendre des arguments. Ainsi, dans [Link] :
[Link]
Sélectionnez
import sys
print [Link]
Sélectionnez
Sélectionnez
In [1]: import os
In [2]: os
In [3]: [Link]('.')
Out[3]:
['[Link]',
'basic_types.rst',
'control_flow.rst',
'[Link]',
'python_language.rst',
'[Link]',
'file_io.rst',
'[Link]',
'[Link]',
'[Link]']
Et aussi :
Sélectionnez
Import rapide :
Sélectionnez
Sélectionnez
from os import *
• Cela peut rendre le code difficile à lire et à comprendre : d'où viennent précisément les
divers symboles ?
• Cela peut restreindre les noms des variables que vous pouvez utiliser : [Link] peut
surcharger name et vice-versa.
Les modules sont également une bonne façon d'organiser son code de manière hiérarchique.
Actuellement, tous les outils scientifiques utilisent des modules :
Sélectionnez
Sélectionnez
>>> import numpy
Si nous voulons créer des programmes plus importants et mieux structurés (en comparaison à de
simples scripts), avec quelques définitions d'objets (variables, fonctions, classes) et que nous
désirions les réutiliser de temps à autre, nous devons créer des modules.
[Link]
Sélectionnez
def print_b():
"Prints b."
print 'b'
def print_a():
"Prints a."
print 'a'
c=2
d=2
Dans ce fichier, nous définissons deux fonctions print_a et print_b. Supposons que nous voulions
appeler la fonction print_a depuis l'interpréteur. Nous pourrions exécuter le fichier comme un script,
mais puisque nous voulons juste accéder à la fonction print_a, nous devons plutôt l'importer comme
un module. La syntaxe est la suivante :
Sélectionnez
In [3]: demo.print_b()
Importer le module donne accès à ses objets, en utilisant la syntaxe [Link]. N'oubliez pas de
mettre le nom du module avant le nom de l'objet, autrement Python ne reconnaîtra pas l'instruction.
V-C-1. Introspection▲
Sélectionnez
In [4]: demo?
Type: module
Namespace: Interactive
File: /home/varoquau/Projects/Python_talks/scipy_2009_tutorial/source/[Link]
Docstring:
A demo module.
In [5]: who
demo
In [6]: whos
------------------------------
In [7]: dir(demo)
Out[7]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'c',
'd',
'print_a',
'print_b']
In [8]: demo.
demo.__hash__ demo.__sizeof__
Sélectionnez
In [10]: whos
--------------------------------
In [11]: print_a()
Les modules sont mis en cache. Si vous modifiez [Link], puis le réimportez dans la session
précédente, vous conserverez l'ancienne version.
Solution :
Sélectionnez
In [10]: reload(demo)
Fichier [Link] :
[Link]
Sélectionnez
import sys
def print_a():
"Prints a."
print 'a'
print [Link]
if __name__ == '__main__':
print_a()
import :
Sélectionnez
b
In [12]: import demo2
Lancement :
Sélectionnez
Règles de base
• Les jeux d'instructions qui sont appelés plusieurs fois devraient être écrits à l'intérieur de
fonctions pour plus de réutilisabilité.
• Les fonctions (ou tout autre morceau de code) qui sont appelées depuis plusieurs modules
différents devraient être écrites à l'intérieur de module, ainsi seul le module est importé
dans les différents scripts (ne copiez-collez pas vos fonctions dans les différents scripts).
Quand import mymodule est exécuté, le module mymodule est recherché dans une liste donnée de
répertoire. Cette liste inclue une liste des dépendances par défaut (par
exemple, /usr/lib/python sous Linux), ainsi qu'une liste de répertoires spécifiés dans la variable
d'environnement PYTHONPATH.
La liste de ces dossiers recherchés par Python est fournie par la variable [Link] :
Sélectionnez
In [2]: [Link]
Out[2]:
['',
'/home/varoquau/.local/bin',
'/usr/lib/python2.7',
'/home/varoquau/.local/lib/python2.7/site-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/local/lib/python2.7/dist-packages',
...]
Les modules doivent être présents dans le chemin de recherche, aussi vous pouvez :
• écrire vos propres modules à l'intérieur de dossiers déjà définis dans le chemin de recherche
(par exemple, $HOME/.local/lib/python2.7/dist-packages). Vous pouvez utiliser des liens
symboliques (sous Linux) pour stocker votre code ailleurs ;
• modifier la variable d'environnement PYTHONPATH pour inclure les dossiers contenant les
modules définis par l'utilisateur.
Sur Linux/Unix, ajoutez la ligne suivante à un fichier lu par le shell au démarrage (ex. /etc/profile,
ou .profile).
Sélectionnez
export PYTHONPATH=$PYTHONPATH:/home/emma/user_defined_modules
Sélectionnez
import sys
new_path = '/home/emma/user_defined_modules'
[Link](new_path)
Cette dernière méthode n'est pas très robuste ; de plus elle rend le code moins portable et vous
devez redéfinir la variable chaque fois que vous désirez importer un module dans ce dossier.
Un dossier qui contient plusieurs modules est appelé un paquetage (package). Un package peut
contenir d'autres packages. Un fichier spécial, __init__.py (qui peut être vide) indique à Python que
le dossier est un package Python, à partir duquel les modules peuvent être importés.
Sélectionnez
$ ls
$ cd ndimage
$ ls
[Link]@
[Link]
Avec IPython :
Sélectionnez
In [2]: scipy.__file__
Out[2]: '/usr/lib/python2.6/dist-packages/scipy/__init__.pyc'
In [4]: [Link]
Out[4]: '0.7.0'
Type: function
Namespace: Interactive
File: /usr/lib/python2.6/dist-packages/scipy/ndimage/[Link]
brute_force=False)
Docstring:
Il doit obligatoirement en avoir après def f(): ou encore while:. À la fin de chacun de ces blocs, on
doit décrémenter cette indentation d'un niveau (et le ré-augmenter si nouveau bloc).
Le respect strict de l'indentation est le prix à payer pour éviter d'avoir à utiliser des { et des ; qui
délimitent les blocs logiques dans d'autres langages. Toute erreur d'indentations lève une exception :
Sélectionnez
------------------------------------------------------------
Cette histoire d'indentation peut paraître un peu déroutante au début. Cependant, la clarté de
l'indentation et l'absence de caractères superflus permettent d'obtenir un code agréable à lire
comparé à d'autres langages.
• Niveau d'indentation
À l'intérieur de votre éditeur de texte, vous pouvez choisir d'indenter avec n'importe quel nombre
d'espaces (1,2,3,4…). Cependant, il est couramment admis d'indenter de quatre espaces. Vous
pouvez ainsi paramétrer votre éditeur pour que la touche <Tab> corresponde à quatre espaces. Avec
Python(x,y), l'éditeur est déjà préconfiguré.
• Mise en forme
Lignes trop longues : vous ne devriez pas écrire de très longues lignes qui dépassent les 80
caractères. Les lignes trop longues peuvent être coupées avec le
caractère backslash \ immédiatement suivi d'un saut à la ligne :
Sélectionnez
Espaces : placez des espaces après les virgules, autour des opérateurs arithmétiques…
Sélectionnez
>>> a = 1 # yes
Un certain nombre de règles d'écriture pour obtenir un code plus « agréable » (et plus) sont
disponibles dans [Link]
Si vous désirez faire une première passe rapide sur l'écosystème de Scipy, vous pouvez d'ores et déjà
passer au chapitre suivant :
[Link]
Le reste de ce chapitre n'est pas nécessaire pour comprendre Scipy. Cependant, n'oubliez pas de
revenir et de finir ce chapitre plus tard.
Nous écrivons ou lisons des chaînes de caractères vers/depuis des fichiers (n'importe quel type de
donnée peut être converti en strings). Pour écrire dans un fichier :
Sélectionnez
>>> type(f)
<type 'file'>
>>> [Link]()
Sélectionnez
In [2]: s = [Link]()
In [3]: print(s)
This is a test
In [4]: [Link]()
Sélectionnez
...:
This is a test
In [8]: [Link]()
Dossier courant :
Sélectionnez
In [17]: [Link]()
Out[17]: '/Users/cburns/src/scipy2009/scipy_2009_tutorial/source'
Sélectionnez
In [31]: [Link]([Link])
Out[31]:
['.[Link]',
'.python_language.[Link]',
'.view_array.[Link]',
'_static',
'_templates',
'basic_types.rst',
'[Link]',
'control_flow.rst',
'[Link]',
...
Créer un dossier :
Sélectionnez
In [32]: [Link]('junkdir')
Out[33]: True
Renommer un dossier :
Sélectionnez
Out[37]: False
Out[38]: True
In [41]: [Link]('foodir')
Out[42]: False
Supprimer un fichier :
Sélectionnez
In [45]: [Link]()
Out[46]: True
In [47]: [Link]('[Link]')
Out[48]: False
Sélectionnez
In [71]: [Link]()
In [72]: a = [Link]('[Link]')
In [73]: a
Out[73]: '/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/[Link]'
In [74]: [Link](a)
Out[74]: ('/Users/cburns/src/scipy2009/scipy_2009_tutorial/source',
'[Link]')
In [78]: [Link](a)
Out[78]: '/Users/cburns/src/scipy2009/scipy_2009_tutorial/source'
In [79]: [Link](a)
Out[79]: '[Link]'
In [80]: [Link]([Link](a))
In [84]: [Link]('[Link]')
Out[84]: True
In [86]: [Link]('[Link]')
Out[86]: True
In [87]: [Link]('[Link]')
Out[87]: False
In [88]: [Link]('~/local')
Out[88]: '/Users/cburns/local'
Out[92]: '/Users/cburns/local/bin'
Sélectionnez
In [8]: [Link]('ls')
Alternative à [Link]
Le module sh est une alternative viable à [Link]. Il fournit beaucoup de moyens permettant
d'obtenir plus aisément les sorties, flux d'erreurs et codes de sortie issus des commandes externes.
Sélectionnez
In [20]: import sh
In [23]: type(com)
Out[23]: [Link]
[Link] permet d'obtenir la liste des fichiers contenus dans la structure d'un dossier donné.
Sélectionnez
....:
....:
/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/.[Link]
/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/.view_array.[Link]
/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/basic_types.rst
/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/[Link]
/Users/cburns/src/scipy2009/scipy_2009_tutorial/source/control_flow.rst
...
Variables d'environnements :
Sélectionnez
In [9]: import os
In [11]: [Link]()
Out[11]:
['_',
'FSLDIR',
'TERM_PROGRAM_VERSION',
'FSLREMOTECALL',
'USER',
'HOME',
'PATH',
'PS1',
'SHELL',
'EDITOR',
'WORKON_HOME',
'PYTHONPATH',
...
In [12]: [Link]['PYTHONPATH']
Out[12]: '.:/Users/cburns/src/utils:/Users/cburns/src/nitools:
/Users/cburns/local/lib/python2.5/site-packages/:
/usr/local/lib/python2.5/site-packages/:
/Library/Frameworks/[Link]/Versions/2.5/lib/python2.5'
In [16]: [Link]('PYTHONPATH')
Out[16]: '.:/Users/cburns/src/utils:/Users/cburns/src/nitools:
/Users/cburns/local/lib/python2.5/site-packages/:
/usr/local/lib/python2.5/site-packages/:
/Library/Frameworks/[Link]/Versions/2.5/lib/python2.5'
Sélectionnez
In [19]: [Link]('*.txt')
Sélectionnez
In [117]: [Link]
Out[117]: 'darwin'
In [118]: [Link]
In [119]: [Link]
Out[119]: '/Library/Frameworks/[Link]/Versions/2.5'
In [100]: [Link]
Out[100]: ['/Users/cburns/local/bin/ipython']
[Link] est une liste de strings qui indique les chemins utilisés afin de trouver des modules Python.
Cette liste est initialisée depuis la variable PYTHONPATH.
Sélectionnez
In [121]: [Link]
Out[121]:
['',
'/Users/cburns/local/bin',
'/Users/cburns/local/lib/python2.5/site-packages/[Link]',
'/Users/cburns/local/lib/python2.5/site-packages/[Link]',
'/Users/cburns/local/lib/python2.5/site-packages/[Link]',
'/Users/cburns/local/lib/python2.5/site-packages/[Link]',
'/Users/cburns/local/lib/python2.5/site-packages/[Link]',
...
Très pratique pour stocker arbitrairement des objets dans un fichier. Cependant, ce n'est pas le plus
recommandé, ni le plus sûr.
Sélectionnez
In [4]: [Link](file('[Link]'))
VII-F. Exercice▲
Écrivez un programme pour rechercher votre PYTHONPATH pour le module [Link].
Solution
Cacher/Afficher le codeSélectionnez
Il est fort improbable que vous n'ayez jamais levé la moindre exception si vous avez saisi la totalité
des commandes précédentes de ce tutoriel. Par exemple, vous avez dû en lever une si vous avez saisi
une commande avec une faute de frappe.
Les exceptions sont levées pour différentes raisons, lesquelles surviennent à l'exécution du code
Python. Dans votre propre code, vous vous devez d'intercepter les erreurs, ou de définir un
traitement personnalisé.
Vous pouvez regarder les descriptions des exceptions déjà existantes quand vous en recherchez une.
Sélectionnez
In [1]: 1/0
---------------------------------------------------------------------------
In [2]: 1 + 'e'
---------------------------------------------------------------------------
In [4]: d[3]
---------------------------------------------------------------------------
KeyError: 3
In [5]: l = [1, 2, 3]
In [6]: l[4]
---------------------------------------------------------------------------
In [7]: [Link]
---------------------------------------------------------------------------
Comme vous pouvez le constater, il y a différents types d'exceptions pour différents types d'erreurs.
VIII-B-1. Try/except▲
Sélectionnez
....: try:
....: break
....:
In [9]: x
Out[9]: 1
VIII-B-2. Try/finally▲
Sélectionnez
In [10]: try:
....: finally:
....:
---------------------------------------------------------------------------
Sélectionnez
....: try:
....: [Link]()
....: pass
....: print(collection)
....:
....:
[1, 2, 3]
set([1, 2, 3])
In [14]: print_sorted('132')
132
Sélectionnez
In [15]: def filter_name(name):
....: try:
....: else:
....: raise e
....:
In [16]: filter_name('Gaël')
OK, Gaël
Out[16]: 'Ga\xc3\xabl'
In [17]: filter_name('Stéfan')
---------------------------------------------------------------------------
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
Sélectionnez
....: x = 1 - (1-x)/2.
....: return x
....:
In [18]: x = 0
....: x = achilles_arrow(x)
....: break
....:
....:
In [20]: x
Out[20]: 0.9990234375
Utilisez les exceptions pour notifier si certaines conditions sont remplies au cours de l'exécution du
code (par exemple StopIteration) ou non (par exemple : custom error raising).
Python supporte la programmation orientée objet (POO). Les buts principaux de la POO sont :
• organiser le code ;
Voici un petit exemple : nous avons créé une classe Student, laquelle est un objet contenant de
multiples fonctions (ses méthodes) et de multiples variables (ses attributs), que nous pourrons
utiliser :
Sélectionnez
...
>>> anna.set_age(21)
>>> anna.set_major('physics')
Dans l'exemple précédent, la classe Student possède des méthodes __init__, set_age, et set_major.
Ses attributs sont name, age, et major. Nous pouvons appeler ces méthodes et ces attributs avec la
notation suivante : [Link] ou bien encore [Link]. Le
constructeur __init__ est une méthode spéciale que nous appelons avec : MyClass(paramètres
d'initialisation si besoin).
Maintenant, supposons que nous désirions créer une nouvelle classe MasterStudent avec les mêmes
méthodes et attributs que la précédente, mais avec un attribut complémentaire internship. Nous
n'allons pas copier la classe précédente, mais en hériter :
Sélectionnez
...
>>> [Link]
>>> james.set_age(23)
>>> [Link]
23
Grâce aux classes et à la programmation orientée objet, nous pouvons organiser notre code en
différentes classes correspondant chacune aux divers objets dont nous pourrions avoir besoin (une
classe Experience, une classe Image, une classe Flux…), chacune possédant ses propres méthodes et
ses propres attributs. Puis nous pourrons utiliser l'héritage afin de créer des variations de ces classes
en réutilisant ainsi leur code. Par exemple, depuis une classe Flux, nous pouvons créer des
classes FluxDAlimentation, FluxDeTurbulence, FluxPotientiels…