On Fri, Mar 14, 2014 at 09:07:18PM -0500, Christopher Welborn wrote:
mylist = ['apple', 'banana', 'orange', 'grapefruit']
# Why is this okay... for item in [x for x in mylist if 'p' in x]: print(item)
# But this isn't? for item in mylist if 'p' in item: SyntaxError: invalid syntax
This suggestion has been made, oh, a million times -- not that I would ever exaggerate... *wink* -- and has been rejected each time. Personally, I don't think it gains you too much, all you save is one line and one nesting level, and if you're nested so deeply that this becomes important, your code is probably in desperate need of refactoring. The downside includes additional complication. It's one more thing for people to learn. Not only do you have to learn that there are two independent features, the for-statement and the if-statement, which being independent can be combined however you like: # 1 for x in seq: if cond: ... #2 if cond: for x in seq: ... but now you also have to learn a *third* form: for x in seq if cond: ... and learn that it is the same as #1 above rather than #2 above. And that there *isn't* a fourth form: if cond for x in seq: ... or other combinations like: while x if cond: if cond while x: if cond try: for x try: for x if y try: etc. The way statements work in Python is that you combine them by using a new line and starting a new block, not by having special syntactic forms for each combination. List comprehensions are different, because they don't create a new block, and they are an expression not a statement. -- Steven