Python3 TypeError: func() argument after * must be an iterable, not float 解决方案
写ML&DM作业——偏差方差分析时遇到的问题,示例如下:
import math
def uniform_sample1D(a, b):
"""
在[a, b]上等概率随机抽样
:param a: 区间左边界
:param b: 区间右边界
:return: x (in [a, b])
"""
import random as rd
return rd.uniform(a, b)
def f(x):
"""生成函数f(x)=sin(pi*x)"""
return math.sin(math.pi * x)
if __name__ == '__main__':
# 函数列表及参数列表
func_list = [f, uniform_sample1D]
func_attr_list = [0.5, (-1, 1)]
for func, attrs in zip(func_list, func_attr_list):
print(func(*attrs))
执行时会抛出以下错误:
TypeError: f() argument after * must be an iterable, not float
Process finished with exit code 1
问题1:引发此错误的原因是什么?
这是因为attrs
前的符号*
要求传递的参数列表必须为元组,而如果只有一个参数,即便写法是元组,比如(0.5)
,它也会被视为是冗余的括号而自动去掉,因此为了避免括号被去掉,一个可行的解决方法是:将0.5
改为(0.5, )
,即添加一个空位,修改后的代码便可以正常运行了。
if __name__ == '__main__':
# 函数列表及参数列表
func_list = [f, uniform_sample1D]
func_attr_list = [(0.5, ), (-1, 1)] # 修改处
for func, attrs in zip(func_list, func_attr_list):
print(func(*attrs))
运行结果:
1.0
0.07772972151241286
Process finished with exit code 0
问题2:为什么传入函数的参数列表前需要加*
符号?
对应主函数中的print(func(*attrs))
,设想如果去掉*
结果会变成怎样?这时候我们的元组将会作为一个整体传入到函数的第一个参数中,显然,对于函数参数超过1个的情况,这样会导致后续的参数缺失,从而抛出异常。
在元组前加*
符号,表示通过迭代的方式,将元组中的元素依次填入到函数的参数列表中的相应位置。然而,单独一个元素并非元组,不可迭代,因此才会出现标题所示的异常。
以上解释若有错误,请批评指正!希望对各位有所帮助~