# Higher-Order Functions: basic-level questions

If you need help reviewing Higher-Order Functions, take a look at these resources:

Each question has a "Toggle Solution" button -- click it to reveal that question's solution.

## Conceptual Questions

### Question 1

What is the definition of a higher-order function?

A function is a higher-order function if it satisfies at least one of the following:

• It takes at least one function as an argument
• It returns a function

### Question 2

In the following code, what type of object (number, boolean, string, function) does `foo` return? What type of object should `x` be for this function to work?

``````def foo(x):
def inner(y):
return x(y)
return inner``````

`foo` should return a function object (in particular, the function `inner`). `x` should also be a function, or else calling `inner` will result in an error (because it will try `x(y)`).

## What would Python print?

### Question 3

``````>>> def silly():
...     def rabbit(y):
...         return 'Tricks are for kids!'
...     print('Lucky Charms?')
...     return False
>>> a = silly()
______Lucky Charms?
>>> a
______False
>>> a(5)
______TypeError``````

### Question 4

``````>>> def func1(fn):
...     def inner():
...         return fn(2)
...     return inner
>>> def func2(fn):
...     def inner():
...         return fn(2)
...     return inner()
>>> func1(lambda x: x * x)
______<function inner at ...>
>>> func2(lambda x: x * x)
______4``````

### Question 5

``````>>> def dream1(totem):
...     def dream2(totem_guess):
...         print('I think my totem is a', totem_guess)
...     return dream2
>>> inception = dream1('top')
>>> inception
______<function dream2 at ...>
>>> inception('spinning top')
______I think my totem is a spinning top
False``````

## Environment Diagrams

### Question 6

``````def my_strat(score):
return score + 2

def play(strat):
i, roll = 0, strat(0)
while i < roll:
result = my_strat(i)
i += 1
return i

result = play(my_strat)

# How many times do we call my_strat?
# Remember to label the frames with the intrinsic
# name of the functions``````

### Question 7

``````def fun(x):
return x**2

def time(y):
y, x = 4, 5
def fun(y):
return y + x
return fun

a = time(10)
b = a(2)

# Which fun is called?
# Which y is used?
# What type of object is a?``````

### Question 8

``````def square(x):
return x * x

def boom(fn):
def bam(x):
print(x)
return fn(x)
return bam

boom(square)
a = boom(square)
a(4)``````

### Question 9

``````x = 4

def outer(f):
def inner(g):
return f(g(x))
return inner

def square(x):
return x**2

c = outer(square)(square)``````

### Question 10

``````def one(f):
a = 1
def two(g):
b = 2
def three(h):
c = 3
return f(a) + g(b) + h(c)
return three
return two

def identity(x):
return x

def square(x):
return x**2

def cube(x):
return x**3

middle = one(identity)(square)
result = middle(cube)

# what function is middle?
# What are the parents of each frame?``````

## Code-Writing questions

### Question 11

Write a function `make_mod` that takes a number, `n`, as an argument, and returns a new function. The new function should take a single argument, `x`, and return the result of `x` modulo `n`.

``````def make_mod(n):
"""Returns a function that takes an argument x.
That function will return x modulo n.

>>> mod_7 = make_mod(7)
>>> mod_7(3)
3
>>> mod_7(41)
6
"""
``````def make_mod(n):