Cours

Les transparents du cours sur les dictionnaires et les expressions régulières sont disponibles ici.

Pour les exercices 3 et 4 nous utiliserons deux modules python : Requests et BeautifulSoup. Il n'y a pas de support spécifique pour ces modules mais le tutoriel suivant est une bonne référence.

Requests est un module python pour la gestion du HTTP. Ses fonctionnalités sont très variées (et vont bien au-delà du contenu de ce cours) :

  • Gestion domaines et URLS internationales
  • Keep-Alive & Groupement de connections (Pooling)
  • Sessions et Cookies persistants
  • Verification SSL
  • Authentifications Basic/Digest ou personnalisées
  • Gestion élégante des Cookies clé/valeur
  • Décompression automatique
  • Corps des réponses en unicode
  • Upload de fichiers multiparts
  • Timeouts de connexion
  • supprt de .netrc
  • Thread-safe.

BeautifulSoup est un module python qui permet de réaliser une analyse syntaxique (parsing, en anglais) pour le langage HTML (ou XML). Il a été écrit en python par Leonard Richardson. Une documentation trè complète est disponible à l'adresse suivante.

# Exemple de code permettant d'extraire les liens d'une page web
from bs4 import BeautifulSoup
 
soup = BeautifulSoup(open("./index.html"))
 
for anchor in soup.find_all('a'):
    print(anchor.get('href', '/'))

top

Exercice 1 - Jeu des capitales

Le but de cet exercice est de programmer un jeu permettant de réviser ses connaissances sur les capitales du monde. Le fichier capitales.txt contient une liste associant les pays et les capitales sur une même ligne en les séparant d'une espace (les espace dans les noms de pays ont été remplacées par le caractère _ ; par exemple "Afrique du Sud" est remplaçé par "Afrique_du_Sud".
  1. Écrire un script qui entre les données du fichier capitales.txt dans un dictionnaire (le nom du pays servant de clé).

  2. Écrire un script qui crée le dictionnaire inverse (ou les noms des capitales sont les clés).

  3. Écrire un script qui affiche un menu du type

    Entrer votre choix :
    • 1 - Apprendre les pays

    • 2 - Apprendre les capitales

    • 3 - Quizz par capitales

    • 4 - Quizz par pays

    • 5 - Quitter

    et lorsque l'utilisateur entrera son choix, il pourra ensuite
    • entrer le nom d'une capitale et obtenir le nom du pays (choix 1),
    • entrer le nom d'un pays et obtenir le nom de la capitale (choix 2),
    • donner le nom du pays correspondant à la capitale choisie par le programme (choix 3),
    • donner le nom de la capitale correspondant au pays choisi par le programme (choix 3),
  4. Améliorer le programme pour que la réponse de l'utilisateur soit validée même si il a utilisé une majuscule au lieu d'une minuscule, une minuscule au lieu d'une majuscule, une espace au lieu d'un "_", ...

import random

file_in = open('capitales.txt','r')
Liste = file_in.readlines()
file_in.close()

dicoP_C = {}
dicoC_P = {}

for couple in Liste:
    l = couple.split()
    dicoP_C[l[0]] = l[1]

for pays in dicoP_C:
    dicoC_P[dicoP_C[pays]] = pays

print dicoC_P['Bruxelles']

def ApprendrePays():
    capitale = raw_input("Entrer une capitale : ")
    print [capitale]
    print "Le pays est :", 
    print dicoC_P[capitale]

def ApprendreCapitales():
    pays = raw_input("Entrer un pays : ")
    print "La capitale est :", dicoP_C[pays]

def QuizzPays():
    n = len(dicoC_P)
    capitale = dicoC_P.keys()[random.randint(1,n)]
    print "La capitale est :", capitale
    pays = raw_input("Quel est le pays ?")
    if (pays == dicoC_P[capitale]):
        print "Bravo !"
    else:
        print "Perdu ! La reponse est, ", dicoC_P[capitale]

def QuizzCapitales():
    n = len(dicoP_C)
    pays = dicoP_C.keys()[random.randint(0,n)]
    print "Le pays est :", pays
    capitale = raw_input("Quelle est la capitale ?")
    if (capitale == dicoP_C[pays]):
        print "Bravo !"
    else:
        print "Perdu ! La reponse est, ", dicoP_C[pays]



while(1):
    print """
    1 - Apprendre les pays

    2 - Apprendre les capitales

    3 - Quizz par capitales

    4 - Quizz par pays

    5 - Quitter
    """
    n = input("Entrer votre choix :")
    if (n==1):
        ApprendrePays()
    if (n==2):
        ApprendreCapitales()
    if (n==3):
        QuizzCapitales()
    if (n==4):
        QuizzPays()
    if (n==5):
        break
top

Exercice 2 - La roue de la fortune

  1. Écrire un script qui prend entrée une chaîne de caractères contenant uniquement des lettres, des espaces et des tirets "-" et affiche la liste des mots possibles formés de mots du dictionnaire français où les tirets sont remplacés par des lettres. Par exemple, pour l'entrée : LA R-UE -E LA --RTUNE, le programme devra afficher :

    Les solutions possibles pour LA R-UE -E LA -ORTU-E sont :
    
       1. LA
    
       1. ROUE
    
       1. CE
       2. DE
       3. JE
       4. LE
       5. ME
       6. NE
       7. SE
       8. TE
    
       1. LA
    
       1. FORTUNE
       2. TORTURE
    
  2. Modifier votre script pour qu'il prenne en entrée une liste des lettres déjà proposées et ne retourne que les solutions ne contenant pas ces lettres.

#coding: latin-1

import re
dico = open("/usr/share/dict/french",'r')
mots = dico.read()
dico.close()

mots = re.sub('(é)|(è)|(ê)|(ë)','e',mots)
mots = re.sub('(à)|(â)|(ä)','a',mots)
mots = re.sub('(ù)|(û)|(ü)','u',mots)
mots = re.sub('(ô)|(ö)','o',mots)
mots = re.sub('(î)|(ï)','i',mots)
mots = re.sub('(ç)','c',mots)
mots = mots.lower()

while True:
	chaine = raw_input('Entrer une chaîne de caractères : ')
	if not re.search('[^A-Za-z\- ]',chaine):
		break

while True:		
	listelettres = raw_input('Entrer la liste des \
	                   lettres utilisées :')
	if not re.search('[^A-Za-z]',listelettres):
		break

listelettres=listelettres.lower()+re.sub('[ \-]','',chaine).lower()
# Les lettres contenues dans la chaine ont aussi été proposées

print listelettres

print "Les solutions possibles pour :", chaine.upper(), "sont"
print
chaine=re.sub('-','.',chaine.lower())
liste=re.split(' ',chaine)
for mot in liste:
    Occurences = re.findall('\n'+mot+'\n',mots)
    i = 1
    L = []
    for motvalide in Occurences:
	motvalide = re.sub('\n','',motvalide)
        test = True		
        for j in range(len(mot)):
            if mot[j] == "." and \
                    motvalide[j] in listelettres:
                test = False
        if motvalide in L:
            test = False
        if test:
            print i, motvalide.upper()
            L = L + [motvalide]
            i+=1
    if i==1:
        print "Pas de solution pour ce mot !"	
	
    print
top

Exercice 3 - Archives météorologiques

Météociel est un site qui propose des observations en temps réel et des prévisions météorologiques pour la France ainsi que des cartes des modèles numériques et des logiciels météorologiques. Il présente également les archives météorologiques des années précédentes.

  1. La page suivante fournit les données météorologiques du 1er janvier 2015. Écrire un script python qui produit les chaînes de caractères des pages Météociel fournissant les les données météorologiques du 1er janvier 2014 au 31 décembre 2014.

  2. En utilisant les modules Requests et BeautifulSoup, écrire un script Python qui ouvre la page du 1er janvier 2014 et affiche le code HTML du tableau contenant les données récapitulatives de cette journée.

  3. Améliorer votre script pour qu'il n'affiche que les températures maximale et minimale de cette journée.

  4. En utilisant les questions précédentes, écrire un script python qui récupère les températures maximale et minimale de tous les jours de l'année 2014 et les affiche sous forme d'un graphique.
top

Exercice 4* - Six Degrees of Kevin Bacon

The Six Degrees of Kevin Bacon est un jeu de quiz basé sur le concept du phénomène du petit monde et l'hypothèse selon laquelle chaque acteur peut être reié à Kevin Bacon via ses rôles dans six films ou moins. Le nom du jeu vient de la pièce de théâtre ayant illustré le principe des six degrés de séparation.

La page The Oracle of Bacon permet de rechercher le degré de séparation avec des acteurs de votre choix.

En utilisant les techniques de l'exercice précédent, écrire un script python qui étant donné le nom d'un acteur retourne le degré de séparation avec Kevin Bacon. Dans un premier temps, on pourra écrire un script qui permet de savoir si un acteur a joué dans un film avec Kevin Bacon (i.e. a un degré de séparation égal à 1).

La base de données IMDB est très complète et la page de Kevin Bacon est disponible.

top