什么时候a While循环B

2024-05-29 03:00:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个while循环:

def setWorkDays(dayNameList):
            workDays = []
            while self.count > 0: #continue loop until all 5 work days have been filled or the loop breaks at the end 
                for day in dayNameList: #iterate over days, adding days to work days if they are not free days, AL days, preferred days, or free Saturdays 
                    if day in self.freeDays or day in self.alDays or (day == 'Saturday' and self.satOff is True):
                        continue
                    elif day in self.programDays:
                        workDays.append(day)
                        self.count -= 1
                    elif self.preferredDay is not None and day in self.preferredDay:
                        continue
                    else:
                        workDays.append(day)
                        self.count -= 1
                if self.preferredDay not in self.workDays: #if iteration completes, 5 work days have not been filled, and the preferred day has not been added, add the preferred day 
                    workDays.append(self.preferredDay)
                    self.count -=1
                return workDays

循环背后的想法是自我计数点击0,循环终止。这是唯一一个自我计数已修改。但是我得到了奇怪的结果,循环似乎持续了至少1个计数太长,因为程序在某些情况下输出-1自我计数. 这会发生吗?while循环不应该终止第二个循环吗自我计数命中0,还是必须先完成for循环?我应该在自我计数用于检查是否自我计数是零,如果是就断开?这似乎是while循环的目的。。。在


Tags: ortheinselfifcountnotdays
3条回答

任何语言中的while循环的工作方式都不符合您的预期。在

通常,while循环的格式为:

while <condition>:
  <code block>

while循环在每个循环中检查一次条件。它不经常检查状况。这意味着整个代码块将在每个条件检查之间执行,除非在代码块期间执行某些控制流语句(例如continuebreak或{})。在

实际上,这种每循环一次的条件检查有性能上的好处(计算机不必不断地评估条件),同时也限制了程序的cyclomatic complexity。在

在你的while循环中,你的减量数倍self.count。在

循环只会在块的开始处中断。因此,可能发生的是self.count在块的开头是正的,然后在单个块中递减为负值。在

当条件不再为真时,while循环不会在半循环中自动退出;它只是在每个循环开始时检查条件。如果你想早点离开,你需要显式地break(或者做一些其他非本地的事情,比如从函数中return,或者{}到循环外的except处理程序)。在

如果self.count命中0,那么您要做的似乎是尽早退出for循环。真的没有办法直接这么做。你每次减量都要检查一下。在

但是,您实际上根本不需要self.count。在appendworkDays的相同位置,将其递减。所以,检查一下你是否有5个。换句话说,每个self.count -= 1变成:

if len(workDays) >= 5: break

实际上有一种方法可以在Python中实现您想要的功能:使用生成器而不是列表。如果您yield每个值,而不是将其附加到list,然后在结尾返回{},那么一旦获得5个条目,就停止遍历生成器。在

例如:

^{pr2}$

通常,您甚至不需要list,您只需要遍历它。为此,您可以:

for workDay in (setWorkDays(dayNameList) for _ in range(5)):

或者:

for workDay in itertools.islice(setWorkDays(dayNameList), 5):

很多生成器可以做的事情在你理解它们之前感觉就像魔法一样,这通常意味着在你了解生成器之前,你不应该做这些事情。所以,如果这对你来说没有意义,不要只是拿起它来使用它。但是如果它促使你学会如何编写和使用生成器功能,那太好了!在

相关问题 更多 >

    热门问题