Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida com exercício sobre tuples

Estou tentando resolver o seguinte exercício:

Problem #1 Implement the evaluate_poly function. This function evaluates a polynomial function for the given x value. It takes in a tuple of numbers poly and a number x. By number, we mean that x and each element of poly is a float. evaluate_poly takes the polynomial represented by poly and computes its value at x. It returns this value as a float.

def evaluate_poly(poly, x):
    total = 0.0
    for i in xrange(len(poly)):
        total += poly[i] * (x ** i)
    return total
poly = tuple(float(x.strip()) for x in raw_input('Entre com os coeficientes: ').split(','))
x = raw_input('Entre com valor de x: ')
print evaluate_poly(poly, x)

Estou recebendo os seguintes erros:

Traceback (most recent call last):
line 8, in <module>
    print evaluate_poly('poly', 'x')
line 4, in evaluate_poly
    total += poly[i] * (x ** i)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

Porque estou recebendo tais erros? Também não estou entendendo muito bem a sintaxe de input do tuple, o que é x.strip e .split?

3 respostas

O erro que você está recebendo é por que o comando

x = raw_input('...')

Devolve um str e não um float. Basta fazer

x =  float(raw_input(''))

O comando split devolve uma lista de str, que é a string que ele recebe mas separada pelo parametro (no caso as vírgulas).

Já o comando strip tira todos os espaços em branco desnecessários de suas strings, de modo a poder converter para float.

Minha sugestão para a função seria:

def evaluate_poly(poly, x):
    pot = 1
    total = 0.0
    for coef in poly:
        total += pot * coef
        pot *= x
    return total

Você disse que o comando devolve uma string, mas se faço o seguinte no IDLE:

>>> poly = tuple(float(x.strip()) for x in raw_input('Entre com os coeficientes: ').split(','))
Entre com os coeficientes: 0.0, 5.6, 8.9, 9.5, 4.0
>>> type(poly[3])
<type 'float'>

Então acho que o problema não é que o input esteja retornando uma string. Como o problema é pegar um tuple como input usar somente:

x =  float(raw_input(''))

não resolve o problema.

solução!

O erro que você estava tendo

TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int

É resolvido usando x=float(raw_input()). Quem estava com o tipo errado não era poly[i], mas sim x, que precisa ser um int ou float.

Eu executei seu código com a mudança sugerida e ele está funcionando. Qual problema você está tendo agora?