deff(x, L=[ ]):
L.append(x)
return L
print(f(1))
print(f(2)) # why is this [1, 2]?
One workaround for mutable default args
deff(x, L=None):if (L == None):
L = [ ]
L.append(x)
return L
print(f(1))
print(f(2)) # [2] (that's better)
Functions as parameters
defderivative(f, x):
h = 10**-8return (f(x+h) - f(x))/h
deff(x):return4*x + 3
print(derivative(f, 2)) # about 4defg(x):return4*x**2 + 3
print(derivative(g, 2)) # about 16 (8*x at x==2)
Lambda functions
print(derivative(lambda x:3*x**5 + 2, 2)) # about 240, 15*x**4 at x==2
myF = lambda x: 10*x + 42
print(myF(5)) # 92
print(derivative(myF, 5)) # about 10
Keyword args (**kwargs)
deff(x=1, y=2):return (x,y)
print(f()) # (1, 2)
print(f(3)) # (3, 2)
print(f(y=3)) # (1, 3) [here is where we use a keyword arg]deff(x, **kwargs):return (x, kwargs)
print(f(1)) # (1, { })
print(f(2, y=3, z=4)) # (2, {'z': 4, 'y': 3})
Functions inside functions
deff(L):defsquared(x):return x**2return [squared(x) for x in L]
print(f(range(5)))
try:
print(squared(5))
except:
print("squared is not defined outside f")
Closures + Non-local variables
deff(L):
myMap = dict()
defsquared(x):
result = x**2
myMap[x] = result
return result
squaredList = [squared(x) for x in L]
return myMap
print(f(range(5)))
Non-local variables fail on setting (use nonlocal)
defbrokenF(L):
lastX = 0defsquared(x):
result = x**2
lastX = x
return result
squaredList = [squared(x) for x in L]
return lastX
print(brokenF(range(5)))
deffixedF(L):
lastX = 0defsquared(x):nonlocal lastX
result = x**2
lastX = x
return result
squaredList = [squared(x) for x in L]
return lastX
print(fixedF(range(5)))
Functions that return functions
defderivativeFn(f):defg(x):
h = 10**-5return (f(x+h) - f(x))/h
return g
deff(x):return5*x**3 + 10
fprime1 = derivativeFn(f)
fprime2 = derivativeFn(fprime1)
print(f(3)) # 145, 5*x**3 + 10 evaluated at x == 3
print(fprime1(3)) # about 135, 15*x**2 evaluated at x == 3
print(fprime2(3)) # about 90, 30*x evaluated at x == 3
Function decorators
@derivativeFndefh(x):return5*x**3 + 10
print(h(3)) # 135, matches fprime1 from above.