One problem with Python's syntax, though, is that you can't have anonymous lambdas which span more than one line (unless perhaps you start using escapes, but that would miss the point).
>>> f = lambda x: (
... (
... print('a') or
... print('b')
... ) if x % 2
... else (
... print('c') or
... print('d')
... )
... )
>>> f(42)
c
d
>>> f(43)
a
bThat is strikingly hideous. After such knowledge, what forgiveness?
Which looks a bit better.
The walrus operator moves Python closer to the expressions-camp.
In practice, the bigger problem with a more functional Python is that the ubiquitous dicts don't have nice and concise operators for persistent operations. Eg you can concatenate two lists via +, but dicts are more cumbersome.
Though that improved a bit, {dictA, dictB} mostly solves that problem. But more operators would be useful.
And, of course, lack of tail call elimination puts a damper on things. You can mostly work around that problem, but eg implementing state machines as mutually recursive functions is going to be a pain.
func(
lambda: otherfunc(
1, 2, 3, 4
)
)
And you don't need statements, given that with haskell semantics there are no statements.