Es lebt: lambda + yield
Verfasst: Dienstag 23. Dezember 2008, 11:08
Vorhin drauf gestossen:
Grade der Tupel in Zeile 8 ist interessant, es wird also kein Generator zurückgegeben, sondern ein Tupel mit yield Rückgabewerten, da yield ja seit 2.5? ja ein Ausdruck ist, und diese kommen dann durch lambda auch in den Generator... oder so. Auf jeden Fall sieht das nicht gesund aus 
Hier nochmal mit gen.send():
Disassembliert:
(Return Value? Also kein yield im letzten Schritt und trotzdem über den Generator erreichbar?)
Py 2.5. ist das in 2.6 / 3.0 immernoch so (habe es nicht kompiliert vorliegen)? Im 3.0 Changelog (http://www.python.org/download/releases/3.0/NEWS.txt, war das Einzige was ich mittels python.org Suche gefunden habe und einem Changelog nahekam) habe ich zu lambda oder yield nichts gefunden.
Code: Alles auswählen
n [1]: a = lambda: (yield 1)
In [2]: a()
Out[2]: <generator object at 0xb78327ac>
In [3]: a().next()
Out[3]: 1
In [4]: a = lambda: ((yield 1), (yield 2))
In [5]: b = a()
In [6]: b.next()
Out[6]: 1
In [7]: b.next()
Out[7]: 2
In [8]: b.next()
Out[8]: (None, None)
In [9]: b.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
/home/str1442/<ipython console> in <module>()
StopIteration:

Hier nochmal mit gen.send():
Code: Alles auswählen
In [10]: a = lambda: ((yield 1), (yield 2))
In [11]: b = a()
In [12]: b.next()
Out[12]: 1
In [13]: b.send(5)
Out[13]: 2
In [14]: b.next()
Out[14]: (5, None)
In [15]: b.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
/home/str1442/<ipython console> in <module>()
StopIteration:
Code: Alles auswählen
In [18]: dis.dis(a)
1 0 LOAD_CONST 0 (1)
3 YIELD_VALUE
4 LOAD_CONST 1 (2)
7 YIELD_VALUE
8 BUILD_TUPLE 2
11 RETURN_VALUE
Py 2.5. ist das in 2.6 / 3.0 immernoch so (habe es nicht kompiliert vorliegen)? Im 3.0 Changelog (http://www.python.org/download/releases/3.0/NEWS.txt, war das Einzige was ich mittels python.org Suche gefunden habe und einem Changelog nahekam) habe ich zu lambda oder yield nichts gefunden.