On May 1, 4:30 am, Steven D'Aprano <st...@remove-this- cybersource.com.au> wrote: > On Fri, 01 May 2009 16:30:19 +1200, Lawrence D'Oliveiro wrote: > > I have never written anything so unbelievable in my life. And I hope I > > never will. > > I didn't say you did. If anyone thought I was quoting Lawrence's code, > I'd be surprised. It was not my intention to put words into your mouth. > > But seeing as you have replied, perhaps you could tell us something. > Given so much you despise using non-bools in truth contexts, how would > you re-write my example to avoid "a or b or c"? > > for x in a or b or c: > do_something_with(x)
I think Hendrik's is the closest so far, but still doesn't iterate over x: for t in [a,b,c]: if t: for x in t: do_something_with(x) break This is still not right, since Steven's code will raise an exception if 'a' and 'b' test False, and 'c' is non-iterable. >>> for x in 0 or 0 or 0: ... print( x ) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable >>> for x in 0 or 0 or []: ... print( x ) ... >>> for x in 0 or 0 or 1: ... print( x ) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable >>> for x in ['abc'] or 0 or 0: ... print( x ) ... abc To mimic it exactly, you'd have to actually convert the first one, execute 'or' on the other two, since they may have side-effects or return other values than themselves, and try iterating over the last one. I think you are looking at an 'ireduce' function, which doesn't exist in 'itertools' yet. I don't think it would be very common to write Steven's construction for arbitrary values of 'a', 'b', and 'c'. -- http://mail.python.org/mailman/listinfo/python-list