如何模拟实现do-while循环?

1085

我需要在Python程序中模拟一个do-while循环。不幸的是,以下直接的代码无法实现:

list_of_ints = [ 1, 2, 3 ]
iterator = list_of_ints.__iter__()
element = None

while True:
  if element:
    print element

  try:
    element = iterator.next()
  except StopIteration:
    break

print "done"

它会打印以下输出,而不是 "1,2,3,done":

[stdout:]1
[stdout:]2
[stdout:]3
None['Traceback (most recent call last):
', '  File "test_python.py", line 8, in <module>
    s = i.next()
', 'StopIteration
']

我应该怎么做才能捕获“stop iteration”异常并正确地结束while循环?

下面是一个伪代码示例,说明为什么可能需要这样做。

状态机:

s = ""
while True :
  if state is STATE_CODE :
    if "//" in s :
      tokens.add( TOKEN_COMMENT, s.split( "//" )[1] )
      state = STATE_COMMENT
    else :
      tokens.add( TOKEN_CODE, s )
  if state is STATE_COMMENT :
    if "//" in s :
      tokens.append( TOKEN_COMMENT, s.split( "//" )[1] )
    else
      state = STATE_CODE
      # Re-evaluate same line
      continue
  try :
    s = i.next()
  except StopIteration :
    break

7
那不是一个正确的“do-while”,那只是一个“do-forever”而已。用“while True”和“break”有什么问题吗? - S.Lott
102
我相信他的问题是关于如何在Python中实现do-while,因此我不认为他的代码完全正确。此外,他非常接近实现do-while...他在“持续”循环结束时检查条件以查看是否应该退出。这不是“do-forever”。 - Tom
6
你的初始代码在我这里可以正常运行,我没有遇到任何问题,也没有出现回溯信息。这是一个使用恰当的习语来表示迭代器耗尽时的do while循环中断条件。通常情况下,你会设置 s=i.next() 而不是 None,并可能进行一些初始工作,而不仅仅是让第一次循环变得毫无意义。 - underrun
5
很遗憾,这篇帖子没有标记使用的 Python 版本,原始片段在我使用 2.7 版本时也能正常工作,可能是由于 Python 语言本身的更新所致。 - Hannele
22个回答

0
看看这个是否有帮助:
在异常处理程序中设置一个标志,在操作 s 之前检查它。
flagBreak = false;
while True :

    if flagBreak : break

    if s :
        print s
    try :
        s = i.next()
    except StopIteration :
        flagBreak = true

print "done"

3
可以通过使用while not flagBreak:并移除if (flagBreak) : break来简化。 - martineau
3
我避免使用名为“flag”的变量--我无法推断True值或False值的含义。相反,请使用“done”或“endOfIteration”。 代码将变为“while not done: ...”。 - IceArdor

-2

内置的iter函数就是专门用来做这件事的:

for x in iter(YOUR_FN, TERM_VAL):
    ...

例如(在Py2和3中测试):
class Easy:
  X = 0
  @classmethod
  def com(cls):
    cls.X += 1
    return cls.X

for x in iter(Easy.com, 10):
  print(">>>", x)

如果你想给一个终止条件而不是一个值,你总是可以设置一个等式,并要求该等式为True


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接