Home

Hello all,


I bumped into an unexpected problem using generators. Consider this code:

def test(s):
return _test([], [], s)
def _test(s1, s2, s):
if s:
s1.append(s.pop())
for x in _test(s1, s2, s):
yield x
s2.append(s1.pop())
for x in _test(s1, s2, s):
yield x
s.append(s2.pop())
else:
yield s1, s2

The test function is supposed be a generator returning all combinations
of dividing the elements of the input list into two distinct lists
(order of elements unimportant). (This post is not about the quality of
the solution. :-) )

Consider now the result of using the generator in a for-loop and in the
list function (same result for list comprehension):

>>> for x in test(range(3)):
.... print x
....
([2, 1, 0], [])
([2, 1], [0])
([2, 0], [1])
([2], [1, 0])
([1, 0], [2])
([1], [2, 0])
([0], [2, 1])
([], [2, 1, 0])
>>>
>>> list(test(range(3)))
[([], []), ([], []), ([], []), ([], []), ([], []), ([], []), ([], []),
([], [])]

The following (simpler) generator works as expected:

>>> def test2(s):
.... for x in s:
.... yield x
....
>>> list(test2(range(3)))
[0, 1, 2]

Can anyone explain the difference? The python version is 2.5.1.


Regards,

Joost

previous
next

Re: Replacement for "switch" that can use non-const values?
Re: Python 3K or Python 2.9?
Re: Puzzled by "is"
Re: I earn $36800 a month with google adsense
Re: Code design problem
planowanie ślubu
obejrzeniach.waw.pl
nawierzchnie poliuretanowe
balustrady nierdzewne
Aminokwasy