Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

des generateurs python en java (yield)

Apres avoir lu :
http://fr.wikipedia.org/wiki/Python_(programming_language)#G.C3.A9n.C3.A9rateurs

on y trouve un exemple tres interessant :
for n in gen_fibonacci(1000):
print n
cet exemple permet en gros de renvoyer un iterateur. Ce qui est marrant, c'est la syntaxe de l'iterateur... Plutot que de faire un objet, en python, ils ont une instruction qui sert a faire "plusieurs returns values"
def gen_fibonacci(max=sys.maxint):
a=0
b=1
while a<max:
yield a
a,b = b,a+b
c'est marrant comme syntaxe, si on pouvait avoir ca dans d'autres langages, ca serait le pied ;)

le principe est simple : yield sauve le contexte d'execution, et renvoie la valeur. quand on rappelle la fonction, le contexte est concerve.

en java, j'ai fait une classe du meme genre.
public class fibogen extends generator<Integer>{
protected void generateur(){
int d;
int a=0;
int b=1;
while(a<100){
yield(new Integer(a));
d=b;
b+=a;
a=d;
}
}
}
On la lance comme ceci :
fibogen foo = new fibogen();
Integer n;
while (foo.hasNext()){
n = foo.next();
System.out.println(n.toString());
}
bref, je vous presente ma classe, c'est porc, mais c'est marrant

abstract public class generator<T> implements java.util.Iterator<T>, java.lang.Runnable {
Thread t;
T foo;
enum Fin{
Debut, Dernier, Fini
}
Fin next = Fin.Debut;
enum State{
WaitValue, Valued;
}
State state;
public generator(){
t = new Thread(this);
t.start();
getnext();
}
public boolean hasNext(){
return next != Fin.Fini;
}
public T next(){
T n = foo;
if (next != Fin.Dernier) getnext();
else{
next = Fin.Fini;
}
return n;
}
public void getnext(){
state = State.WaitValue;
while (state != State.Valued){
if (next != Fin.Debut){
next = Fin.Fini;
return;
}
Thread.yield();
}
}

public void run(){
generateur();
next = Fin.Dernier;
t.interrupt();
}
protected void yield(T bar){
while (state != State.WaitValue){ Thread.yield(); }
foo = bar;
state = State.Valued;
Thread.yield();
}
abstract protected void generateur();
final public void remove(){}
}
c'est le genre de code que je trouve marrant, mais plutot inutiles dans un vrai projet ;)
Publié mercredi 9 juillet 2008 19:35 par coucou747
Classé sous : , , , , , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- 3 articles sur SQL Server (Data Structures, Scans and seeks, Data access strategies) par Code is poetry le il y a 9 heures et 24 minutes

- Mais que peut bien faire un MVP quand il ne code pas ??? par .net is good... C# is better ;) le il y a 11 heures et 50 minutes

- PowerShell : Comment exécuter un script PS depuis une fenêtre MS DOS ou Scheduled Task par Blog Technique de Romelard Fabrice le il y a 11 heures et 59 minutes

- EDM Designer par Matthieu MEZIL le il y a 15 heures et 28 minutes

- Small basic - un projet intéressant par Pierrick's Blog le 01-06-2009, 17:11

- SharePoint 2007 : Liste Personnalisée, Colonnes de Site et Menu Contextuel par Philippe Sentenac [MVP SharePoint] le 01-06-2009, 16:38

- [WPF/Silverlight] Ternary Converters par NeuroCypher's Blog le 01-06-2009, 15:18

- Bonne année, bonne santé et surtout de bons PowerPoint !!! par The Mit's Blog le 01-06-2009, 14:38

- Suggestions Visual Studio par BruNews le 01-06-2009, 12:06

- C++ VS 2010 et développement parallèle par Michel Perfetti [Miiitch] le 01-06-2009, 11:00