Hmmm. I can't really see what you are saying. Your example doesn't
quite get the intention. The "while" clause in the example would
translate like this:
def gen():
for i in range(100):
if i <= 50:
yield i
else:
break
Also, I think that for a new python user,
(n for n in range(100) while n*n < 50)
is easier to understand and use than:
(n for n in takewhile(lambda n:n*n < 50, range(100)))
My proposed version is shorter (less chance for typos), has one less
set of parentheses (always a good thing) and reads naturally. Also,
it is directly analogous to:
(n for n in range(100) if n*n < 50)
except that the "while" version stops when n reaches 8. The "if"
version doesn't stop until n reaches 99.
On Sat, Jan 10, 2009 at 5:45 PM, Steven Bethard
<steven.bethard at gmail.com> wrote:
> [Fixing the top-posting. Note that only Guido is allowed to top-post
> around here. ;-)]
>
> On 1/10/09, Steven Bethard <steven.bethard at gmail.com> wrote:
>> I think this could end up being confusing. Current generator
>> expressions turn into an equivalent generator function by simply
>> indenting the clauses and adding a yield, for example:
>>
>> (i for i in range(100) if i % 2 == 0)
>>
>> is equivalent to:
>>
>> def gen():
>> for i in range(100):
>> if i % 2 == 0:
>> yield i
>>
>> Now you're proposing syntax that would no longer work like this.
>> Taking your example:
>>
>> (i for i in range(100) while i <= 50)
>>
>> I would expect this to mean:
>>
>> def gen():
>> for i in range(100):
>> while i <= 50:
>> yield i
>
> On Sat, Jan 10, 2009 at 2:34 PM, Gerald Britton
> <gerald.britton at gmail.com> wrote:
>> I guess I don't think it would be confusing. On the contrary, I
>> believe that the expressions would read naturally and be a nice
>> simplification. Of course it won't work just like "if" but that is
>> just the point! I can (and do) accomplish the same thing with
>> "takewhile", but if the same thing can be sone with a little addition
>> to the generator expression, why not do it?
>
> I'm probably just repeating myself here, but the reason not to do it
> is that the current generator expressions translate almost directly
> into the corresponding generator statements. Using "while" in the way
> you've suggested breaks this symmetry, and would make Python harder to
> learn.
>
> Steve
> --
> I'm not *in*-sane. Indeed, I am so far *out* of sane that you appear a
> tiny blip on the distant coast of sanity.
> --- Bucky Katt, Get Fuzzy
>