Here's what I'd like:

def myfunc(a, b, c = *lambda: expression):

The use of the lambda keyword here makes the scope of any variables in the expression clear. The use of the prefix * makes the syntax invalid today, suggests dereferencing and doesn't hide the overhead. This is equivalent to:

__unset = object()
__default = lambda: expression
def mfunc(a, b, c = __unset):
  if c == __unset:
    c = __default()

--- Bruce