[Python-Dev] For/while/if statements/comprehension/generator expressions unification (original) (raw)

Josiah Carlson jcarlson at uci.edu
Tue Sep 20 02:30:34 CEST 2005


Alexander,

The essence of what you have proposed has been proposed (multiple times) before, and I seem to remember it was shot down.

The below functions offer the equivalent of list comprehensions with a final post-processing step.

def cross(*args): if len(args) == 1: for i in args[0]: yield i elif len(args) == 2: for i in args[0]: for j in args[1]: yield i,j else: for i in args[0]: for j in cross(*args[1:]): yield (i,) + j

def cross_with_predicate(*args, **kwargs): if not 'pred' in kwargs: for i in cross(*args): yield i pred = kwargs['pred'] if len(args) > 1: for i in cross(*args): if pred(*i): yield i else: for i in cross(*args): if pred(i): yield i

Feel free to use that code and/or modify it to your heart's content (be careful of attempting to simplify cross, .

Alexander Myodov <maa_public at sinn.ru> wrote:

Hello,

Well, we have "for", "while" and "if". We also have statements, list generator expressions and list comprehensions. In comprehensions we have the opportunity to use several for-s and in a same expression (for i in range (0, 640) for j in range (0, 640)), in loops we cannot; in comprehensions, we can use if-s to filter the items; in loops, we cannot, and we have to write an inner comparison instead. My opinion is that in so smart language as Python is, it would be great to have them generalized, so that the features available in list comprehensions should be available in statements, vice versa. All three statements (for/while/if) could be joined together into a single common one, where any of these could be combined and used multiple times (but for the cases when a "else"/"elif" etc causes are required, old-school one-statements should be left); and for such common expressions, they should be equal for both loop statements and list comprehensions/generator expressions. That is, the following loops should be possible: ------- # This gives us some sugar to get rid of unnecessary indentations for x in range (0, 640) for y in range (0, 480): ------- _for x in range (0, 640) if shouldhandlethiscolumn(x) _ for y in range (0, 480) if shouldhandlethisrow(y): ------- for nX, nY in ( f(x), f(y) for x in range (0, 640) if shouldhandlethiscolumn(x) for y in range (0, 480) if shouldhandlethisrow(y) ): ------- for x in range (0, 640) for y in range (0, 480) while(!timeout()): ------- for x in range (0, 640) while(!timeoutposinrow()) for y in range (0, 480) while(!timeoutrows()): ------- # And the latest and the hugest one: _for x in range (0, 640) if shouldhandlethiscolumn(x) while(!timeoutposinrow()) _ for y in range (0, 480) if shouldhandlethisrow(y) while(!timeoutrows() : ------- # And almost the same as generator expression: for x, y in ( f(x), f(y) for x in range (0, 640) if shouldhandlethiscolumn(x) while(!timeoutposinrow()) for y in range (0, 480) if shouldhandlethisrow(y) while(!timeoutrows() ) ------- Hope I didn't miss something important... -- With best regards, Alexander mailto:maapublic at sinn.ru


Python-Dev mailing list Python-Dev at python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/jcarlson%40uci.edu



More information about the Python-Dev mailing list