Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这些函数相同,但输出的值不同?_Python_Python 3.x - Fatal编程技术网

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它仍然输出相同的,没有区别。好的,但是缩进仍然关闭。你有不必要的计算。