On Sat, Aug 11, 2012 at 3:30 PM, John Ladasky <john_lada...@sbcglobal.net> wrote: <snip> > for x in range(1 + not(len(L) % 2)): > # Do stuff > > This provoked a SyntaxError. I investigated this further with my interpreter > (ipython). <snip> > In [5]: not(1) > Out[5]: False > > In [6]: not(len(L) % 2) > Out[6]: False > > In [7]: 1 + not(len(L) % 2) > ------------------------------------------------------------ > File "<ipython console>", line 1 > 1 + not(len(L) % 2) > ^ > SyntaxError: invalid syntax <snip> > Why is using a logical "not" function, as shown in [7], returning a different > result than the test for equivalency as shown in [10]?
Note that, in Python, `not` is an unary operator (it's a language keyword in fact), as opposed to a function: Python 2.7.2 (default, Jun 20 2012, 16:23:33) >>> len("abc") 3 >>> # functions are first-class entities in Python, so we can reference them >>> len <built-in function len> >>> not(1) False >>> # but `not` isn't a function >>> not File "<stdin>", line 1 not ^ SyntaxError: invalid syntax >>> # hence why we don't need to call it >>> not 1 False The parentheses in `not(foo)` are just grouping the `foo` subexpression; they're not indicating a function call. Therefore, in idiomatic Python, such parentheses are omitted whenever possible (which is the majority of the time), and when they are absolutely necessary, a space is included before the opening paren, because we're not making a function call. Thus, you're simply running into an operator precedence issue, which, as Chris A. explained, can be remedied by adding grouping parens around the entire `not` expression; e.g. `(not foo)` Cheers, Chris R. -- http://mail.python.org/mailman/listinfo/python-list