Почему эти функции одинаковы, но выводят другое значение?

#python #python-3.x

Вопрос:

Я написал функцию для вычисления среднего значения списка, и, исключая нули, mean_val( ) — это функция, которая должна выводить 5.2200932159502855 , но вместо этого она выводит 6.525116519937857 , хотя ее формула та же самая.

mean_val2 Функция имеет правильный вывод: 5.2200932159502855 но эта функция не исключает нули.

Как сделать mean_val() вывод 5.2200932159502855 , одновременно исключив нули из списка и сохранив его в этом формате для цикла?

Вот код код тестирования:

 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)
 

Комментарии:

1. Ваш отступ выключен. Вы хотели не отступать: . outputx = len(valx)/sum Так, как у вас есть, в последний раз через for цикл outputx не обновляется.

2. @quamrana он по-прежнему выводит то же самое, никакой разницы.

3. Хорошо, но ваш отступ все еще выключен. У вас излишний расчет.

Ответ №1:

Значения len val и val1 различны.

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 mean_val2(val1_param):
    total = 0
    for i in val1_param:
        total  = 1 / i
    output = len(val1_param) / total
    return output


def mean_val(val_param):
    total = 0
    non_zero_length = 0
    for i in val_param:
        if i != 0:
            total  = 1 / i
            non_zero_length  = 1
    output2 = non_zero_length / total
    return output2


mean_out2 = mean_val2(val1)
mean_out = mean_val(val)
print(mean_out, mean_out2)
print(mean_out == mean_out2)
 

Выход:

 5.2200932159502855 5.2200932159502855
True
 

Общие примечания:

  1. Вы не должны использовать имя переменной sum , так как оно затеняет имя встроенной функции sum. Я изменил его на total в измененном коде.
  2. Ваши аргументы функции не должны иметь то же имя, что и ваши списки, определенные в глобальной области. Я добавил _param суффикс, но более значимое имя переменной было бы лучше.

Вы также можете повторно использовать свои функции. Вместо того, чтобы выполнять аналогичную обработку в обоих случаях, вы могли бы вместо этого отфильтровать 0 в своем списке и передать их своей mean_val2 функции

 def mean_val(val_param):
    return mean_val2([i for i in val_param if i != 0])


def mean_val2(val1_param):
    total = 0
    for i in val1_param:
        total  = 1 / i
    output = len(val1_param) / total
    return output
 

Как Понимание:

 def mean_val(lst):
    # Filter Out 0 Elements From List
    return mean_val2([i for i in lst if i != 0])


def mean_val2(lst):
    # Process List with No Zeros
    return len(lst) / sum([1 / i for i in lst])
 

Ответ №2:

Я бы использовал одну функцию для обоих списков:

 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)