0% found this document useful (0 votes)
14 views

07-Functional Abstraction 4pp

The document discusses functional abstraction and function concepts like partial function application and currying. It provides examples of lambda functions and function decorators. It also covers topics like function domains and ranges, pure functions, and choosing good names for functions and values.

Uploaded by

Kaphun Krub
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views

07-Functional Abstraction 4pp

The document discusses functional abstraction and function concepts like partial function application and currying. It provides examples of lambda functions and function decorators. It also covers topics like function domains and ranges, pure functions, and choosing good names for functions and values.

Uploaded by

Kaphun Krub
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Functional Abstraction Announcements

Office Hours: You Should Go!

You are not alone!

Partial Function Application & Currying

https://cs61a.org/office-hours/

3
Returning a Function to Wait for More Arguments Function Currying

def make_adder(n): def add(n, k): def make_adder(n): def add(n, k):
def adder(k): def adder(k):
return n + k return n + k Identical code gives return n + k return n + k Identical code gives
identical behavior identical behavior
return adder return adder

make_adder(3) returns a function that bundles together two things:


Curry: Transform a multi-argument function into a single-argument, higher-order function
• The function's behavior: return n + k with the same behavior.
• The value of n: 3

add(3, 4) applies addition to the arguments 3 and 4, while >>> make_adder(2)(3)


5
(Demo)
make_adder(3) partially applies addition, but is still waiting for k. >>> add(2, 3)
5

5 6

Environment Diagrams with Lambda

A lambda function's parent is the current frame in which the lambda expression is evaluated

A lambda expression
within the body of f
will have an f frame
as its parent

Lambda Function Environments

Un-indented lambda
expressions always
have parent=Global

8
https://pythontutor.com/composingprograms.html#code=a%20%3D%201%0Adef%20f%28g%29%3A%0A%20%20%20%20a%20%3D%202%0A%20%20%20%20return%20lambda%20y%3A%20a%20*%20g%28y%29%0Af%28lambda%20y%3A%20a%20%2B%20y%29%28a%29&cumulative=true&curInstr=0&mode=display&origin=composingprograms.js&py=3&rawInputLstJSON=%5B%5D
Function Decorators

(Demo)

Function
decorator
@trace1
Decorated
def triple(x):
function
return 3 * x
Decorators

is identical to

Why not just


def triple(x):
use this?
return 3 * x
triple = trace1(triple)

10

Return Statements

A return statement completes the evaluation of a call expression and provides its value:

f(x) for user-defined function f: switch to a new environment; execute f's body

return statement within f: switch back to the previous environment; f(x) now has a value

Only one return statement is ever executed while executing the body of a function
Return def end(n, d):
"""Print the final digits of n in reverse order until d is found.

>>> end(34567, 5)
7
6
5
"""
while n > 0:
last, n = n % 10, n // 10
print(last)
if d == last:
return None
(Demo)
12
Describing Functions

def square(x):
"""Return X * X."""

A function's domain is the set of all inputs it might x is a number


possibly take as arguments.

Designing Functions
A function's range is the set of output values it might square returns a non-
possibly return. negative real number

A pure function's behavior is the relationship it square returns the


creates between input and output. square of x

14

Functional Abstractions

def square(x): def sum_squares(x, y):


return mul(x, x) return square(x) + square(y)

What does sum_squares need to know about square?

• Square takes one argument. Yes

Abstraction • Square computes the square of a number. Yes

• Square computes the square by calling mul. No

def square(x): def square(x):


return pow(x, 2) return mul(x, x-1) + x

If the name “square” were bound to a built-in function,


sum_squares would still have the same behavior.

16
Choosing Names Which Values Deserve a Name

Names typically don’t matter for correctness Reasons to add a new name
More Naming Tips
Repeated compound expressions:
but • Namescan be long if they help
document your code:
they matter a lot for composition if sqrt(square(a) + square(b)) > 1:
x = x + sqrt(square(a) + square(b))
average_age = average(age, students)

is preferable to
From: To: hypotenuse = sqrt(square(a) + square(b))
Names should convey the meaning or purpose if hypotenuse > 1: AL # Compute average age of students
x = x + hypotenuse TIC ES
true_false rolled_a_one of the values to which they are bound.
RAC
P N I aa = avg(a, st)
DEL
GUI
d dice The type of value bound to the name is best
documented in a function's docstring. Meaningful parts of complex expressions: • Namescan be short if they represent
helper take_turn generic quantities: counts,
arbitrary functions, arguments to
x1 = (-b + sqrt(square(b) - 4 * a * c)) / (2 * a) mathematical operations, etc.
my_int num_rolls Function names typically convey their effect
(print), their behavior (triple), or the
value returned (abs). n, k, i - Usually integers
l, I, O k, i, m x, y, z - Usually real numbers
discriminant = square(b) - 4 * a * c
x1 = (-b + sqrt(discriminant)) / (2 * a) f, g, h - Usually functions

17 18

Taxonomy of Errors

Syntax Errors Detected by the Python


interpreter (or editor)
before the program executes

Runtime Errors Detected by the Python


Errors & Tracebacks interpreter while the program
executes

Logic & Behavior Errors Not detected by the Python


interpreter; what tests are for

(Demo)

20

You might also like