Devoir (deuxième partie)

Inversion House, photo Amber Case cc-by-nc

, par Pierre

Générateur

Le code suivant est valable en Python 2.7, mais pas en Python 3.5. Le traduire en Python 3.5. Comment peut-on faire pour transmettre une valeur au générateur ?

  1. def copain(nom, n):
  2. for i in range(n):
  3. yield ('%s : %d' %(nom, i))
  4. yield ('Bob : bye')
  5.  
  6. def main():
  7. generateur = copain('Bob', 5)
  8. print generateur.next()
  9. generateur.send('salut bob') # cette valeur sera donnée au yield
  10. for i in generateur:
  11. print i
  12.  
  13. main()

Télécharger

Inverser l’inversion du contrôle

Nous avons vu comment utiliser les coroutines pour (re)inverser le
contrôle. Typiquement si nous prenons un programme dans lequel tout le
traitement est effectué par une fonction (typiquement un main) qui a
le contrôle de l’exécution du début à la fin et peut faire des appels
à l’environnement pour récupérer des données et que nous voulons
transformer ce programme en un programme dans lequel il y a une boucle
événementielle principale qui passe les données de l’environnement une
par une à une fonction (une callback), nous pouvons utiliser une
transformation en générateur, ou plus précisément une transformation
en coroutine (apte à recevoir des données envoyées par send()).

Soit le programme :

  1. def avancer():
  2. print "avancer d'une case"
  3.  
  4. def tg():
  5. print "tourner à gauche de 90°"
  6.  
  7. def obstacle():
  8. """
  9. retourne True s'il y a un obstacle devant le robot
  10. """
  11. return False
  12.  
  13. def main():
  14. for i in range(10):
  15. while not obstacle():
  16. avancer()
  17. tg()
  18.  
  19. main()

Télécharger

Compléter le programme suivant pour achever la reécriture en programme
avec boucle événementielle.

  1. import time
  2. def avancer():
  3. return "avancer"
  4.  
  5. def tg():
  6. return "tg"
  7.  
  8. def robot_obstacle():
  9. return False
  10.  
  11. def robot_execute(s):
  12. print "execution de l'ordre : ", s
  13.  
  14. # /!\ variable globale
  15. env = {'obstacle': False}
  16.  
  17. def main():
  18. yield "debut de main"
  19. for i in range(10):
  20. while not env["obstacle"]:
  21. yield avancer()
  22. yield tg()
  23.  
  24. env["callback"] = TODO_COMPLETER
  25.  
  26. def main_loop(callback):
  27. print callback.next()
  28. for i in range(1000):
  29. env['obstacle'] = robot_obstacle()
  30. time.sleep(1)
  31. ordre_robot = TODO_COMPLETER
  32. robot_execute(ordre_robot) # execture un ordre
  33. print 'fin de la boucle evt'
  34.  
  35. main_loop(env["callback"])

Télécharger

Version Python 3.5.
Donner une version Python 3.5 de ce programme avec boucle
événementielle.

Délégation à un sous-générateur.

Supposons que dans le code non événementiel, dans le main, on ait
délégué une partie du traitement à une fonction qui passe plusieurs
ordres au robot. Comment aurait-on pu réécrire le programme de façon événementielle ? Répondre en Python 2.7 et en Python 3.5.

  1. ...
  2. def avancer_obstacle():
  3. while not obstacle():
  4. avancer()
  5.  
  6. def main():
  7. for i in range(10):
  8. avancer_obstacle()
  9. tg()
  10. ...

Télécharger

Vous rendrez cette seconde partie du devoir avant mardi 8 décembre 8h30, en utilisant un format ouvert. Un format texte (avec éventuellement une syntaxe markdown) incluant les programmes serait parfait. Sinon (pdf etc.) assurez-vous qu’il soit facile de copier/coller le code de vos programmes dans un fichier texte.

Revenu et logement, Je livre ici quelques éléments de comparaison concernant mon niveau de vie, pour couper court à quelques idées reçues, et un condensé de nombreuses (...)
Revenu et travail d’un enseignant-chercheur, Cet article complète l'article Revenu et logement, en détaillant un peu le budget de mon ménage, mon parcours d'enseignant-chercheur en terme de (...)
Cybersyn (el systemo synco), Au café, mardi 5 avril 2011, j'ai bien vu que, mis à part Antoine Allombert, personne ne connaissait l'histoire de l'extraordinaire projet chilien (...) [jpg, jpg, png]