2013-08-21 71 views
0

我想写一个加热器功能,但我有一些困难。我对Python相当陌生。错误与elif和if语句

我想我的加热器运行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

它看起来像你得到之间time(的range()结果搞得一团糟,所以整数列表)和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没有意义;不同类型之间的排序总是先放置数字,然后通过命令它们的类型名称;整数是总是低于列表,所以time > 121总是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

在你的循环,Txrange(150001)整数。在if语句的then子句中,您将T设置为数组,但这与elif子句中发生的情况没有任何关系。

通常,您不应该在循环中重置循环变量(这可能不是您的意思)。

在你编辑的版本中,你有Temp = Temp[120]这是没有更好的:Temp仍然不是一个数组在这里,所以你不能下标。

+0

我把温度=温度[120],因为我想第120位的价值保持不变。我意识到这可能是错误的,但我不知道如何写我想要的东西 –