CMU 15-112: Fundamentals of Programming and Computer Science
Class Notes: Functions Redux (part 1)


  1. Default args
    1. Default args example
    2. Do not use mutable default args
    3. One workaround for mutable default args
  2. Functions as parameters
  3. Lambda functions
  4. Functions inside functions
  5. Closures + Non-local variables
  6. Non-local variables fail on setting (use nonlocal)

  1. Default args
    1. Default args example
      def f(x, y=10): return (x,y) print(f(5)) # (5, 10) print(f(5,6)) # (5, 6)

    2. Do not use mutable default args
      def f(x, L=[ ]): L.append(x) return L print(f(1)) print(f(2)) # why is this [1, 2]?

    3. One workaround for mutable default args
      def f(x, L=None): if (L == None): L = [ ] L.append(x) return L print(f(1)) print(f(2)) # [2] (that's better)

    4. Functions as parameters
      def derivative(f, x): h = 10**-8 return (f(x+h) - f(x))/h def f(x): return 4*x + 3 print(derivative(f, 2)) # about 4 def g(x): return 4*x**2 + 3 print(derivative(g, 2)) # about 16 (8*x at x==2)

    5. 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

    6. Functions inside functions
      def f(L): def squared(x): return x**2 return [squared(x) for x in L] print(f(range(5))) try: print(squared(5)) except: print("squared is not defined outside f")

    7. Closures + Non-local variables
      def f(L): myMap = dict() def squared(x): result = x**2 myMap[x] = result return result squaredList = [squared(x) for x in L] return myMap print(f(range(5)))

    8. Non-local variables fail on setting (use nonlocal)
      def brokenF(L): lastX = 0 def squared(x): result = x**2 lastX = x return result squaredList = [squared(x) for x in L] return lastX print(brokenF(range(5))) def fixedF(L): lastX = 0 def squared(x): nonlocal lastX result = x**2 lastX = x return result squaredList = [squared(x) for x in L] return lastX print(fixedF(range(5)))