Как исправить эту ошибку «float not iterable» - PullRequest
2 голосов
/ 22 июня 2019

Я решаю проблему - набор из введения MIT в программирование.

def compute_deriv(poly):
    """
    Computes and returns the derivative of a polynomial function. If the
    derivative is 0, returns (0.0,).
    """

    der = ()
    for ele in poly :
        if poly.index(ele) == 0 :
            continue
        else:
            der += tuple(ele*float(poly.index(ele)))
    return der

poly = (-13.39, 0.0, 17.5, 3.0, 1.0)    # x^4 + 3x^3 + 17.5x^2 - 13.39

print compute_deriv(poly)

почему программа пытается перебрать эту строку?и вернуть ошибку, не повторяемую?так не должно быть

der += tuple(ele*float(poly.index(ele)))

1 Ответ

2 голосов
/ 22 июня 2019

Python интерпретирует

tuple(ele*float(poly.index(ele)))

как cast , а не как оболочку .Вы даете ему один аргумент, и он предполагает, что этот аргумент является итеративным объектом, который вы хотите переформатировать в кортеж.Фактически, вы действительно хотите создать одноэлементный кортеж, содержащий объект.Это может произойти и со списками и наборами, и я подозреваю, что если вы выполните одно из следующих действий:

list(ele*float(poly.index(ele)))
set(ele*float(poly.index(ele)))

, вы увидите ту же ошибку, что и сейчас.


Самое простое решение этого - просто использовать литерал tuple вместо функции tuple():

der += (ele*float(poly.index(ele)),)

(для ясности, (value,) - этосинтаксис для одноэлементного кортежа, потому что круглые скобки были бы неоднозначными. Если вы хотите, чтобы максимально ясно, вы могли бы просто использовать список вместо этого большую часть времени - литерал списка просто [] иустановленный литерал {})

...