Python 计算太阳角代码
我的目标是编写一个代码来测量太阳的度数,6:00时角度为0,18:00时角度为180度。我试着让时间输入一个字符串,然后循环它的字符,找出整数,然后把它放到列表中,这样我就可以避免冒号了。这似乎仍然是一个问题。有人能解释一下这个代码有什么问题吗?为什么我总是得到一个不受支持的操作数类型错误Python 计算太阳角代码,python,Python,我的目标是编写一个代码来测量太阳的度数,6:00时角度为0,18:00时角度为180度。我试着让时间输入一个字符串,然后循环它的字符,找出整数,然后把它放到列表中,这样我就可以避免冒号了。这似乎仍然是一个问题。有人能解释一下这个代码有什么问题吗?为什么我总是得到一个不受支持的操作数类型错误 def sun_angle(time): lis = [] time = str(time) for i in time: if i.isdigit():
def sun_angle(time):
lis = []
time = str(time)
for i in time:
if i.isdigit():
lis.append(i)
else:
continue
a = int(lis[0]*10 + lis[1] + ((lis[2] + lis[3])/60))
b = a - 6
if b < 6 or b > 18:
return "I can't see the sun!"
else:
return b * 15
print(sun_angle("12:12"))
如果将上述类似行更改为:
a = int(lis[0]) * 10 + int(lis[1]) + ((int(lis[2]) + int(lis[3]))/60)
然后你会得到一个结果。这一行的问题是混合了int和str类型。由于您已经传入了一个字符串,所以可以将time=strtime更改为time=time。将时间强制转换为字符串是多余的。Michael的回答很好地解释了为什么在使用*和+,之前需要将字符串转换为int 然而,有很多方法可以解析时间,这比您在这里所做的更容易处理。我会考虑拆分,然后解析这两个部分,或者使用DeaTimeLoad更复杂:
# option 1
def parse_time_as_hour(time_str):
hour_str, min_str = time_str.split(':')
return int(hour_str) + int(min_str) / 60.0
# option 2
import datetime
def parse_time_as_hour(time_str):
parsed = datetime.datetime.strptime(time_str, '%H:%M')
return parsed.hour + parsed.minute / 60.0
def sun_angle(time):
fractional_hour = parse_time_as_hour(time)
if fractional_hour < 6 or fractional_hour >= 18:
return "I can't see the sun!"
else:
return (fractional_hour - 6) * 15
您的错误行是:
a = int(lis[0]*10 + lis[1] + ((lis[2] + lis[3])/60))
因为时间是字符串类型
输出:90在计算a的值时,需要将lis[i]转换为整数。07:00表示太阳升起,你的逻辑失败,18:01表示太阳落下
def sun_angle(time_):
lis = []
time_ = str(time_)
for i in time_:
if i.isdigit():
lis.append(i)
else:
continue
a = int(lis[0])*10
a += int(lis[1])
bb = (int(lis[2])*10 + int(lis[3]))
#print a
#print bb
#b = a - 6
if (a < 6 or a > 18) or (a == 18 and bb > 0):
return "I can't see the sun!"
else:
return (float(a)-6.0) * 15.0 + (15.0*float(bb))/60.0
还要注意if b<6或b>18的错误:b已经是a-6了,所以您应该将其更改为if b<0或b>=12
def sun_angle(time_):
lis = []
time_ = str(time_)
for i in time_:
if i.isdigit():
lis.append(i)
else:
continue
a = int(lis[0])*10
a += int(lis[1])
bb = (int(lis[2])*10 + int(lis[3]))
#print a
#print bb
#b = a - 6
if (a < 6 or a > 18) or (a == 18 and bb > 0):
return "I can't see the sun!"
else:
return (float(a)-6.0) * 15.0 + (15.0*float(bb))/60.0