Python3 TypeError: func() argument after * must be an iterable, not float 解决方案

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个的情况,这样会导致后续的参数缺失,从而抛出异常。

       在元组前加*符号,表示通过迭代的方式,将元组中的元素依次填入到函数的参数列表中的相应位置。然而,单独一个元素并非元组,不可迭代,因此才会出现标题所示的异常。

以上解释若有错误,请批评指正!希望对各位有所帮助~

猜你喜欢

转载自blog.csdn.net/weixin_42430021/article/details/121146252
今日推荐