2017-02-23 330 views
0
def formula(listA, count_zero=0, start_waiting_time = 0, result=[], service_time=random.expovariate(1.2), interarrival=1): 
    for i in listA: 
     if i == 1: 
      result.append(max(start_waiting_time + service_time - (count_zero + 1) * interarrival), 0) 
      count_zero = 0 
     elif i == 0: 
      count_zero += 1 
    return result 

# Test case 
print(formula([1, 1, 1, 0, 1, 0, 0, 1])) 

#This returns result: TypeError 'float' object is not iterable 

Как только я удаляю max из уравнения result.append(max(start_waiting_time + service_time - (count_zero + 1) * interarrival), 0), тогда я получаю результаты, но эти результаты не то, на что я надеялся.Как исправить ошибку типа: объект «float» не является итерируемым »в моей программе?

Это код, когда max удаляется из уравнения:

def formula(listA, count_zero=0, start_waiting_time = 0, result=[], service_time=random.expovariate(1.2), interarrival=1): 
    for i in listA: 
     if i == 1: 
      result.append(start_waiting_time + service_time - (count_zero + 1) * interarrival) 
      count_zero = 0 
     elif i == 0: 
      count_zero += 1 
    return result 

#[1.536003224186501, 1.536003224186501, 1.536003224186501, 0.5360032241865009, -0.4639967758134991] 

Эти результаты являются правильными за исключением того, что результат никогда не должен быть отрицательным, который был причиной для меня добавления max к уравнению, Я пытался сказать программе, чтобы вычислить 0, если результат становится отрицательным. Таким образом, результат я ожидал был:

#[1.536003224186501, 1.536003224186501, 1.536003224186501, 0.5360032241865009, 0] 

Разница заключается в том, что последний выход в результате является 0, а не -0,4639967758134991.

+0

Вам необходимо исправить ваши круглые скобки. Ваш код - 'list.append (max (...), 0)' вместо 'list.append (max (..., 0))'. –

+0

Да, это правильно, это сработало. –

ответ

1

Из Python3 документации:

Help on built-in function max in module builtins:

max(...) max(iterable[, key=func]) -> value max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item. 
With two or more arguments, return the largest argument. (END) 

В вашем коде, вы использовали максимум на одно значение поплавка, который является результатом выражения:

start_waiting_time + service_time - (count_zero + 1) * interarrival 

Так что, если вы будете проходить кортеж с вашим выражением и 0 до максимальной функции:

result.append(max((start_waiting_time + service_time - (count_zero + 1) * interarrival,0))) 

он должен работать так, как вы ожидали.