2013-08-21 2 views
0

Я пытаюсь написать функцию обогревателя, но у меня есть несколько трудностей. Я довольно новичок в Python.ошибка с elif и если заявления

Я хочу, чтобы мой нагреватель работал в течение 15000 секунд, но за первые 120 секунд (включая 120) Я хочу, чтобы он следовал линейному пути T = 0.0804 * t + 16.081, а затем через 120 секунд я хочу, чтобы он оставался постоянным для остальных оставшихся времени при конечной температуре, найденной из линейного уравнения.

Код я написал ниже, который я получаю сообщение об ошибке с

import math, numpy as np 
from random import * 

a = 0.0804 
time = range(15001) 

for time in xrange(15001): 
    if 0 < = time < = 120: 
    Temp = a * np.array(time) + 18.3 
    elif time > 121: 
    Temp = Temp[120] 

Ошибки:

TypeError 
Traceback (most recent call last) 
    /Library/Python/2.7/site-packages/ipython-1.0.0_dev-py2.7.egg/IPython/utils/py3c‌​ompat.pyc in execfile(fname, *where) 
     202 else: 
     203 filename = fname 
    --> 204 builtin.execfile(filename, *where) 
/Users/mariepears/Desktop/heaterfunction.py in <module> 
    () 16 print T 
     17 elif t>121: 
    ---> 18 T=T[120] 
TypeError: 'int' object is not subscriptable` 
+1

хорошо, какие ошибки? (и я даже не знаю, что сказать о ваших именах переменных) – Doorknob

+0

Пожалуйста, отредактируйте его в вопросе, чтобы он был на самом деле читабельным. – Doorknob

+0

@MariePears Это, безусловно, улучшит читаемость, если вы отредактируете это в свой вопрос. – glglgl

ответ

3

Похоже, вы получаете перепутались между timerange() результате, так список целых чисел) и Temp (верхний регистр, переменная цикла, целое число).

time = range(15001) 
for Temp in xrange(15001): 
    if 0 <= Temp <= 120: 
    Temp = a * np.array(time) + 18.3 
    elif Temp > 121: 
    Temp = time[120] 

Поскольку time является список, вы не должны пытаться проверить против, если она меньше или больше, чем одно целое либо; 0 <= time <= 120 не имеет смысла; заказы между разными типами всегда помещают номера сначала, затем заказывают их тип name; целыми являются всегда ниже, чем списки, поэтому time > 121 is всегдаTrue.

temperatures = [] 
for second in xrange(121): 
    last = a * second + 18.3 
    temperatures.append(last) 

temperatures += temperatures[120:] * (15000 - 120) 

Или как список понимания:

temperatures = [a * min(sec, 120) + 18.3 for sec in xrange(150001)] 
+0

Я изменил свои имена.Я хочу, чтобы время было циклом и производило разные температуры, а затем я хочу сохранить постоянную температуру через 120 секунд. –

+1

@MariePears: тогда почему бы не цитировать прямо над 'временем'? –

+0

@MariePears: каков расчет за секунду, который должен * делать *? На самом деле вызов 'np.array()' не имеет смысла. –

0

В вашем цикле T является целым числом от xrange(150001). В предложении then вашего оператора if вы устанавливаете T как массив, но это не имеет ничего общего с тем, что происходит в предложении elif.

Как правило, вы не должны сбросить переменную цикла в цикле (и это, вероятно, не то, что вы хотите сделать).

В вашей отредактированной версии у вас есть Temp = Temp[120], что не лучше: Temp по-прежнему не является массивом, поэтому вы не можете его индексировать.

+0

Я поставил Temp = Temp [120], поскольку я хотел, чтобы значение 120-й позиции оставалось постоянным. Я понимаю, что это, вероятно, неправильно, но я не мог понять, как писать то, что я хотел –

Смежные вопросы