猿问

在Python中模拟一个并发循环?

在Python中模拟一个并发循环?

我需要模拟Python程序中的并发循环。不幸的是,以下简单的代码不起作用:

list_of_ints = [ 1, 2, 3 ]iterator = list_of_ints.__iter__()element = Nonewhile True:
  if element:
    print element  try:
    element = iterator.next()
  except StopIteration:
    breakprint "done"

它没有打印“1,2,3,Done”,而是打印以下输出:

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

为了捕获‘停止迭代’异常并正确地中断一个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


眼眸繁星
浏览 725回答 5
5回答

慕尼黑8549860

我不知道你想做什么。您可以实现这样的并发循环:while&nbsp;True: &nbsp;&nbsp;stuff() &nbsp;&nbsp;if&nbsp;fail_condition: &nbsp;&nbsp;&nbsp;&nbsp;break或:stuff()while&nbsp;not&nbsp;fail_condition: &nbsp;&nbsp;stuff()你在做什么,试图使用DoWhen循环打印列表中的内容?为什么不直接使用:for&nbsp;i&nbsp;in&nbsp;l: &nbsp;&nbsp;print&nbsp;iprint&nbsp;"done"最新情况:你有一串台词吗?你想继续迭代吗?不如:for&nbsp;s&nbsp;in&nbsp;l:&nbsp; &nbsp;&nbsp;while&nbsp;True:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;stuff()&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;use&nbsp;a&nbsp;"break"&nbsp;instead&nbsp;of&nbsp;s&nbsp;=&nbsp;i.next()这看起来像什么接近你想要的东西吗?对于您的代码示例,它将是:for&nbsp;s&nbsp;in&nbsp;some_list: &nbsp;&nbsp;while&nbsp;True: &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;state&nbsp;is&nbsp;STATE_CODE: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;"//"&nbsp;in&nbsp;s: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens.add(&nbsp;TOKEN_COMMENT,&nbsp;s.split(&nbsp;"//"&nbsp;)[1]&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;=&nbsp;STATE_COMMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens.add(&nbsp;TOKEN_CODE,&nbsp;s&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;state&nbsp;is&nbsp;STATE_COMMENT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;"//"&nbsp;in&nbsp;s: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens.append(&nbsp;TOKEN_COMMENT,&nbsp;s.split(&nbsp;"//"&nbsp;)[1]&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break&nbsp;#&nbsp;get&nbsp;next&nbsp;s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;=&nbsp;STATE_CODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;re-evaluate&nbsp;same&nbsp;line &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;continues&nbsp;automatically

精慕HU

下面是一种非常简单的方法来模拟并发循环:condition&nbsp;=&nbsp;Truewhile&nbsp;condition: &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;loop&nbsp;body&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;condition&nbsp;=&nbsp;test_loop_condition()#&nbsp;end&nbsp;of&nbsp;loopdo-while循环的关键特性是循环主体总是至少执行一次,并且条件在循环主体的底部进行评估。这里显示的控制结构实现了这两种情况,而不需要异常或中断语句。它确实引入了一个额外的布尔变量。

catspeake

下面的代码可能是一个有用的实现,突出了顺其自然VS当据我所知。所以在这种情况下,你至少要经历一次循环。first_pass&nbsp;=&nbsp;Truewhile&nbsp;first_pass&nbsp;or&nbsp;condition: &nbsp;&nbsp;&nbsp;&nbsp;first_pass&nbsp;=&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;do_stuff()
随时随地看视频慕课网APP

相关分类

Python
我要回答