61A Lecture 5 Wednesday, September 7 Wednesday, September 7, 2011 Office Hours: You Should Go! You are not alone! 2 Wednesday, September 7, 2011 Office Hours: You Should Go! You are not alone! 2 Wednesday, September 7, 2011 Office Hours: You Should Go! You are not alone! http://inst.eecs.berkeley.edu/~cs61a/fa11/www/staff.html 2 Wednesday, September 7, 2011 Reminder: Multiple Assignment & Return Values 61Aé003éControl_div.py """Functions for exact integer division.""" from operator import floordiv, mod def divide_exact(n, d): """Return the quotient and remainder of dividing n by d. >>> q, r = divide_exact(13, 5) >>> q 2 >>> r 3 """ return floordiv(n, d), mod(n, d) 3 Wednesday, September 7, 2011 Reminder: Multiple Assignment & Return Values 61Aé003éControl_div.py Integer division, which rounds down """Functions for exact integer division.""" from operator import floordiv, mod def divide_exact(n, d): """Return the quotient and remainder of dividing n by d. >>> q, r = divide_exact(13, 5) >>> q 2 >>> r 3 """ return floordiv(n, d), mod(n, d) 3 Wednesday, September 7, 2011 Reminder: Multiple Assignment & Return Values 61Aé003éControl_div.py Integer division, Integer remainder which rounds down after dividing """Functions for exact integer division.""" from operator import floordiv, mod def divide_exact(n, d): """Return the quotient and remainder of dividing n by d. >>> q, r = divide_exact(13, 5) >>> q 2 >>> r 3 """ return floordiv(n, d), mod(n, d) 3 Wednesday, September 7, 2011 Reminder: Multiple Assignment & Return Values 61Aé003éControl_div.py Integer division, Integer remainder which rounds down after dividing """Functions for exact integer division.""" from operator import floordiv, mod def divide_exact(n, d): """Return the quotient and remainder of dividing n by d. >>> q, r = divide_exact(13, 5) >>> q 2 >>> r 3 """ return floordiv(n, d), mod(n, d) Multiple return values, separated by commas 3 Wednesday, September 7, 2011 Reminder: Multiple Assignment & Return Values 61Aé003éControl_div.py Integer division, Integer remainder which rounds down after dividing """Functions for exact integer division.""" from operator import floordiv, mod def divide_exact(n, d): """Return the quotient and remainder of dividing n by d. >>> q, r = divide_exact(13, 5) >>> q 2 Multiple assignment >>> r to two names 3 """ return floordiv(n, d), mod(n, d) Multiple return values, separated by commas 3 Wednesday, September 7, 2011 The Structure of Project 1 Two functions implement the game simulation 4 Wednesday, September 7, 2011 The Structure of Project 1 Two functions implement the game simulation Warning! Pseudo-code (not code) 4 Wednesday, September 7, 2011 The Structure of Project 1 Two functions implement the game simulation def play(...): Warning! Pseudo-code (not code) while game is not over: get a plan (from the current player's strategy) call take_turn with a dice and plan return winner 4 Wednesday, September 7, 2011 The Structure of Project 1 Two functions implement the game simulation def play(...): Warning! Pseudo-code (not code) while game is not over: get a plan (from the current player's strategy) call take_turn with a dice and plan return winner def take_turn(...): while turn is not over: get an action (from plan) and outcome (from dice) call an action return points scored during the turn 4 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Range 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action (integer, integer) Range (integer, integer, boolean) 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action (integer, integer) Range (integer, integer, boolean) Two arguments 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action Range (integer, integer) (integer, integer, boolean) Two arguments Three return values 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action Plan Range (integer, integer) (integer, integer, boolean) Two arguments Three return values integer Action 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action Range (integer, integer) (integer, integer, boolean) Two arguments Three return values Plan integer Action Strategy (integer, integer) Plan 5 Wednesday, September 7, 2011 The Structure of Project 1 Four types of functions are involved in simulating game Domain Action Range (integer, integer) (integer, integer, boolean) Two arguments Three return values Plan integer Action Strategy (integer, integer) Plan Dice No arguments integer 5 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. Higher-order function: A function that takes a function as an argument value or returns a function as a return value 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. Higher-order function: A function that takes a function as an argument value or returns a function as a return value Higher-order functions: 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. Higher-order function: A function that takes a function as an argument value or returns a function as a return value Higher-order functions: • Express general methods of computation 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. Higher-order function: A function that takes a function as an argument value or returns a function as a return value Higher-order functions: • Express general methods of computation • Remove repetition from programs 6 Wednesday, September 7, 2011 The Purpose of Higher-Order Functions Functions are first-class: Functions can be manipulated as values in our programming language. Higher-order function: A function that takes a function as an argument value or returns a function as a return value Higher-order functions: • Express general methods of computation • Remove repetition from programs • Separate concerns among functions 6 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) def summation(n, term): """Sum the first n terms of a sequence. >>> summation(5, cube) 225 """ total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) Function of a single argument (not called term) def summation(n, term): """Sum the first n terms of a sequence. >>> summation(5, cube) 225 """ total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) Function of a single argument (not called term) A formal parameter that term):will be bound to a function def summation(n, """Sum the first n terms of a sequence. >>> summation(5, cube) 225 """ total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) Function of a single argument (not called term) A formal parameter that term):will be bound to a function def summation(n, """Sum the first n terms of a sequence. >>> summation(5, cube) 225 """ total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total The function bound to term gets called here def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) Function of a single argument (not called term) A formal parameter that term):will be bound to a function def summation(n, """Sum the first n terms of a sequence. >>> summation(5, cube) 225 The cube function is passed """ as an argument value total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total The function bound to term gets called here def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 return total Review: Summation Example def identity(k): return k def cube(k): return pow(k, 3) Function of a single argument (not called term) A formal parameter that term):will be bound to a function def summation(n, """Sum the first n terms of a sequence. >>> summation(5, cube) 225 The cube function is passed """ as an argument value total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total The function bound to term gets called here def 3pi_term(k): 0 + 1 + 23 + 33 + 43 + 55 return 8 / (k * 4 é 3) / (k * 4 é 1) 7 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Functions as return values: 8 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Our current environment model handles that! Functions as return values: 8 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Our current environment model handles that! We'll give an example of how Functions as return values: 8 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Our current environment model handles that! We'll give an example of how Functions as return values: We need to extend the model a little 8 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Our current environment model handles that! We'll give an example of how Functions as return values: We need to extend the model a little Functions need to know where they were defined 8 Wednesday, September 7, 2011 Environments Enable Higher-Order Functions! Functions as arguments: Our current environment model handles that! We'll give an example of how Functions as return values: We need to extend the model a little Functions need to know where they were defined Almost everything stays the same 8 Wednesday, September 7, 2011 Names and Environments with Functional Values def apply_twice(f, x): return f(f(x)) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values def apply_twice(f, x): return f(f(x)) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x def apply_twice(f, x): return f(f(x)) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x def apply_twice(f, x): return f(f(x)) apply_twice(square, 2) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x def apply_twice(f, x): return f(f(x)) apply_twice(square, 2) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x def apply_twice(f, x): return f(f(x)) apply_twice(square, 2) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x f: def apply_twice(f, x): return f(f(x)) apply_twice(square, 2) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x f: x: def apply_twice(f, x): return f(f(x)) 2 apply_twice(square, 2) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: square(x): return f(f(x)) return x * x f: x: def apply_twice(f, x): return f(f(x)) 2 apply_twice(square, 2) return f(f(x)) def square(x): return x * x apply_twice(square, 2) 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: return f(f(x)) square(x): return x * x f: x: def apply_twice(f, x): return f(f(x)) 2 def square(x): return x * x apply_twice(square, 2) return f(f(x)) 2 apply_twice(square, 2) square 4 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: return f(f(x)) square(x): return x * x f: x: def apply_twice(f, x): return f(f(x)) 2 def square(x): return x * x apply_twice(square, 2) return f(f(x)) 4 square 16 2 apply_twice(square, 2) square 4 9 Wednesday, September 7, 2011 Names and Environments with Functional Values apply_twice: apply_twice(f, x): square: return f(f(x)) square(x): return x * x f: x: def apply_twice(f, x): return f(f(x)) 2 16 apply_twice(square, 2) def square(x): return x * x return f(f(x)) 4 square 16 2 apply_twice(square, 2) square 4 9 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x square(-2) def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x x: -2 square square(-2) def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x x: -2 square square(-2) def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x x: -2 square square(-2) def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x x: -2 square square(-2) def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... square(x): The first frame of the environment in which the function was defined return x * x x: -2 square square(-2) return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Applying User-Defined Functions square: ... The first frame of the environment in which the function was defined square(x): return x * x x: -2 square 4 square(-2) return x * x def square(x): return x * x square(-2) 10 Wednesday, September 7, 2011 Functions Associated with the Global Frame square: ... square(x): return x * x x: -2 square 4 square(-2) return x * x def square(x): return x * x square(-2) 11 Wednesday, September 7, 2011 Functions Associated with the Global Frame square: ... Associated with the global frame square(x): return x * x x: -2 square 4 square(-2) return x * x def square(x): return x * x square(-2) 11 Wednesday, September 7, 2011 Functions Associated with the Global Frame This is the global frame square: ... Associated with the global frame square(x): return x * x x: -2 square 4 square(-2) return x * x def square(x): return x * x square(-2) 11 Wednesday, September 7, 2011 Locally Defined Functions: Example 12 Wednesday, September 7, 2011 Locally Defined Functions: Example Functions defined within other function bodies are bound to names in the local frame 12 Wednesday, September 7, 2011 """Sum the first n terms of a sequence. >>> summation(5, cube) 225 Defined Functions: Example Locally """ total, k = 0, 1 while k <= n: total, k = total + term(k), + 1 function bodies Functions defined within kother return total are bound to names in the local frame def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) # Local function definitions; returning functions def make_adder(n): """Return a function that takes one argument k and returns k + n. >>> add_three = make_adder(3) >>> add_three(4) 7 """ def adder(k): return k + n return adder def compose1(f, g): """Return a function that composes f and g. f, g éé functions of a single argument """ def h(x): return f(g(x)) return h Wednesday, September 7, 2011 12 """Sum the first n terms of a sequence. >>> summation(5, cube) 225 Defined Functions: Example Locally """ total, k = 0, 1 while k <= n: total, k = total + term(k), + 1 function bodies Functions defined within kother return total are bound to names in the local frame def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) A function that returns a function # Local function definitions; returning functions def make_adder(n): """Return a function that takes one argument k and returns k + n. >>> add_three = make_adder(3) >>> add_three(4) 7 """ def adder(k): return k + n return adder def compose1(f, g): """Return a function that composes f and g. f, g éé functions of a single argument """ def h(x): return f(g(x)) return h Wednesday, September 7, 2011 12 """Sum the first n terms of a sequence. >>> summation(5, cube) 225 Defined Functions: Example Locally """ total, k = 0, 1 while k <= n: total, k = total + term(k), + 1 function bodies Functions defined within kother return total are bound to names in the local frame def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) A function that returns a function # Local function definitions; returning functions def make_adder(n): """Return a function that takes one argument k and returns k + n. >>> add_three = make_adder(3) >>> add_three(4) 7 """ def adder(k): return k + n return adder The name add_three is bound to a function def compose1(f, g): """Return a function that composes f and g. f, g éé functions of a single argument """ def h(x): return f(g(x)) return h Wednesday, September 7, 2011 12 """Sum the first n terms of a sequence. >>> summation(5, cube) 225 Defined Functions: Example Locally """ total, k = 0, 1 while k <= n: total, k = total + term(k), + 1 function bodies Functions defined within kother return total are bound to names in the local frame def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) A function that returns a function # Local function definitions; returning functions def make_adder(n): """Return a function that takes one argument k and returns k + n. >>> add_three = make_adder(3) The name add_three is >>> add_three(4) bound to a function 7 """ def adder(k): A local return k + n def statement return adder def compose1(f, g): """Return a function that composes f and g. f, g éé functions of a single argument """ def h(x): return f(g(x)) return h Wednesday, September 7, 2011 12 """Sum the first n terms of a sequence. >>> summation(5, cube) 225 Defined Functions: Example Locally """ total, k = 0, 1 while k <= n: total, k = total + term(k), + 1 function bodies Functions defined within kother return total are bound to names in the local frame def pi_term(k): return 8 / (k * 4 é 3) / (k * 4 é 1) A function that returns a function # Local function definitions; returning functions def make_adder(n): """Return a function that takes one argument k and returns k + n. >>> add_three = make_adder(3) The name add_three is >>> add_three(4) bound to a function 7 """ def adder(k): A local return k + n def statement return adder def compose1(f, g): """Return a function that composes f and g. Can refer to names in the enclosing function f, g éé functions of a single argument """ def h(x): return f(g(x)) return h Wednesday, September 7, 2011 12 Locally Defined Functions: Call Expressions make_adder(1)(2) def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Call Expressions make_adder(1)(2) make_adder(1) ( 2 ) def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Call Expressions make_adder(1)(2) make_adder(1) ( 2 ) Operator def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Call Expressions make_adder(1)(2) make_adder(1) Operator ( 2 ) Operand 0 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Call Expressions make_adder(1)(2) make_adder(1) Operator ( 2 ) Operand 0 An expression that evaluates to a function def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Call Expressions make_adder(1)(2) make_adder(1) Operator An expression that evaluates to a function ( 2 ) Operand 0 An expression that evaluates to any value def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 13 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) make_adder(1)(2) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) make_adder(1)(2) make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: n: 1 make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n make_adder(1)(2) make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: n: 1 make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n Associated with a local frame make_adder(1)(2) make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: n: 1 make_adder(n): ... def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n Associated with a local frame make_adder(1)(2) make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... n: 1 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n Apply adder to 2 Associated with a local frame make_adder(1)(2) make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... n: 1 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n k: 2 Associated with a local frame adder Apply adder to 2 make_adder(1)(2) return k + n make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... n: 1 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n k: 2 Associated with a local frame adder Apply adder to 2 make_adder(1)(2) return k + n make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... n: 1 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n k: 2 Associated with a local frame adder n Apply adder to 2 make_adder(1)(2) return k + n make_adder(1) 14 Wednesday, September 7, 2011 Locally Defined Functions: Environments make_adder: make_adder(n): ... n: 1 def make_adder(n): def adder(k): return k + n return adder make_adder(1)(2) adder: make_adder adder(k): return k + n k: 2 Associated with a local frame adder n Apply adder to 2 3 make_adder(1)(2) return k + n make_adder(1) 14 Wednesday, September 7, 2011 The Environment for Function Composition def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: ... make_adder(n): ... def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: ... make_adder(n): ... n: 1 adder: make_adder adder(k): def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) return k + n 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: ... make_adder(n): ... n: 1 adder: make_adder adder(k): def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) return k + n 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: ... make_adder(n): ... n: 1 adder: make_adder adder(k): def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) return k + n n: 2 adder: make_adder adder(k): return k + n 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder adder(k): def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) return k + n n: 2 adder: make_adder adder(k): return k + n 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder adder(k): def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) (Demo) return k + n n: 2 adder: make_adder f: g: adder(k): return k + n compose1 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) adder(k): (Demo) return k + n n: 2 adder: make_adder f: g: h: compose1 adder(k): return k + n h(x): return f(g(x)) 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) adder(k): (Demo) return k + n n: 2 adder: make_adder x: 3 h f: g: h: compose1 adder(k): return k + n h(x): return f(g(x)) 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) adder(k): (Demo) return k + n n: 2 k: 3 adder adder: make_adder x: 3 h f: g: h: compose1 adder(k): return k + n h(x): return f(g(x)) 15 Wednesday, September 7, 2011 The Environment for Function Composition compose1: make_adder: a1: a2: ... make_adder(n): ... n: 1 adder: make_adder adder(k): k: 3 adder (Demo) return k + n k: 5 adder def compose1(f, g): def h(x) return f(g(x)) return h a1 = make_adder(1) a2 = make_adder(2) compose1(a1, a2)(3) n: 2 adder: make_adder x: 3 h f: g: h: compose1 adder(k): return k + n h(x): return f(g(x)) 15 Wednesday, September 7, 2011 Lambda Expressions 16 Wednesday, September 7, 2011 Lambda Expressions >>> ten = 10 16 Wednesday, September 7, 2011 Lambda Expressions >>> ten = 10 >>> square = x * x 16 Wednesday, September 7, 2011 Lambda Expressions >>> ten = 10 An expression: this one evaluates to a number >>> square = x * x 16 Wednesday, September 7, 2011 Lambda Expressions >>> ten = 10 An expression: this one evaluates to a number >>> square = x * x >>> square = lambda x: x * x 16 Wednesday, September 7, 2011 Lambda Expressions >>> ten = 10 An expression: this one evaluates to a number >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x A function 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x A function with formal parameter x 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x A function with formal parameter x and body "return x * x" 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x Notice: no "return" A function with formal parameter x and body "return x * x" 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x Notice: no "return" A function with formal parameter x and body "return x * x" Must be a single expression 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x Notice: no "return" A function with formal parameter x and body "return x * x" >>> square(4) 16 Must be a single expression 16 Wednesday, September 7, 2011 Lambda Expressions An expression: this one evaluates to a number >>> ten = 10 >>> square = x * x Also an expression: evaluates to a function >>> square = lambda x: x * x Notice: no "return" A function with formal parameter x and body "return x * x" >>> square(4) 16 Must be a single expression Lambda expressions are rare in Python, but important in general 16 Wednesday, September 7, 2011 More Higher-Order Function Examples (Demo) 17 Wednesday, September 7, 2011
© Copyright 2026 Paperzz