【问题标题】:How to run loop only once in python?如何在python中只运行一次循环?
【发布时间】:2020-06-25 08:20:52
【问题描述】:

我是 python 和一般编码的新手,我开发了一个小程序来检查谷歌日历中的重复预订。我的问题是,如果我选择检查 6 月 26 日,它将检查 26 AND 27。

我想是因为我在 range(1) 中做了一个 for i (所以它循环了两次,(0,1))

如何更改它以使其仅运行一次?

这里是代码:

        for i in range(1):

            startStrip = datetime.datetime.strptime(event_start, "%Y-%m-%dT%H:%M:%S")
            endStrip = datetime.datetime.strptime(event_end, "%Y-%m-%dT%H:%M:%S")
            dayOfWeek = startStrip + datetime.timedelta(days=i)
            # les bons formats
            currentStart = str(startStrip + datetime.timedelta(days=i)).replace(" ", "T")
            currentEnd = str(endStrip + datetime.timedelta(days=i)).replace(" ", "T")
            calendarEnd = str(endStrip + datetime.timedelta(days=i + 1)).replace(" ", "T")

            events_result = service.events().list(calendarId='primary', timeMin=currentStart + "-00:00",
                                                  maxResults=30, timeMax=calendarEnd + "-00:00",
                                                  singleEvents=True, orderBy='startTime').execute()
            events = events_result.get('items', [])

            currentEmployees = []
            for event in events:
                currentEmployees.append(event['summary'])

            #for i in range(1):
            #event_done = False
            if employee in currentEmployees:
                event_done = False
                event['summary'] = employee
                #if employee not in currentEmployees:
                    #event_done = True
                #else:
                for event in events:
                   # if employee == event['summary']:
                   if str2datetime(currentStart) <= str2datetime(event['end']['dateTime'].split('+')[0]) and str2datetime(currentEnd) >= str2datetime(event['start']['dateTime'].split('+')[0]):
                    event_done = False
                    print(employee + ' est occupé')
                    break
                   else:
                      event_done = True
                      break

            if employee not in currentEmployees:
                event_done = True

            if event_done:
                option = show_message_box(QMessageBox.Critical,
                                      "Confirmation",
                                      "Voulez-vous bloquer cette plage horraire?"\
                                      "L'employé : \"" + employee + "\" sera marqué comme indisponible en raison de : " + reason, \
                                      "Nom de l'employé: " + employee + "\n" \
                                      "Raison: " + reason + "\n" \
                                      "À partir du : " + currentStart + "\n" \
                                      "À ce jour " + currentEnd + "\n"
                                      )

                if option == QMessageBox.Yes:
                    event_done = True
                else:
                    print("Événement ignoré!")
                    event_done = False
                    break

                if event_done:
                    event = {
                        'summary': employee,
                        'location': location,
                        'description': reason,
                        'start': {
                            'dateTime': currentStart,
                            'timeZone': 'America/New_York',
                        },
                        'end': {
                            'dateTime': currentEnd,
                            'timeZone': 'America/New_York',
                        #},
                        #'attendees': [
                         #   {'email': event_email},
                        #],
                        #'reminders': {
                         #   'useDefault': True,
                        },
                    }
                    register_event(service, event)

            else:
                second_message_box(QMessageBox.Critical,
                                      "ATTENTION!",
                                      "L'inspecteur " + employee + " est déjà occupé à ce moment-là.""\n" \
                                      "Veuillez essayer une autre plage horraire.", QMessageBox.Ok)

【问题讨论】:

  • 摆脱循环?循环适用于您需要多次执行该部分代码时。
  • 另外,for i in range(1): 将只有一次迭代(即 0)。
  • 您能否尝试将您的代码简化为minimal reproducible example?
  • 我不能。即使我可以,我也不知道怎么做。我的 GUI 打开,我选择开始日期和结束日期,然后运行代码,调用此函数并将日期格式化以符合谷歌标准,如果所选员工在所选时间忙,则检查所选日期,如果不是,将添加事件,如果没有会给我错误消息。我的问题是它也检查第二天。我不知道如何重现一个例子,对不起。 @丹尼尔沃克
  • 所以如果你看我的代码,它只运行一次?我认为 range(1) 返回 [0,1],这只会使循环两次@DanielWalker

标签: python


【解决方案1】:

你的第一个循环很好,它只会迭代一次 我不知道您的要求逻辑,但我可以看到您的 calander_end 您正在使用 +1 来制作它,这实际上是提前一个日期我想您必须根据您的要求检查和纠正

【讨论】:

  • 我在您发送答案之前的 1 秒内才意识到。!!!谢谢!
【解决方案2】:

首先,range() 函数调用的值直到 'stop' 输入,这意味着你不会得到 0 和 1,你只会得到 i 的 0,其次,如果你只打算通过代码一次,你根本不需要循环吗?如果你不想删除它,你可以在循环块的末尾放一个'break',这会阻止循环再次运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2021-06-15
    • 1970-01-01
    • 2021-04-27
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多