Python 为什么这些函数相同,但输出的值不同?
我编写了一个函数来计算列表的平均值,不包括零,Python 为什么这些函数相同,但输出的值不同?,python,python-3.x,Python,Python 3.x,我编写了一个函数来计算列表的平均值,不包括零,mean_val()是应该输出5.2200932159502855的函数,但是它输出6.525116519937857,尽管公式相同 mean_val2函数具有正确的输出:5.220093215952502855,但此函数不排除零 如何使mean_val() 以下是代码+测试代码: val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15] val1 = [4, 3, 5, 9, 3, 6, 14, 15] def mean_v
mean_val(
)是应该输出5.2200932159502855
的函数,但是它输出6.525116519937857
,尽管公式相同
mean_val2
函数具有正确的输出:5.220093215952502855
,但此函数不排除零
如何使mean_val()
以下是代码+测试代码:
val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15]
val1 = [4, 3, 5, 9, 3, 6, 14, 15]
def mean_val2(val1):
sum = 0
for i in val1:
print(i)
sum += 1 / i
output = len(val1)/sum
return output
def mean_val(val):
sum = 0
for i in val:
if i != 0:
print(i)
sum += 1 / i
output2 = len(val)/sum
return output2
mean_out2 = mean_val2(val1) # 5.2200932159502855 correct output
mean_out = mean_val(val) # 6.525116519937857
print (mean_out, mean_out2)
val和val1的len
len(val)
为10
len(val1)
是8
当你除以len/sum时,你会得到不同的结果
您可以添加一个计数器来跟踪要处理的元素的长度:
val=[4,3,5,0,9,3,6,0,14,15]
val1=[4,3,5,9,3,6,14,15]
def平均值2(值1参数):
总数=0
对于val1_参数中的i:
总计+=1/i
输出=len(val1_参数)/总计
返回输出
定义平均值(值参数):
总数=0
非零长度=0
对于val_参数中的i:
如果我0:
总计+=1/i
非零长度+=1
输出2=非零长度/总长度
返回输出2
平均值2=平均值2(val1)
平均值=平均值(val)
打印(平均输出,平均输出2)
打印(平均输出==平均输出2)
输出:
5.2200932159502855 5.2200932159502855
True
一般说明:
您不应该使用变量名sum
,因为它会隐藏内置函数的名称。我在修改后的代码中将其更改为total
函数参数不应与在全局范围中定义的列表具有相同的名称。我添加了一个\u param
后缀,但是一个更有意义的变量名会更好
您还可以重用您的函数。您可以过滤掉列表中的0,并将其传递给mean_val2
函数,而不是在这两个函数中进行类似的处理
def mean_val(val_param):
返回平均值(如果i!=0,则[i代表值参数中的i])
def平均值2(值1参数):
总数=0
对于val1_参数中的i:
总计+=1/i
输出=len(val1_参数)/总计
返回输出
作为理解:
def平均值(lst):
#从列表中筛选出0个元素
返回平均值(如果i!=0,则lst中的i为i)
def平均值2(lst):
#不带零的进程列表
返回len(lst)/和([1/i表示lst中的i])
我会对两个列表使用一个函数:
val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15]
val1 = [4, 3, 5, 9, 3, 6, 14, 15]
def mean_val(val=[]) -> float:
sum_rec = 0
zeros = 0
for i in val:
if i != 0:
print(i)
sum_rec += 1 / i
else:
zeros += 1
output2 = (len(val) - zeros) / sum_rec
return output2
mean_out2 = mean_val(val1) # 5.2200932159502855 correct output
mean_out = mean_val(val) # 5.2200932159502855 correct output
print (mean_out, mean_out2)
你的缩进消失了。您的意思是不缩进:outputx=len(valx)/sum
。按照您的方式,上次通过for
循环时,outputx
没有更新。@quamrana它仍然输出相同的,没有区别。好的,但是缩进仍然关闭。你有不必要的计算。