[Python-ideas] Statements vs Expressions... why?
arnodel at googlemail.com
Sun Sep 14 09:36:57 CEST 2008
On 14 Sep 2008, at 07:36, Cliff Wells wrote:
> On Sun, 2008-09-14 at 07:23 +0100, Arnaud Delobelle wrote:
>> On 13 Sep 2008, at 23:17, Cliff Wells wrote:
>>> On Sat, 2008-09-13 at 19:01 +0100, Arnaud Delobelle wrote:
>>>> So what does:
>>>> a = (if False: 1)
>>>> evaluate to?
>>> That's a good question. This is one of those areas where a
>>> would need to be created. My inclination is to say None (much
>>> like a
>>> function with no return statement).
>> Assuming the return value of "None", I go back to an example I gave
>> factors = for x in range(2, n):
>> if n % x == 0:
>> This doesn't work as intended (filtering out the non-factors). How
>> make it work? The only way I can think of is to make (if 0: 1)
>> a special "non-value" which loops will then filter out. But then we
>> all know what happens to non-values.
>> So how would you solve this problem?
> By writing it properly ;-)
> factors = for x in range ( 2, n ):
> if n % x == 0:
> yield x
> As I mentioned previously, in order to merge the concept of generator
> with a for-expression would require bringing in the yield keyword,
> as it does now for generator functions.
> The example you gave would evaluate to None (or perhaps an empty
> list or
> generator - that's a detail that would take more consideration before
> defining it).
OK, but this seems to me incompatible with current Python:
def chain(I, J):
for i in I: yield i
for j in J: yield j
>>> '-'.join(chain('spam', 'eggs'))
With your proposal, the first *expression* (for i in I: yield i) will
evaluate to something like iter(I) and then be discarded. Then the
second *expression* (for j in J: yield j) will evaluate to something
like iter(J) which will be discarded. So chain('spam', 'eggs') will
More information about the Python-ideas