Assignments are always due at 11:59 PM on the specified due date
Lab 0 Attendance - if you didn't get attendance then, you're fine - I just put attendance up on the board as practice
One thing worth noting is that Lab 0 does not count for lab attendance!
This is similar for discussion 0, but doesn't matter as much!
Ori is a good game
The music is partially what got me into orchestral arranging
CS 61A runs at double the speed over the summer - the workload might seem quite intense, and that's because it is! You're doing 2 weeks worth of material in 1 week.
deff(x):return x
defg(x, y):if x(y):
returnnot y
return y
x = 3
x = g(f, x)
f = g(f, 0)
lambda Functions and Higher-Order Functions
A lambda expression evaluates to a lambda function
Can be used as the operator for a function!
These functions work the same way as a normal function
Can be written in 1 line - faster way to make functions
Similar to def in usage, but different syntax
lambdas are especially useful when you want to use a function once and then never use it again (will see examples of this)
lambda Syntax
lambda <args>: <body>
What goes in <body> must be a single expression
lambda Example
deffunc(x, y):return x + y
func = lambda x, y: x + y
# Notice how I have to do the binding to a variable myself
defi(j, k, l):return j * k * l
i = lambda j, k, l: j * k * l
lambda Example 2
lambda functions can also be used as the operator for a function!
(lambda x, y: x + y)(2, 3) # 5# Equivalent todefadd(x, y):return x + y
add(2, 3) # 5
Higher Order Functions (HOF)
HOFs are functions that can do the following things (can be both):
Take in other functions as inputs
Return a function as an output
You can treat a function as just an object or a value (there's nothing special about them)
function and function() mean different things!
function refers to the object itself (in the environment diagram, it refers to what the arrow is pointing to)
function() actually calls and executes the body of the function
HOF Example 1 (Functions as input)
defdouble(x):return x * 2defsquare(x):return x ** 2defdouble_adder(f, x):return f(x) + f(x)
double_adder(double, 3) # 12
double_adder(square, 3) # 18# Passed in two different functions
HOF Example 2 (Functions as output)
deff(x):defg(y):return x + y
return g
a = f(2)
a(3) # 5# Same thing as calling f(2)(3)
HOF Example 2
deff(x):defg(y):defh(z):return x + y + z
return h
return g
lambda x: lambda y: lambda z: x + y + z
The two above are equivalent statements!
(Notice how the lambda one takes up far less space!)
Question 3 (5 minutes)
Draw the environment diagram for the following code and predict what Python will output.
a = lambda x: x * 2 + 1defb(b, x):return b(x + a(x))
x = 3
x = b(a, x)
Question 4 (5 minutes)
Draw the environment diagram for the following code and predict what Python will output.
n = 9defmake_adder(n):returnlambda k: k + n
add_ten = make_adder(n+1)
result = add_ten(n)
In the Global frame, the name add_ten points to a function object. What is the intrinsic name of that function object, and what frame is its parent?
What name is frame f2 labeled with (add_ten or λ)? Which frame is the parent of f2?
What value is the variable result bound to in the Global frame?
Question 5 (10 minutes)
Write a function that takes in a number n and returns a function that can take in a single parameter cond. When we pass in some condition function cond into this returned function, it will print out numbers from 1 to n where calling cond on that number returns True.
defmake_keeper(n):"""Returns a function which takes one parameter cond and prints
out all integers 1..i..n where calling cond(i) returns True.
>>> def is_even(x):
... # Even numbers have remainder 0 when divided by 2.
... return x % 2 == 0
>>> make_keeper(5)(is_even)
2
4
"""
Question 5
defmake_keeper(n):"""Returns a function which takes one parameter cond and prints
out all integers 1..i..n where calling cond(i) returns True.
>>> def is_even(x):
... # Even numbers have remainder 0 when divided by 2.
... return x % 2 == 0
>>> make_keeper(5)(is_even)
2
4
"""defkeeper(cond):
i = 1while (i <= n):
if cond(i):
print(i)
i += 1return keeper # remember this line!
Currying
Currying is one application of the HOFs from earlier.
lambda x: lambda y: x + y
Instead of just any expression on the inside (for example x + y), we use a function!
defpow(x, y):
x ** y
defcurried_pow(x):deff(y):returnpow(x, y)
return f
curried_pow(3)(2)
# is the same aspow(3, 2)
# You will need as many inner functions as you have arguments
Currying
Currying is the process of turning a function that takes in multiple arguments to one that takes in one argument.
What's the point?
Sometimes functions with 1 argument are far easier to deal with
Can create a bunch of functions that have slightly different starting values which saves on repeating code
Kind of hard to see the benefits until you write production code
Question 7
Draw the environment diagram that results from executing the code below.
n = 7deff(x):
n = 8return x + 1defg(x):
n = 9defh():return x + 1return h
deff(f, x):return f(x + n)
f = f(g, n)
g = (lambda y: y())(f)
Question 8
defmatch_k(k):""" Return a function that checks if digits k apart match
>>> match_k(2)(1010)
True
>>> match_k(2)(2010)
False
>>> match_k(1)(1010)
False
>>> match_k(1)(1)
True
>>> match_k(1)(2111111111111111)
False
>>> match_k(3)(123123)
True
>>> match_k(2)(123123)
False
"""
Question 8
defmatch_k(k):"""Return a function that checks if digits k apart match"""
____________________________
____________________________
while ____________________________:
if ____________________________:
return ____________________________
____________________________
____________________________
____________________________
Question 8
defmatch_k(k):"""Return a function that checks if digits k apart match"""defmatcher(n):while n // (10 ** k) > 0:
if n % 10 != (n // (10 ** k)) % 10:
returnFalse
n //= 10returnTruereturn matcher
Mental Health Resources
CAPS:
If you need to talk to a professional, please call CAPS at 510-642-9494.
After Hours Assistance
For any assistance after hours, details on what to do can be found at this link