It's better to set default values within the function because it composes better. For example let's say have this function:

```
def foo(val0=100):
  ...
```

And I wanted to call it from another function:

```
def bar(val1, val0):
  ...
  foo(val0)
```

But what if also wanted val0 to have a default value? I'd need to duplicate the the default value in the higher function

```
def bar(val1, val0=100):
  ...
  foo(val1, val0)
```

So that's why it's better to use `None` a proxy value for the default value:

```
def bar(val1, val0=None):
  ...
  foo(val1, val0)

def foo(val0=None):
  val0 = val0 or 100
  ...
```

That way you can keep the actual default value in a single place.