"number-in-base" ``oneliner''

Bengt Richter bokr at oz.net
Mon Nov 1 21:34:30 CET 2004


On Mon, 01 Nov 2004 12:59:01 GMT, exarkun at divmod.com wrote:

>On Mon, 01 Nov 2004 07:20:51 GMT, bokr at oz.net (Bengt Richter) wrote:
>>On Mon, 01 Nov 2004 03:11:42 GMT, exarkun at divmod.com wrote:
>> 
>> >On Sun, 31 Oct 2004 19:00:07 GMT, bokr at oz.net (Bengt Richter) wrote:
>> >> [snip]
>> >> 
>> >> BTW, will anything that works in a list comprehension work in a generator expression
>> >> (assuming one does not depend on the generator expression having leftover outside
>> >> side effect bindings like the LC version)?
>> >> 
>> >
>> >  Nope.  For example, I don't think the code in this thread will work if converted to a generator expression.  A simplified example:
>> >
>> >    >>> x = 0 
>> >    >>> list(x for x in iter(lambda: x + 1, 4))
>> >    ( runs forever, so C-c )
>> >    Traceback (most recent call last):
>> >      File "<stdin>", line 1, in ?
>> >      File "<stdin>", line 1, in <generator expression>
>> >    KeyboardInterrupt
>> >    >>> [x for x in iter(lambda: x + 1, 4)]
>> >    [1, 2, 3]
>> >    >>> 
>> >
>> >  `x' in the lambda in the list comprehension resolves to a different name than `x' in the generator comprehension.
>> >
>> I had a sneaky suspicion that it _could_ be so, hoping not. But your example doesn't play fair
>> because you don't give x an initial condition inside the scope of the expression. E.g.,
>> 
>>  >>> [x for x in [0] for x in iter(lambda:x+1, 4)]
>>  [1, 2, 3]
>>  >>> list(x for x in [0] for x in iter(lambda:x+1, 4))
>>    File "<stdin>", line 1
>>      list(x for x in [0] for x in iter(lambda:x+1, 4))
>>               ^
>>  SyntaxError: invalid syntax
>> 
>
>  I'm not sure what "playing fair" means here :)  I gave an example of a list comprehension that behaves differently when trivially rewritten as a generator comprehension, without relying on the one behavioral difference you explicitly omitted.  I do appear to have been wrong about this change applying to the number_in_base function, though.
I meant you didn't provide an initial value for x inside the expression
like my number_in_base function, or [x for x in [0] ... above.
You did fair-and-square provide an example that won't translate to the
new gx context though. But it appears this is going to be a documentation
problem rather than a technical one, somewhat similar to explaining what
lambda:x+1 will use inside of a function. I.e., it depends on what else is
in the function and its environment.

BTW, did you try the above?
>From a post (with broken subject line ;-) of Steven Bethard's, it seems to work.
I'll re-quote it here to give it context:
----
>Bengt Richter <bokr <at> oz.net> writes:
>> 
>> Well, I don't have 2.4 yet, but what does it do?

>>>> [x for x in [0] for x in iter(lambda:x+1, 4)]
>[1, 2, 3]
>>>> list(x for x in [0] for x in iter(lambda:x+1, 4))
>[1, 2, 3]

>Looks like it does just what you'd hope it would do.  =)

>Steve
----


Regards,
Bengt Richter



More information about the Python-list mailing list