我有一个 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
Run Code Online (Sandbox Code Playgroud)
循环背后的想法是,当 self.count 达到 0 时,循环就会终止。这是唯一修改 self.count 的函数。然而我得到了奇怪的结果,循环似乎持续了至少 1 个计数太长的时间,因为程序在某些情况下为 self.count 输出 -1。这应该发生吗?while 循环不应该终止第二个 self.count 为零,还是必须首先完成 for 循环?我是否应该在 self.count 递减之后添加条件逻辑来检查 self.count 是否为零并在为零时中断?这似乎是 while 循环的目的......
while一旦条件不再成立,循环就不会在循环中自动退出;它只是检查每个循环开始时的条件。如果你想早点退出,你需要break显式地(或者做一些其他非本地的事情,比如return从函数或raiseexcept循环外的处理程序)。
看起来你想做的就是for尽早退出循环,如果self.count达到 0。确实没有办法直接做到这一点。每次减少它时都必须检查。
然而,你真的根本不需要self.count。append您可以在相同的位置精确地减少它workDays。所以,只需检查一下您是否已经拥有其中 5 个即可。换句话说,每个self.count -= 1变成:
if len(workDays) >= 5: break\nRun Code Online (Sandbox Code Playgroud)\n\n实际上有一种方法可以在 Python 中实现(我认为)你想要的功能:使用生成器而不是列表。如果您yield每个值而不是将其附加到 alist然后返回该值list在最后返回它,那么一旦获得 5 个条目,您就停止迭代生成器。
例如:
\n\ndef setWorkDays(dayNameList):\n while self.count > 0: #continue loop until all 5 work days have been filled or the loop breaks at the end \n 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 \n if day in self.freeDays or day in self.alDays or (day == 'Saturday' and self.satOff is True):\n continue\n elif day in self.programDays:\n yield day\n elif self.preferredDay is not None and day in self.preferredDay:\n continue\n else:\n yield day\n 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 \n yield day\n\nworkDays = [setWorkDays(dayNameList) for _ in range(5)]\nRun Code Online (Sandbox Code Playgroud)\n\n通常,您甚至并不真正需要list,您所需要做的就是迭代它。为此,你可以这样做:
for workDay in (setWorkDays(dayNameList) for _ in range(5)):\nRun Code Online (Sandbox Code Playgroud)\n\n或者:
\n\nfor workDay in itertools.islice(setWorkDays(dayNameList), 5):\nRun Code Online (Sandbox Code Playgroud)\n\n生成器可以做的很多事情感觉就像魔术,直到你理解它们\xe2\x80\x94,这通常意味着你不应该做它们,直到你了解生成器。因此,如果这对您来说没有意义,请不要只是拿起它并使用它。但如果它提示您学习如何编写和使用生成器函数,那就太好了!
\n| 归档时间: |
|
| 查看次数: |
6680 次 |
| 最近记录: |