You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何阻止循环中动作重复执行?Python自动打开在线课程脚本的循环异常问题求助

解决在线课程自动打开脚本的重复执行问题

咱们先拆解下你遇到的问题:当脚本匹配到lesson1的时间后,会一直重复执行第一个if分支的代码——因为此时now的值始终等于lesson1,循环没有任何机制标记这个课程已经执行过,所以会无限触发打开浏览器的操作。

核心解决方案:标记已执行的课程

要让每个课程只执行一次,我们需要一个“已完成”的标记,用来记录哪些课程时间已经触发过操作。同时,把课程时间和对应的链接整理成字典,会让代码更易维护。

调整后的代码如下:

import webbrowser
import time

# 用字典存储课程时间和对应链接,后续加课程直接在这里补充即可
lessons = {
    "03/09/21, 15:38": "https://google.com",
    "03/10/21, 15:39": "https://google.com",
    "03/10/21, 15:40": "https://google.com"
}
# 用集合记录已经执行过的课程时间,避免重复触发
completed_lessons = set()

while True:
    # 每次循环都获取最新的当前时间
    now = time.strftime("%D, %H:%M")
    
    # 检查当前时间是否是未完成的课程时间
    if now in lessons and now not in completed_lessons:
        print("LESSON IS OPENING :D")
        webbrowser.open(lessons[now])
        # 标记该课程已完成
        completed_lessons.add(now)
        
        # 如果所有课程都执行完毕,就退出整个循环
        if len(completed_lessons) == len(lessons):
            print("所有课程已完成,脚本即将退出")
            break
    else:
        print(f"Waiting, the current time is {now}")
    
    # 每秒检查一次时间
    time.sleep(1)

关键逻辑说明

  1. 字典存储课程信息:相比单独定义lesson1lesson2这类变量,字典可以让你更方便地添加/修改课程,逻辑也更清晰。
  2. 集合标记已完成课程:集合的查询效率很高,每次触发课程操作后,把对应的时间加入集合,后续即使时间再次匹配,也会因为“已在集合中”而跳过执行。
  3. 循环内更新当前时间:把now的更新放在外层循环里,确保每次循环都能获取最新的时间,避免出现时间停滞的问题。
  4. 完成后退出循环:当所有课程都标记为已完成时,用break跳出整个while True循环,脚本自动停止。

关于“停止循环中某个动作”的通用方法

要避免循环中某个动作重复执行,最常用的思路就是状态标记

  • 用布尔变量(比如is_lesson1_executed = False)或者集合、列表这类容器,记录动作是否已经执行过;
  • 每次执行动作前先检查标记,如果未执行再触发操作,执行后更新标记;
  • 如果需要完全退出循环,直接使用break语句即可终止整个循环;如果只是跳过当前动作,可以用continue跳过本次循环的剩余代码。

内容的提问来源于stack exchange,提问作者Matteo Passaro

火山引擎 最新活动