Python元组索引递归:“不能将序列乘以float类型的非int”

时间:2014-01-06 03:10:03

标签: python indexing tuples sequence

我正在编写一个程序来评估多项式,作为系数元组给出(从0度到n度)。我定义了函数,然后使用多项式的raw_inputs和x的值来调用它。

这是在Python 2.5.4

这是一个关于编程的在线课程的练习,对于我的生活,我无法弄清楚出了什么问题;我的程序也与给定的解决方案相同,它返回相同的错误:

"line 19, in evaluate_poly
    polySum += poly[n] * (x ** n)
TypeError: can't multiply sequence by non-int of type 'float'"

代码如下:

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
    """

    polySum = 0.0
    for n in xrange(0, len(poly)-1,1):
        polySum += poly[n] * (x ** n)
    return polySum


function = tuple(raw_input('Enter your polynomial as a tuple of numbers, going from degree 0 to n: '))
x = float(raw_input('Enter the value of x for which your polynomial is to be evaluated: '))


print 'f(x) =', evaluate_poly(function, x)

对于第一个输入我将执行类似(1,1,1,1)的操作然后我将为第二个输入1,并且我得到上述错误。

这里发生了什么?我认为for循环中带有变量n的括号只会索引元组中的每个连续值,但错误似乎是说poly [n]是一个序列而不是一个数字。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

function = tuple(raw_input('Enter your polynomial as a tuple of numbers, going from degree 0 to n: '))

此行不符合您的想法。以下是它的作用示例:

>>> function = tuple(raw_input('Enter your polynomial as a tuple of numbers, goi
ng from degree 0 to n: '))
Enter your polynomial as a tuple of numbers, going from degree 0 to n: (1, 1)
>>> function
('(', '1', ',', ' ', '1', ')')

它接受用户的输入字符串并将其转换为单个字符的元组。如果您希望用户输入文字元组并对其进行处理,请尝试ast.literal_eval

import ast
function = ast.literal_eval(raw_input('Enter your polynomial as a tuple of numbers, going from degree 0 to n: '))

虽然我们正在修复错误,但值得注意的是您的评估代码存在错误:

    for n in xrange(0, len(poly)-1,1):

由于xrange返回的序列排除stop参数,因此在多项式的最后一个项之前停止。你想要

    for n in xrange(len(poly)):

或更好,使用enumerate,或使用不需要索引和取幂的评估算法:

value = 0
for i in reversed(poly):
    value = x*value + i

答案 1 :(得分:0)

tuple()没有按照您的想法行事。请改为ast.literal_eval()