Le cyberblog du coyote

 

Extra
Langues :

Editorial

Ce blog a pour objectif principal d'augmenter la culture informatique de mes élèves. Il a aussi pour ambition de refléter l'actualité technologique dans ce domaine.

mercredi 6 mai 2009

Codes sources

Tout bon ingénieur vous le dira : plutôt que de réinventer la roue, regardons d'abord si quelqu'un n'a pas déjà fait quelque chose qui ressemble à notre projet. PythonFrance.com met à disposition des codes sources en Python proposés par des internautes. Il y en a pour tous les goûts.

dimanche 3 mai 2009

Plus Court Solveur de Sudoku

Voici un programme en Python de 173 caractères seulement qui serait le plus court solveur de sudoku connu actuellement :

def r(a): i=a.find('0') if i<0:print a [m in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)]or r(a[:i]+m+a[i+1:])for m in`14**7*9`]r(raw_input())

Ce programme est extrêmement compact et condensé, voire cryptique. Ce n’est pas la meilleure façon de programmer, mais ça révèle souvent la puissance cachée de certains langages. Ce programme est décrit en anglais et en détail ici, mais voici son principe en gros et en français:

def r(a): ... r(raw_input()) // définit la fonction “r” qui résout le sudoku, puis on l’appelle en passant en paramètre ce que l’utilisateur a entré au clavier. Ca doit être une chaine de 81 caractères contenant ligne par ligne les chiffres de 1 à 9 donnés, et des 0 aux emplacements vides.

i=a.find('0') if i<0:print a // au début de la fonction, on cherche le premier emplacement vide. Si on ne le trouve pas, on imprime le sudoku résolu
la partie principale de la fonction utilise deux concepts puissants de Python:

  • la “lazy evaluation” qui fait que l’expression “a or b” est équivalente à “if not(a):b”
  • la “compréhension de liste” qui permet de créer une liste en écrivant une boucle à l’intérieur de [crochets]. Par exemple “l = [x**2 for x in range(10)]” crée la liste des carrés des 10 premiers nombres entiers
ainsi cette expression [(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)] fournit la “liste d’exclusion” contenant les chiffres qui ne peuvent pas figurer dans le trou à la position i. On l’obtient en parcourant toutes les celllules et en ajoutant à la liste la valeur des cases a[j] situées sur la même ligne, la même colonne ou dans le même bloc que i. Le grand test compliqué détermine ces conditions en utilisant les opérateurs modulo (%), ou binaire (|) et ou exclusif (^).

Finalement, le [m in [...] or r(a[:i]+m+a[i+1:])for m in`14**7*9`] remplit successivement la grille avec les chiffres possibles en utilisant la ‘lazy evaluation’ une fois de plus : ce n’est que si le chiffre m n’est pas dans la liste d’exclusion qu’on execute la partie droite du or, laquelle appelle récursivement la fonction r en lui passant la grille en paramètre la grille a[:i]+m+a[i+1:]. Ici , l’opérateur + sert à concaténer des listes : d’abord les i-èmes premières cases, puis le chiffre m proposé pour la case vide, puis les cases à partir de la i+1 ème.

Ce programme utilise donc une approche “force brute” loin d’être optimale en temps de calcul : on essaie les chiffres possibles dans chaque case vide jusqu’à ce que ça marche.

Reste à découvrir une astuce de geek que je ne connaissais pas : 14**7*9 vaut 948721536, un nombre qui contient les chiffres 123456789, dans le désordre, mais ça va aussi pour notre application. Les backquotes ´…´ servent à former une chaine, comme d’ailleurs la fonction str(). L’avantage de ´14**7*9´sur “123456789″ ? ben c’est évident : il faut deux bytes de moins …

Source : Dr Goulu

samedi 25 avril 2009

Apprenez d'abord Python (2)

Pour compléter la conférence d'hier, voici l'article Apprenez d'abord Python qu'Eric Le Bigot a écrit dans la revue Linux Magazine No 40. Un numéro à se procurer absolument, si c'est encore possible.

vendredi 24 avril 2009

Apprenez d'abord Python

Eric Le Biot prône d'utiliser Python comme premier langage de programmation. Je suis du même avis. Vous pouvez visionner l'exposé qu'il a fait à la conférence Pycon Fr 2008 (durée : 29 minutes).
Comme la vidéo n'est pas de très bonne qualité, voici les diapositives projetées lors de l'exposé.

jeudi 23 avril 2009

SciPy

SciPy est un projet visant à unifier et fédérer un ensemble de bibliothèques Python à usage scientifique. Cette distribution de modules est destinée à être utilisée avec le langage interprété Python afin de créer un environnement de travail scientifique très similaire à celui offert par Matlab. Il contient par exemple des modules pour l'optimisation, l'algèbre linéaire, les statistiques ou encore le traitement du signal. Il offre également des possibilités avancés de visualisation grâce au module "matplotlib".

mercredi 22 avril 2009

Python(x,y)

Python(x,y) est un logiciel libre scientifique de calcul numérique basé sur le langage Python, les interfaces graphiques Qt (et le cadre de développement associé) et l'environnement de développement libre Eclipse.
Avec Python(x,y), vous pouvez :

  • réaliser des calculs de manière interactive : graphiques 2D et 3D, calcul matriciel, calcul formel, etc. ;
  • choisir la simplicité d'un style de programmation fonctionnel (avec une syntaxe proche de celle de MATLAB*) aussi bien que la puissance d'un style de programmation orienté objet ;
  • entreprendre des projets de développement du plus simple script à la plus sophistiquée des applications grâce au cadre de développement Qt et à la plateforme Eclipse ;
  • exécuter des scripts en calcul parallèle sur des ordinateurs multiprocesseurs (ou multicoeurs) et sur des clusters (avec Parallel Python) ; ...et ce ne sont que quelques exemples !

samedi 18 avril 2009

wxPython

wxPython est une implémentation libre en Python de l'interface de programmation wxWidgets. Cette bibliothèque Python est utilisée pour la création d'interfaces graphiques, et est l'alternative de Tkinter la plus utilisée.
wxPython essaie d'unir la simplicité et la lecture facile de Python avec une interface de programmation très complète. Ceci donne un cycle de développement rapide tout en permettant une grande complexité si nécessaire.
Pour pouvoir utiliser les logiciels qui utilisent cette bibliothèque, il est d'abord nécessaire de la télécharger et de l'installer sur le système, en plus de l'installation de Python, à moins de recevoir le logiciel sous forme de fichiers binaires.

Pour en savoir plus : Construire une interface graphique pas à pas en Python avec Tkinter et wxPython

vendredi 20 mars 2009

Pygame

Pygame est une bibliothèque libre multi-plateforme qui facilite le développement de jeux vidèos temps réel avec le langage de programmation Python. Elle est distribuée selon les termes de la licence GNU LGPL.
Construite sur la bibliothèque SDL, elle permet de programmer la partie multimédia (graphismes, son et entrées au clavier, à la souris ou au joystick), sans se heurter aux difficultés des langages de bas niveaux comme le C et ses dérivés. Cela se fonde sur la supposition que la partie multimédia, souvent la plus contraignante à programmer dans un tel jeu, est suffisamment indépendante de la logique même du jeu pour qu'on puisse utiliser un langage de haut niveau (en l'occurrence le Python) pour la structure du jeu.
Pygame, en plus d'adapter la SDL au Python, fournit également un petit nombre de fonctions spécifiques au développement de jeux.
On peut aussi remarquer que Pygame n'est plus utilisée exclusivement pour des jeux vidéos, mais également pour des applications diverses nécessitant du graphisme.
Par exemple, pour programmer un casse-briques, la SDL sera utilisée par l'intermédiaire de Pygame pour afficher les briques, la raquette et la balle. Ainsi, le programmeur pourra se concentrer sur les calculs des rebonds, des coordonnées de la balle et des destructions de briques. Des méthodes intégrées à PyGame permettront aussi de gérer les collisions entre les balles et les briques.

Voir le site officiel et le wikibook sur Pygame.

vendredi 23 janvier 2009

NumPy : bibliothèque de calcul scientifique pour Python

Fonctionnalités générales :
NumPy propose des tableaux multidimensionnels pour Python ainsi qu’une large gamme d’opérations efficaces sur ces tableaux : arithmétique, fonctions mathématiques, opérations structurales, etc. Les opérations sont inspirées par des langages comme APL ou Matlab.

Autres fonctionnalités : Algèbre linéaire (basé sur des routines LAPACK), FFT (basé sur FFTPACK), générateur de nombres aléatoires, f2py (générateur d’interface Python/Fortran)

Interopérabilité :
Le stockage des tableaux dans la mémoire est identique aux conventions des langages C et Fortran. Un même tableau peut être utilisé par du code en Python, C, et Fortran.

Contexte d'utilisation :
NumPy est la bibliothèque de base pour toute application de Python dans le domaine du calcul scientifique. Il y a un grand nombre d’utilisateurs autant dans la recherche et l’enseignement que dans l’industrie.

Limitations, difficultés, fonctionnalités importantes non couvertes :
Les fonctionnalités en algèbre linéaire ne couvrent que les matrices générales et symétriques. Il n’y a aucun support pour les matrices creuses.

Site officiel : numpy.org
Tutoriel : Initiation au traitement d'image avec NumPy

dimanche 11 janvier 2009

matplotlib

matplotlib est une librairie graphique Python qui produit toutes sortes de graphiques mathématiques.