On Apr 1, 10:56 pm, [EMAIL PROTECTED] wrote: > Hi all, > > I'm trying to understand generator functions and the yield keyword. > I'd like to understand why the following code isn't supposed to work. > (What I would have expected it to do is, for a variable number of > arguments composed of numbers, tuples of numbers, tuples of tuples, > etc., the function would give me the next number "in sequence") > #################################### > def getNextScalar(*args): > for arg in args: > if ( isinstance(arg, tuple)): > getNextScalar(arg) > else: > yield arg > #################################### > > # here's an example that uses this function: > # creating a generator object: > g = getNextScalar(1, 2, (3,4)) > g.next() # OK: returns 1 > g.next() # OK: returns 2 > g.next() # not OK: throws StopIteration error > > #################################### > > I'm sure I'm making some unwarranted assumption somewhere, but I > haven't been able to figure it out yet (just started learning Python a > couple of days ago). > > Any help will be appreciated :)
You're pretty close, there's just one more thing left. The return value of a generator function is an iterable, something you're supposed to iterate over. In the 'if' clause you call recursively the generator on arg but you don't use the result, you discard it as soon as it is returned. What you have to do is iterate over the returned iterable and yield its values: # don't need parentheses around the if expression if isinstance(arg, tuple): for scalar in getNextScalar(arg): yield scalar Hope this helps, George -- http://mail.python.org/mailman/listinfo/python-list