调用Lambda函数时触发TypeError: 'list'对象不可调用问题求助
问题解决:列表不可调用的错误及函数优化
问题原因
你的get_marginals函数无论输入是单个字符串还是列表,都会返回一个列表。当你传入'gaussian'时,mgnl实际是[lambda x: scipy.stats.norm.ppf(x)]——一个包含lambda函数的列表,直接调用mgnl(0.5)自然会触发TypeError,因为列表不是可调用对象。
解决方案
根据你提到的「参数可以是列表类型」的需求,我们可以让函数根据输入类型返回对应结构:输入单个字符串则返回单个函数,输入列表则返回函数列表,兼顾两种使用场景。
修改后的函数代码:
import scipy.stats def get_marginals(marginals): # 处理单个字符串输入 if isinstance(marginals, str): if marginals == 'gaussian': return lambda x: scipy.stats.norm.ppf(x) elif marginals == 'student': return lambda x: scipy.stats.t.ppf(x) else: raise ValueError(f"不支持的边缘分布类型: {marginals}") # 处理列表输入 elif isinstance(marginals, list): marginal_dist = [] for m in marginals: if m == 'gaussian': marginal_dist.append(lambda x: scipy.stats.norm.ppf(x)) elif m == 'student': marginal_dist.append(lambda x: scipy.stats.t.ppf(x)) else: raise ValueError(f"不支持的边缘分布类型: {m}") return marginal_dist # 处理非法输入类型 else: raise TypeError("输入必须是字符串或字符串列表")
使用示例
- 单个参数调用(符合你的预期):
mgnl = get_marginals('gaussian') print(mgnl(0.5)) # 输出: 0.0
- 列表参数调用:
mgnl_list = get_marginals(['gaussian', 'student']) print(mgnl_list[0](0.5)) # 输出: 0.0 print(mgnl_list[1](0.5)) # 输出: 0.0
备选方案(保持原返回列表逻辑)
如果你不想修改函数返回结构,也可以在调用时手动取列表的第一个元素:
mgnl = get_marginals('gaussian')[0] mgnl(0.5) # 正常执行
但这种方式不够直观,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者Nassir Bin
相关产品推荐
相关产品推荐

