首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缩短if,elif,elif clause子句

缩短if,elif,elif clause子句
EN

Stack Overflow用户
提问于 2018-08-16 16:02:23
回答 2查看 136关注 0票数 1

我正在做一个程序,检查下一班火车什么时候开走。为此,它从网站获取出发时间,并将其存储在数组(times_luz和times_hitz)中。

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

代码语言:javascript
复制
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驱动器:

JXEreL

当数组中没有数据时发生的错误出现在第44和48行,因为array _luz/hitz中的第一项不存在,因此不能保存到变量中。这意味着,我必须执行一些代码,这些代码只检查_luz列车,如果times_hitz中没有任何东西,相反的情况下。如果两者都包含数据,我希望执行我在google驱动器上的代码,如果两者都不包含数据,则应该打印错误消息。

结束语_luz和_hitz代表卢塞恩和希兹基奇,火车可以在我的车站上行驶的两种方式。

这段代码基本上需要从Train中获取时间,并将它们存储在3个不同的变量中。然后,它检查3次,并存储将离开下一个变量。它为_luz和_hitz做到了这一点。最后,它检查哪列列车(_luz还是_hitz)提前起飞,并打印出datetime.now和火车发车时间之间的差异。

对不起,如果我的解释不清楚,请在评论中提出更多问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-17 09:14:02

你的代码中存在大量的复制。基本上,对于两个目的地(以及以后可能添加的任何其他目的地),获取下一班火车的整个代码都是相同的,应该移到一个函数中。

代码语言:javascript
复制
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之后获得None,然后检查该min是否为None (默认)。

代码语言:javascript
复制
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来修复这个问题。

代码语言:javascript
复制
time = min((t for t in times if t > nowtime), default=None)
return (time, time - nowtime) if time is not None else None

更新:如果你想知道下一班火车的目的地(有道理.)您可以从参数中获取它,并在时间和差异的同时返回它。

代码语言:javascript
复制
    return time, time - nowtime, params["to"]

然后打开并打印出来:

代码语言:javascript
复制
if res is not None:
    time, diff, dest = res
    print ("Next train to %s at %s (in %s)" % (dest, time, diff))
票数 0
EN

Stack Overflow用户

发布于 2018-08-16 16:10:24

相反,您可以使用Python进行定义,所以只需定义一次。无论何时您需要再次使用这个定义,您都可以简单地调用它。一旦这个函数变得更复杂,您也可以将它变成一个类。

您的代码将改为:

代码语言:javascript
复制
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

哪里的“离开”将从您执行的代码,以确定什么时候下一列火车离开。当你需要评估火车是否要离开时,只需做:

代码语言:javascript
复制
leave = train_time(times_hitz, time_luz)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51881176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档