(site sans réclame)

Modules externes pour python 2.5 - www.jchr.be

La page Introduction à python 2.5 présente quelques modules internes, c'est-à-dire installés automatiquement avec l'application Python. D'autres modules doivent être installés en supplément de python, comme s'il s'agissait d'applications extérieures. Il se peut que les noms de paquet diffèrent des noms de module à charger. Sur une distribution Debian, ces modules installés se trouvent à une adresse qui ressemble à /usr/lib/python2.4/site-packages/

Voyez ici pour les généralités concernant les modules.

Tkinter, wxPython, PyQt, PyGTK pour une interface graphique
numpy remplace math et random, Numeric ou numarray (tableaux et matrices)
stats pour le traitement statistique à partir de listes, tuples et tableaux numpy
PIL (module python-imaging) pour le traitement des images
sqlite et mysqldb pour les bases de données de type SQL

apt-get install python-mysqldb python-stats python-numpy installe ces derniers paquets sur un système Debian

Module numpy (tableaux et matrices)

Voir impérativement la page modules pour les généralités.

Ce module, apparu sur Debian à partir de la version 4.0 Etch (Python2.4?), est destinée à remplacer les modules externes Numeric et numarray. Il prend également en charge les fonctionnalités des modules internes (c)math et random.

Tableaux

array([[2,4],[9,7],[3,5]) définit in extenso un tableau de trois rangées de deux éléments
array([[2]*3]*4) produit un tableau de quatre rangées de trois éléments, intialisés à 2
arange() produit un tableau unidimensionnel avec la suite précisée (voir range(), "réels" acceptés)
empty((d1,d2,...),'type') construit un tableau à n dimensions, chacune ayant d1,d2... éléments; ces éléments ne sont pas initialisés, mais un type peut être défini: 'i'=entiers, 'f'=float32, 'd'=floatdouble, 'c'=caractères

zeros((d1,d2,...),'type') construit un tableau à n dimensions, chacune ayant d1,d2... éléments; chaque élément est initialisé à 0
ones((d1,d2,...),'type') construit un tableau à n dimensions, chacune ayant d1,d2... éléments; chaque élément est initialisé à 1

reshape(a,(n,m...)) remet les éléments d'un tableau dans un autre redimensionnement (cela doit tomber juste):

>>> reshape([1,2,3,4,5,6],(2,3))
array([[1, 2, 3],
       [4, 5, 6]])

À suivre...

numpy: fonctions mathématiques

Vous trouverez quelques informations sur ces fonctions en 2.1 math

fonctions unaires: absolute, negative, sign, fabs, fmod, conjugate, floor, ceil
exp, log, log2, log10, sqrt
invert, left_shift, right_shift, logical_not
sin, cos, tan, sinh, cosh, tanh
arcsin, arccos, arctan, arcsinh, arccosh, arctanh

fonctions binaires: add, subtract, multiply, divide, divide_safe, power
greater, greater_equal, less_equal, less, equal, not_equal
bitwise_and, bitwise_or, bitwise_xor
logical_and, logical_or, logical_xor
maximum, minimum, hypot(c1,c2)
around(reel,n) arrondissement d'un réel à la nième décimale
arctan2(y,x) donne la pente à partir de deux nombres, réponses de -PI à PI selon les signes respectifs de y et x

numpy: sous-module random

Ce sous-module peut remplacer le module interne random.

bytes(n) donne une chaîne de n caractères au hasard.

randint(n) ou random_integers(n) retourne un entier de 1 à n non inclus
randint(n,m) ou random_integers(n,m) retourne un entier de n à m non inclus
permutation(n) donne un tableau mélangé à une dimension de la série de 0 à n-1. permutation(n)+m donne un tableau mélangé à une dimension de la série de m à m+n-1.

ranf, random, sample ou random_sample() retourne un réel dans l'intervalle [0,1[
ranf, random, sample ou random_sample(n) retourne un tableau de n réels dans l'intervalle [0,1[
rand(d0,d1...) retourne un tableau à plusieurs dimensions, chaque élément est initialisé dans l'intervalle [0,1[

shuffle() mélange le contenu d'une liste ou tableau à une dimension:

>>> a=[1,2,3,4]
numpy.random.shuffle(a); print a

Les fonctions suivantes renvoient un nombre aléatoire selon une loi de distribution, que vous connaissez probablement si vous en avez besoin:

beta(), binomial(), chisquare(), exponential(), f(), gamma(), geometric, gumbel(), hypergeometric(), laplace(), logistic(), lognormal(), logseries(), multinomial(), multivariate_normal(), negative_binomial(), noncentral_chisquare(), noncentral_f(), normal(), pareto(), poisson(), power(), rayleigh(), standard_cauchy(), standard_exponential(), standard_gamma(), randn() = standard_normal(), standard_t(), triangular(), uniform(), vonmises(), wald(), weibull(), zipf()

Par exemple, numpy.random.normal(2,1.3) retourne un réel selon la probabilité décrite par la répartition d'une courbe normale de centre 2 et d'écart-type 1.3.

Séquences ECMA-48 CSI

Affichage

Les séquences ECMA-48 permettent le formatage de la sortie sur console et commence par l'octet 27 "ESC". Cela permet notamment d'écrire à un endroit particulier de l'écran, effacer la console ou colorer caractères et fond. Cette fonctionnalité est d'origine avec GNU/Linux (documentation: /usr/share/man/man4/console_codes.4.gz). Par exemple: echo -e "\033[2J" efface la console.

Sous Windows NT et suivant, il suffirait d'ajouter la ligne DEVICE=ANSI.SYS dans le fichier CONFIG.NT. On peut passer des instructions en ligne de commande avec prompt $e[2J (par exemple).

Plus d'informations: http://en.wikipedia.org/wiki/ANSI_escape_code.

La séquence générale est ESC [ # CODE (sans espace)

ESC est l'octet 27, en python: chr(27) ou "\033" ou "\x1b"
[ est la parentèse carrée ouvrante
# symbolise ici un nombre en base décimale, plusieurs paramètres sont séparés par un point-virgule
CODE est une lettre de l'alphabet

\033[2J efface tout l'écran
\033[H place le curseur en haut à gauche
\033[#;#_H place le curseur à un point particulier de l'écran. \033[1;1H place le curseur en haut à gauche

\033[#A déplace le curseur de # caractères vers le haut
\033[#B déplace le curseur de # caractères vers le bas
\033[#C déplace le curseur de # caractères vers la droite
\033[#D déplace le curseur de # caractères vers la gauche
\033[#f place le curseur à la ligne # , première colonne
\033[#L insère # lignes à la position du curseur, repousse la suite
\033[#M efface # lignes à la position du curseur, ramène les suivantes
\033[#a place le curseur à la ligne #, colonne inchangée
\033[#;#r définit une première et une dernière ligne pour le scroll
\033[s sauvegarde la position du curseur
\033[u replace le curseur à la position préalablement sauvegardée
\033[?25l cache le curseur; \033[?25h le rétablit

Les couleurs (très limitées) se codent \033[_m le souligné doit être remplacé par:

0 réinitialisation: blanc sur fond noir
1 haute intensité
3n couleur du caractère
4n couleur du fond
5 clignotement
7 inverse-video

 Caractère      Fond
30 Gris moyen  40 Noir
31 Rouge       41 Rouge foncé
32 Vert        42 Vert foncé
33 Jaune       43 brun
34 Bleu        44 Bleu foncé
35 Magenta     45 Mauve
36 Cyan        46 Cyan foncé
37 Blanc       47 gris clair
39 Blanc gras

On compose couleurs de caractère et de fond en séparant les nombres par un point virgule:

>>> print "\033[33;45m"+"Spam?"+"\033[0m"
Spam?

Le module ecma (expérimental) permet l'utilisation simple de ces codes:
paintat(ligne,colonne,texte,fond,"Chaine")

Voir Modules utilisateurs pour l'utilisation d'un module fait à la maison. Copiez le code ci-dessous dans un fichier nommé ecma.py.

"""module python ecma.py - 2007.02.07 - www.jchr.be - GPL-2 - Ver 1.1 2008.01.15
Enhanced (line, column, color) console printing functions using some ECMA-48 sequences"""

def colors():
  """Composition of colors: add red=1, green=2 or blue=4. You can use number or chain to choose color:
 Text:               Background: (darker than the first name - official)
0, 30 or 'grey'     0, 40 or 'black'
1, 31 or 'red'      1, 41, 'red' or 'darkred'
2, 32 or 'green'    2, 42, 'green' or 'darkgreen'
3, 33 or 'yellow'   3, 43, 'yellow' or 'brown'
4, 34 or 'blue'     4, 44, 'blue' or 'marine'
5, 35 or 'magenta'  5, 45, 'magenta' or 'purple'
6, 36 or 'cyan'     6, 46, 'cyan' or 'darkcyan'
7, 37 or 'white'    7, 47, 'white' or 'lightgrey'
9, 39 or 'bright'"""
  print """Composition of colors: add red=1, green=2 or blue=4. Use number or chain to choose a color:
 Text:               Background: (darker than the first name - official)
0, 30 or 'grey'     0, 40 or 'black'
1, 31 or 'red'      1, 41, 'red' or 'darkred'
2, 32 or 'green'    2, 42, 'green' or 'darkgreen'
3, 33 or 'yellow'   3, 43, 'yellow' or 'brown'
4, 34 or 'blue'     4, 44, 'blue' or 'marine'
5, 35 or 'magenta'  5, 45, 'magenta' or 'purple'
6, 36 or 'cyan'     6, 46, 'cyan' or 'darkcyan'
7, 37 or 'white'    7, 47, 'white' or 'lightgrey'
9, 39 or 'bright'"""

def clear(chain=''):
  """Clears the screen"""
  print "\033[2J"

def cls(chain=''):
  """Clears also the screen"""
  print "\033[2J"

def home(chain=''):
  """Writes a chain at the 'home' position (upper left corner)"""
  print "\033[H"+chain

def new(chain=''):
  """Clears the screen and writes at the home position - same as clear + printat(1,1,chain)"""
  print "\033[2J\033[H"+chain

def fgcolor(fg):
  """Used by paint() and paintat(): encodes the foreground color"""
  try:
    fg+1 # if not a number, a string:
  except:
    bg=bg.lower()
    if fg=="grey" or fg=="gray": return 30
    if fg=="red": return 31
    if fg=="green": return 32
    if fg=="yellow": return 33
    if fg=="magenta": return 34
    if fg=="magenta": return 35
    if fg=="cyan": return 36
    if fg=="white": return 37
    if fg=="bright": return 39
  else:
    if fg<10: return fg+30
    else: return fg

def bgcolor(bg):
  """Used by paint() and paintat(): encodes the background color"""
  try:
    bg+1 # if not a number, a string:
  except:
    bg=bg.lower()
    if bg=="black": return 40
    if bg=="red" or bg=="darkred": return 41
    if bg=="green" or bg=="darkgreen": return 42
    if bg=="brown" or bg=="brown": return 43
    if bg=="blue" or bg=="marine": return 44
    if bg=="magenta" or bg=="purple": return 45
    if bg=="cyan" or bg=="darkcyan": return 46
    if bg=="white" or bg=="lightgrey" or bg=="lightgray": return 47
  else:
    if bg<10: return bg+40
    else: return bg

def printat(line,column,chain=''):
  """Writes a chain at a precise line/column"""
  print "\033["+str(line)+";"+str(column)+"H"+chain

def paint(fg,bg,chain=''):
  """Writes a colored chain - call ecma.colors()"""
  print "\033["+str(fgcolor(fg))+";"+str(bgcolor(bg))+"m"+chain

def paintat(line,column,fg,bg,chain=''):
  """Writes a colored chain at a precise line/column - call ecma.colors()"""
  print "\033["+str(line)+";"+str(column)+"H"+"\033["+str(fgcolor(fg))+";"+str(bgcolor(bg))+"m"+chain