Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算太阳角代码_Python - Fatal编程技术网

Python 计算太阳角代码

Python 计算太阳角代码,python,Python,我的目标是编写一个代码来测量太阳的度数,6:00时角度为0,18:00时角度为180度。我试着让时间输入一个字符串,然后循环它的字符,找出整数,然后把它放到列表中,这样我就可以避免冒号了。这似乎仍然是一个问题。有人能解释一下这个代码有什么问题吗?为什么我总是得到一个不受支持的操作数类型错误 def sun_angle(time): lis = [] time = str(time) for i in time: if i.isdigit():

我的目标是编写一个代码来测量太阳的度数,6:00时角度为0,18:00时角度为180度。我试着让时间输入一个字符串,然后循环它的字符,找出整数,然后把它放到列表中,这样我就可以避免冒号了。这似乎仍然是一个问题。有人能解释一下这个代码有什么问题吗?为什么我总是得到一个不受支持的操作数类型错误

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