Chris Schell Chris Schell - 4 months ago 17
Python Question

Understanding Python Tuples and Reassignments

Ok, I do not think this question has been answered here before.

I am wondering exactly how Python is executing this for loop. FYI this is a part of lesson 2 from 6.00SC MIT OCW:

def evaluate_poly(poly, x):
""" Computes the polynomial function for a given value x. Returns that value.

Example:
>>> poly = (0.0, 0.0, 5.0, 9.3, 7.0) # f(x) = 7x^4 + 9.3x^3 + 5x^2
>>> x = -13
>>> print evaluate_poly(poly, x) # f(-13) = 7(-13)^4 + 9.3(-13)^3 + 5(-13)^2
180339.9
poly: tuple of numbers, length > 0
x: number
returns: float """

ans = 0.0
for i in xrange(len(poly)):
ans += poly[i] * (x ** i)
return ans


Can anybody explain to me how this for loop is executing line by line? I understand the i variable is created to run 5 times (the length of the poly tuple), in which ans is being updated each iteration. Where I get confused is the reassignment of i each time through.

The third time through ans = 0.0 + (5) * x**(2)

It seems to me that poly[i] is grabbing the indexed number (5), but then x is multiplied to the power of i, which is now the index position itself (2). Which is exactly what it's supposed to do, however I cannot understand how i can seemingly be both the indexed number and the indexed position.

I am new to programming so any info at all will be a tremendous help.

Thanks so much!

Answer

i is assigned to those numbers in the loop: 0,1,2,3,4 because xrange creates a range from 0 till the parameter minus 1. Parameter is len(poly) that returns 5 (the size of the array. Therefore i is assigned from 0 till 4(=5-1)

First iteration i equals 0:

poly[0] actually equals to the first element of poly (0.0)

The formula then becomes:

ans += poly[i] * (x ** i)
ans = ans + poly[i] * (x ** i)
ans = 0.0 + poly[0] * (-13 in the power of 0)
ans = 0.0 + 0.0 * (-13 in the power of 0)
ans = 0.0

Next iteration i equals 1:

ans = ans + poly[i] * (x ** i)
ans = 0.0 + poly[1] * (-13 in the power of 1)
ans = 0.0 + 0.0 * (-13 in the power of 1)
ans = 0.0

Next iteration i equals 2:

ans = ans + poly[i] * (x ** i)
ans = 0.0 + poly[2] * (-13 in the power of 2)
ans = 0.0 +     5.0 * (-13 in the power of 2)

Next iteration i equals 3:

ans = ans + poly[i] * (x ** i)
ans = 5.0 * (-13 in the power of 2) + poly[3] * (-13 in the power of 3)
ans = 5.0 * (-13 in the power of 2) +     9.3 * (-13 in the power of 3)

Last iteration i equals 4:

ans = ans + poly[i] * (x ** i)
ans = 5.0 * (-13 in the power of 2) + 9.3 * (-13 in the power of 3) + poly[4] * (-13 in the power of 4)
ans = 5.0 * (-13 in the power of 2) + 9.3 * (-13 in the power of 3) +     7.0 * (-13 in the power of 4)