【问题标题】:TypeError: 'function' object is not iterable pythonTypeError:'function'对象不是可迭代的python
【发布时间】:2021-02-28 00:44:13
【问题描述】:
for i in range(0,10):
    res_lsq = np.sqrt(np.mean((polynomial_fit(lambda i: 'theta' + str(i), xtr) - ytr)**2))
    rmse.append(res_lsq) 

我正在寻找使用最小二乘法拟合曲线的每个 M 次多项式的均方根误差。我想在我的 polynomial_fit 函数中改变权重参数,即 theta 从 theta0 到 theta9(浮点值),以将每个 m 次多项式的 RMSE 附加到 rmse 列表中。但它显示错误如下

TypeError                                 Traceback (most recent call last)
<ipython-input-43-4e717fdd943a> in <module>
      1 for i in range(0,10):
----> 2     res_lsq = np.sqrt(np.mean((polynomial_fit(lambda i: 'theta' + str(i), xtr) - ytr)**2))
      3     rmse.append(res_lsq)

<ipython-input-20-d7d3539688a0> in polynomial_fit(theta, x)
      1 def polynomial_fit(theta, x):
      2     """Polynomial model of degree (len(theta) - 1)"""
----> 3     return sum(t * x ** n for (n, t) in enumerate(theta))

TypeError: 'function' object is not iterable 

【问题讨论】:

  • 您将一个 lambda 函数传递给 polynomial_fit,它接受一个可迭代对象作为其第一个参数。
  • 看来theta 也应该是一个数字类型的列表 - 您正在尝试传递一个字符串。
  • theta 是浮点值
  • 如果您将lambda i: 'theta' + str(i) 替换为您的浮动列表,那么这至少不会引发错误。

标签: python typeerror


【解决方案1】:

其实你的代码有不同的错误:

np.mean 需要一个数组(一个可迭代的)作为第一个参数。但是您正在传递一个函数polynomial_fit,它返回一个总和。 给np.mean 提供一个int 或float 不会引发任何错误,但这没什么用。例如,通常您希望获得 [1,2,3,4] (== 2.5 ) 的平均值,而不是“4”。

函数polynomial_fit 包含enumerate(theta),但theta 不可迭代,因此您会收到TypeError: 'function' object is not iterable 类型的错误。

而这和lambda函数的内容有关,就像@erip所说的,哪个语句写成字符串。

【讨论】:

  • 对不起,这个分析是不正确的。 polynomial_fit 是引发错误的调用。
  • 啊,我认为自己表达得很糟糕(英语不完全流利),我会更正我的答案以更清楚。感谢您指出这一点。
  • 你的英语很好,但你的诊断不是。如果您删除对np.mean 的调用,OP 仍会观察到错误。
  • 我想我理解你,但表达得不好,我刚刚编辑了我的答案。
猜你喜欢
  • 2016-07-31
  • 2014-05-03
  • 1970-01-01
  • 2019-09-17
  • 2021-12-13
  • 1970-01-01
  • 2015-04-06
  • 2013-10-31
  • 2017-08-29
相关资源
最近更新 更多