实际上,您提供的代码并不像您所说的那样返回一个空列表,它实际上会因为 TypeError 而断言失败,假设您确实调用了 test_get_pass_average() 函数,这在您的代码中并不清晰:
Traceback (most recent call last):
File "testprog.py", line 12, in <module>
test_get_pass_average()
File "testprog.py", line 10, in test_get_pass_average
print('%.2f' % (get_pass_average(list1)))
File "testprog.py", line 5, in get_pass_average
average = sum(count) / len(count)
TypeError: 'int' object is not iterable
可能你认为它打印空列表是因为没有输出,但除非你调用测试函数,否则不会有任何输出,因为你提供的代码只定义了两个函数,什么也没做。
当调用时,你的代码断言失败的原因只是因为你将一个非可迭代的整数变量传递给了sum()。sum()函数需要一个可迭代对象,因为它会遍历每个项目来计算总和 - 你不能遍历单个整数(即使你可以,len()函数也会失败,因为int类型没有这样的函数)。
TypeError: object of type 'int' has no len()
你试图对一个 int
进行这样的操作的原因是因为这个结构:
for variable in [3,1,4,1,5,9]:
这段代码会遍历列表,将variable
依次设置为每个元素。因此,variable
将是一个int
,无法被sum()
或len()
使用。
关于修复它,以下函数为您提供了一个通用解决方案,即所有大于或等于特定阈值的数字的平均值,并允许在没有数字可用时提供特定结果(默认为None
):
def AverageWithThreshold(myList, threshold, emptyResult = None):
newList = [item for item in myList if item >= threshold]
if len(newList) == 0: return emptyResult
return sum(newList) / len(newList)
对于您的特定情况,您可以使用类似以下的方式进行调用(我们假设空列表的平均值为零):
print('%.2f' % (AverageWithThreshold(list1, 50, 0)))
/
在两个版本中的行为是不同的。 - user202729