缩短if,elif,elif else子句

时间:2018-08-16 16:02:24

标签: python arrays if-statement raspberry-pi

我正在编写一个程序,检查下一列火车何时发车。为此,它从网站获取出发时间并将其存储在数组中(times_luz和times_hitz)。

但是,API有时没有任何信息,因此数组中没有数据,该数据稍后在代码中会导致错误,因此,我认为这是一个好主意:

if times_hitz and times_luz:
   Code to be executed if both contain values

elif times_luz:
   Code to be executed if only times_luz contains values

elif times_hitz:
   Code to be executed if only times_hitz contains values

else 
   print("No content available")
   sys.exit()

从技术上讲这是可行的,但是该代码目前大约30行,因此我只需要稍作更改就可以将该代码复制并粘贴2次。这将导致大约80行代码,并且看起来很丑陋。有什么更好的方法吗?

编辑:

我在猜测文件大小时犯了一个严重错误,它实际上是103行,包括注释。因此,我决定将其上传到Google驱动器:

https://drive.google.com/open?id=1F5FIuAy_g7sC_2wTprqg3EF_m_JXEreL

当数组中没有数据时发生的错误位于第44和48行,因为数组times_luz / hitz中的第一项不存在,因此无法保存到变量中。这意味着我必须执行一些代码,这些代码仅在times_hitz中没有任何内容时检查_luz火车,反之亦然。如果两个都包含数据,则我要执行我在google驱动器上拥有的代码,如果两个都不包含数据,则应打印错误消息。

结尾_luz和_hitz代表卢塞恩和希茨基希,这是火车可以在我的车站经过的两种方式

这段代码基本上从Train API中获取时间,并将它们存储在3个不同的变量中。然后它将检查3次,然后将要离开的那一次存储在变量中。它针对_luz和_hitz执行此操作。最后,它检查哪个火车(_luz或_hitz)早点出发,并打印datetime.now和火车发车时间之间的时差

很抱歉,如果我的解释不清楚,请随时在评论中提出更多问题

2 个答案:

答案 0 :(得分:0)

您可以改为在Python中进行定义,因此只需定义一次即可。在任何需要再次使用此定义的地方,都可以简单地调用它。一旦此功能变得更加复杂,您也可以将其设为一个类。

您的代码将改为:

def train_time(times_hitz, time_luz):
    if times_hitz and times_luz:
        Code to be executed if both contain values

    elif times_luz:
        Code to be executed if only times_luz contains values

    elif times_hitz:
        Code to be executed if only times_hitz contains values

    else:
         print("No content available")
         sys.exit()

    return leave

执行代码中的“离开”将在哪里确定下一列火车何时离开。每当您需要评估火车是否要离开时,只需执行以下操作即可:

leave = train_time(times_hitz, time_luz)

答案 1 :(得分:0)

your code中存在大量重复项。基本上,两个目的地(以及以后可能添加的任何其他目的地)的下一列火车的全部代码是相同的,应该移至函数中。

count

然后,您可以获取两个目的地的结果,并在def get_next_train(params): res =requests.get(base, params=params) parsed_json = res.json() #Zeiten aus parsed_json extrahieren time_strings = [d["from"]["prognosis"]["departure"] for d in parsed_json["connections"]] #String, um Zeiten in time_strings nach ISO 8601 zu parsen iso_format = "%Y-%m-%dT%H:%M:%S%z" # Time Strings zu datetime Objekten konvertieren times = [datetime.strptime(ts, iso_format) for ts in time_strings if ts is not None] # Checken, ob times leer sind if not times: return None # CHANGE: return None if no times found #Zeitzone der ersten zeit in Times speichern tz = times[0].tzinfo #jetztige Zeit mit Zeitzone tz, Mikrosekunden löschen nowtime = datetime.now(tz).replace(microsecond=0) # Checken, ob Time_1 noch in der Zukunft ist. Wenn ja, diese Zeit als Time_luz speichern time = min(t for t in times[0:3] if t > nowtime) # CHANGE: use min return time, time - nowtime min结果之后获得filter,然后只需检查该最小值是否为{{1} }(默认设置)。

None

更新:似乎在深夜,None之后可能没有火车开行,导致res_luz = get_next_train(params_luz) res_hitz = get_next_train(params_hitz) res = min(filter(None, (res_luz, res_hitz)), default=None) if res is not None: time, diff = res print ("Next train", time, ", in", str(diff)) else: print("Service nicht verfügbar") 引发异常。您可以通过如下提供另一个nowtime并在这种情况下返回min来解决此问题。

default

更新:如果您想知道下一列火车的目的地(很有道理...),可以从参数中获取它,并将其与时间和时差一起返回。

None

然后打开包装并打印:

time = min((t for t in times if t > nowtime), default=None)
return (time, time - nowtime) if time is not None else None