在Python中如何用相同项循环迭代?

0 投票
8 回答
1398 浏览
提问于 2025-04-15 11:04

在编程中,有一个常见的任务就是在没有收到下一个项目时进行循环迭代。举个例子:

for sLine in oFile :
  if ... some logic ... :
    sLine = oFile.next()
    ... some more logic ...
    # at this point i want to continue iteration but without
    # getting next item from oFile. How can this be done in python?

8 个回答

2

你可以自己创建一个迭代器,这样你就可以把数据放回流的前面,这样你就可以让循环重复显示你想要的那一行:

next_lines = []
def prependIterator(i):
    while True:
        if next_lines:
            yield(next_lines.pop())
        else:
            yield(i.next())

for sLine in prependIterator(oFile):
    if ... some logic ... :
        sLine = oFile.next()
        ... some more logic ...
        # put the line back so that it gets read
        # again as we head back up to the "for
        # statement
        next_lines.append(sLine)

如果prepend_list从来没有被修改过,那么这个prependIterator的行为就和它接收到的那个迭代器完全一样:里面的if语句总是会返回False,它只会把传入的迭代器中的所有内容逐个输出。但是如果在迭代的过程中,prepend_list被添加了新的项目,那么这些新项目会优先被输出,然后才会继续读取主迭代器中的内容。

3

我开始以为你想用的是 continue 这个关键词,但这样的话你会直接跳到下一行输入。

我有点困惑。当你在循环读取文件的每一行时,如果不获取新的一行,循环到底应该怎么继续呢?

你是想再检查一下这一行吗?如果是这样,我建议你可以加一个内部循环,让它一直运行,直到你觉得这一行处理完了。然后你可以用 break 来跳出这个循环,或者用 while 条件和一个标志变量来结束循环。

1

你需要的是一个简单、确定性的有限状态机。就像这样……

state = 1
for sLine in oFile:
   if state == 1:
      if ... some logic ... :
         state = 2
   elif state == 2:
      if ... some logic ... :
         state = 1

撰写回答