<div dir="auto"><span style="font-family:sans-serif;font-size:12.8px">Hi list,</span><br style="font-family:sans-serif;font-size:12.8px"><div style="color:purple;font-family:sans-serif;font-size:12.8px" dir="auto"><br>> But when it comes to something like<br>> [f(x) + g(f(x)) for x in range(10)]<br>> you find you have to sacrifice some readableness if you don't want two f(x)<br>> which might slow down your code.<br>><br>> Someone may argue that one can write<br>> [y + g(y) for y in [f(x) for x in range(10)]]<br><br></div><span style="font-family:sans-serif;font-size:12.8px">personally I think that the biggest problem readability-wise is that </span><span style="font-family:sans-serif;font-size:12.8px">"for" is a post-fix operator, which makes generators much harder to </span><span style="font-family:sans-serif;font-size:12.8px">read. It's also very different from normal for loops, which have the </span><span style="font-family:sans-serif;font-size:12.8px">"for" at the top. IMHO generators would be much easier to read with a </span><span style="font-family:sans-serif;font-size:12.8px">prefix for, as in</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for x in range(10): f(x) + g(f(x))]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">also nested generators get nicer like that:</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for y in (for x in range(10): f(x)):</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">          y + g(y)]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">one could critique here that we shouldn't use colons in expressions, </span><span style="font-family:sans-serif;font-size:12.8px">but that boat has sailed: we use them for lambdas. We do not write</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">     sq = x**2 lambda x</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">and I am not proposing that.</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">Also if/else could be written with colons, but I am not sure whether </span><span style="font-family:sans-serif;font-size:12.8px">that's actually nicer:</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    val = (if attr is None: 5 else: attr + 3)</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">but it certainly is in case of ifs in generators:</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for x in range(10):</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         if x % 3 != 2: x]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">which could be problematic to parse if you compare that to</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for x in range(10):</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         if x % 3 == 2: x - 1</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         else: x + 1]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">one could even dig out the often-proposed always-rejected except-in-expression:</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for x in range(10):</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         try: f(x)</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         except WhateverError: None]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">or even a with:</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">    [for x in file_names:</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">         with open(x) as f:</span><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">             f.read()]</span><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><br style="font-family:sans-serif;font-size:12.8px"><span style="font-family:sans-serif;font-size:12.8px">Greetings</span><br style="font-family:sans-serif;font-size:12.8px"><font color="#888888" style="font-family:sans-serif;font-size:12.8px"><br>Martin</font></div>