不使用next()迭代列表

5

我有一个名为current_month_list的列表,每个月都会填充该月份中的星期一。例如对于六月,它将是:

current_month_list = 6, 13, 20, 27

我正在使用

next_rubbish_day = next(x for x in current_month_list if x > todays_date.day)

返回下一个星期一的列表,例如今天是16号,则返回20号。

这个方法很有效,但我正在尝试转换为Pyscript并在不同的环境中使用它,而且显然(在另一个网站上引用):

pyscript包括一个异步Python解释器,并且不实现在解释器中特别困难的某些功能。其中包括生成器。

我得到的错误是

not implemented ast ast_generatorexp

所以我的问题是,是否有其他编码方式?我对Python不太熟悉,希望得到一些帮助。谢谢您的关注。


2
只需使用常规的for循环即可。如果您想到了上述内容,那么这应该很简单明了。 - juanpa.arrivillaga
它是否实现了内置的 filternext_rubbish_day = next(filter(lambda x : x > todays_data.day, current_month_list)) - chepner
当前函数在今天日期晚于上一个周一时将引发 StopIteration 异常。这种情况下的期望行为是什么? - Mark
2个回答

0

由于生成器被禁止,只需回到常规循环。 next() 将返回该生成器表达式中的下一项,而且由于您刚刚创建了生成器,那将是第一项。因此,一旦获得第一项,就可以跳出循环:

for x in current_month_list:
    if x > todays_date.day: 
        next_rubbish_day = x
        break 

现在,如果current_month_list中没有任何一个x > todays_date.day,那么这段代码将不会抛出任何错误;而你原来的代码会抛出一个StopIteration异常。要实现这个功能,你只需要使用for..else形式

for x in current_month_list:
    if x > todays_date.day: 
        next_rubbish_day = x
        break 
else:
    # This code runs only if the loop finishes without being broken
    raise StopIteration()

据我所知,这段代码与您的next(...)语句完全相同。


那会给我们一些可操作的东西。谢谢。 - user12155673
请注意,正如您在问题中展示的那样,current_month_list 实际上是一个元组,但在这种情况下并不相关,因为您对该元组所做的所有操作都是迭代,所以它可以是任何可迭代的对象。此外,正如 @Mark 所指出的,如果没有满足您条件的元素,您的原始代码将引发 StopIterationError。您可以通过使用 for...else 结构来实现这一点,我将很快编辑我的答案来演示。 - Pranav Hosangadi

0

可能会像这样做(您需要设置或导入todays_date.day)。有很多方法可以使用for、while、break、return等来完成。这取决于您想要什么!祝你好运!

def main():
    print(date_fun())
    
def date_fun():    
    current_month_list = [6, 13, 20, 27]
    for y in current_month_list:
        if y > todays_date.day:
            return y

main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接