IMO we have a: dogs are mamals kind of relationship in Python.
I see what you mean, but I don't think it's true.
Every expression can be used where a statement is expected. (And this can be worded as: every expression is a statement.)
Not really. An expression statement is a statement that looks like an expression, but actually it's more than that: not only does it calculate the value of the expression, it also prints the value.
Note that it would be perfectly possible to modify the syntax into
expression_stmt ::= "exprstmt" expression_list
so that you would have to write
exprstmt 6*9
instead of just
6*9
That makes it clearer to see the distinction: 6*9 is an expression,
exprstmt 6*9
is a statement. An expression statement, more precisely.
Not every statement can be used where an expression is expected.
AFAIK *no* statement can be used where an expression is expected.
-- "Codito ergo sum" Roel Schroeven -- http://mail.python.org/mailman/listinfo/python-list