3.8.1. Leçon d’introduction à python

3.8.1.1. Pourquoi python ?

Diverses raisons :

  • Pas envie de payer une licence.
  • Language interpété.
  • Facilement interfaçable avec du fortran (pas d’appel système), et du C.
  • Librairies : système, réseau, calcul numérique, graphique, etc.
  • Pour être efficace ou faire comme les autres.

3.8.1.2. Environnement

Choisissez celui qui vous convient.

  • vim : notamment pour les anciens.
  • emacs : possibilité d’exécution directe + édition à distance.
  • ipython : console pratique avec interface vim.
  • eric4 : environnement complet avec gestion de projet, exécution et deboguage.
  • Plein d’autres IDE.

3.8.1.3. Exécution

Soit en direct

$ python
Python 2.7.3 (default, Jan 25 2013, 15:38:17)
[GCC 4.5.1 20100924 (Red Hat 4.5.1-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Soit en exécution de script via python

$ python myscript.py

Soit en direct exécution de script (si exécutable avec entête)

$ myscript.py

Soit en soumission de job

PBS -q sequentiel
PBS -N mypython
module load mypython
python myscript.py

Warning

Si vous passez par un job, placez la ligne suivante en début de script en cas de tracés

>>> from matplotlib import use ; use('Agg')

3.8.1.4. Le language

Fichier courses_python.py

#!/usr/bin/env python
# -*- coding: utf8 -*-
"""Python de base"""

# Importations
import numpy
a = numpy.arange(5)
from numpy import arange
b = arange(5)


# Inspection
# -> help(numpy.arange)
print dir(numpy)
print type('3')
print callable(numpy.arange)
print isinstance('a', str)


# Indentations
a = True
if a is True:
    print 'True !!!'        # -> ESSAYEZ SANS INDENTATION


# Quelques types

# - listes
a = [1, 3] 
a.append(5)                 # -> ESSAYEZ EXTEND()
a[0] = 10
print a
del a[1]

# - tuples
b = (5, 6)
print b[1]                  # -> ESSAYEZ DE CHANGER B[0], DEL
c = list(a)
print b, c

# - dictionnaires
c = {'a':1,  'b':2}
d = dict(c=4)
c.update(d, e=5)
print c.keys()
print c

# - chaines de caracteres
a = 'a'
b = "b"
c = """
e
bc
"""
print "a=%s b=%i"%(3, 4)
a=3; b=4
print "a=%(a)s b=%(b)i"%dict(a=a, b=b)  # -> ESSAYEZ AVEC VARS()
print 'jean dupont'.title()
print '123'.rjust(100)                  # -> ESSAYEZ .CENTER()
print 'a={} b={}'.format(a, b)
print 'a={0} b={1:f}'.format(a, b)
a = {'arg1':'ok', 'arg2':6}
print 'arg1 de a = {a[arg1]}, arg2 = {a[arg2]}'.format(a=a) # on ne passe que a

# Slicing
a = range(10)
print a[0], a[-1]
print a[-2:]
print a[::2]                # -> COMMENCER A 3
print a[slice(None, None, 2)]


# Boucles

# - for
a = range(6)
for i in a:
    print i
    if i==2:
         continue
    elif i==4:
         break
d = {'a':1,  'b':2}
for key, val in d.items():
    print key, val
# - while
i = 0
while i < 5:
    i += 1
print i


# Interception d'erreur
try:
    print AAAAA
except:
    print 'Erreur'
    
    
# IMPORTANT : REFERENCE AUX VARIABLES NON PRIMAIRES

# - lien
a = [3, 5]
b = a
print a is b
b[0] = 100
print a

# - copy (rarement utilisé)
from copy import copy, deepcopy
ac = copy(a)
ec2 = list(a)
adc = deepcopy(a)


# Fonctions

# - inline
myfunc = lambda arg: arg+1
print myfunc(2)

# - normale
def myfunc2(arg, kwarg=4):
    """Documentation"""
    print arg, kwarg
# -> TESTER HELP, KWARG
print myfunc2.__doc__

# - arguments speciaux
def myfunc3(*args, **kwargs):
    print 'args', args
    print 'kwargs', kwargs
def myfunc4(a, b=1, **kwargs):
    print a, b, kwargs
myfunc4(1, **dict(b=3, c=5))
# -> TESTER


# Classes

# - declaration
class MaClasse(object):
    """Doc"""
    def __init__(self, a):
        self.a = a
    def foo(self, b):
        """Doc foo"""
        return self.a+b
        
# - initialisation
mc = MaClasse(5)
print type(mc)
print isinstance(mc, MaClasse)

# - utilisation
print mc.foo(10), mc.foo(100)


# Destruction
del mc

Attention aux règles de codage : Coding rules.

3.8.1.5. Modules importants

Librairie standard :

Librairies scientifiques :

  • Numérique : numpy.
  • Scientifique : scipy.
  • Graphiques : matplotlib, basemap.
  • Océano/Météo (UVCDAT) : cdms2, cdutil, genutil.

Divers :

  • Configurations avancées : configobj.

La librairie scipy regroupe beaucoup d’algorithmes scientifiques intéressants. Il est important de parcourir son contenu avant d’aller voir ailleur.

  • Clusters (cluster)
  • Constantes (constants)
  • Transformées de Fourier (fftpack)
  • Integration et ODEs (integrate)
  • Interpolation (interpolate)
  • Entrés/sorties (io)
  • Algèbre linéaire (linalg)
  • Modèle d’entropie max (maxentropy)
  • Traitement d’images (ndimage)
  • Orthogonal distance regression (odr)
  • Optimisation (optimize)
  • Traitement du signal (signal)
  • Matrices creuses (sparse)
  • Algèbre linéaire pour matrices creuses (linalg)
  • Algorithmes spatiaux (spatial)
  • Statistiques (stats)
  • Manipulation de tableaux d’image (stsci)
  • C/C++ integration (weave)

3.8.1.6. Avoir sa propre librairie

Créez le répertoire lib/mylib:

mkdir -p lib/mylib

Créez un module

$ echo "earth_radius = 6371006." > lib/mylib/mydata.py

Créer un fichier lib/mylib/__init__.py

$ echo "import mydata" > lib/mylib/__init__.py

Ajustez votre variable PYTHONPATH

$ setenv PYTHONPATH $PWD/lib:$PYTHONPATH

Testez

$ python -c 'import mylib.mydata as myd; print myd.earth_radius'

3.8.1.7. Où trouver de l’aide ?

Sources génériques :

  • Google.
  • Les documentations (générée avec sphinx) des paquets (modules).
  • Les didactitiels.

Documentation importantes :