Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: partial that takes three arguments

I'm trying to learn Python by reading the book Data Science from Scratch by Joel Grus, and on page 94 they describe how to approximate a derivative of f = x^2 using the following code

def difference_quotient(f, x, h):
    return (f(x + h) - f(x)) / h

def square(x):
    return x * x

def derivative(x):
    return 2 * x

derivative_estimate = partial(difference_quotient, square, h=0.00001)

# plot to show they're basically the same
import matplotlib.pyplot as plt
x = range(-10,10)
plt.title("Actual Derivatives vs. Estimates")
plt.plot(x, map(derivative, x), 'rx', label='Actual')
plt.plot(x, map(derivative_estimate, x), 'b+', label='Estimate')
plt.legend(loc=9)
plt.show()

Everything works fine, but when I change the line derivative_estimate = partial(difference_quotient, square, h=0.00001) to derivative_estimate = partial(difference_quotient, f=square, h=0.00001) (because I think that is clearer to read), then I get the following error

Traceback (most recent call last):
  File "page_93.py", line 37, in <module>
    plt.plot(x, map(derivative_estimate, x), 'b+', label='Estimate')
TypeError: difference_quotient() got multiple values for keyword argument 'f'

What is going on here?

like image 429
Hunter Avatar asked Feb 08 '23 03:02

Hunter


1 Answers

It was answered and perfectly explained in this topic:

  • functools.partial wants to use a positional argument as a keyword argument

Which in your case implies that you should pass x as a keyword argument:

plt.plot(x, [derivative_estimate(x=item) for item in x], 'b+', label='Estimate')
like image 91
alecxe Avatar answered Feb 22 '23 02:02

alecxe