파이썬 프로그램에서 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
']
‘반복 중지’예외를 포착하고 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
답변
나는 당신이 무엇을하려고하는지 잘 모르겠습니다. 다음과 같이 do-while 루프를 구현할 수 있습니다.
while True:
stuff()
if fail_condition:
break
또는:
stuff()
while not fail_condition:
stuff()
목록에있는 내용을 인쇄하기 위해 do while 루프를 사용하려고 무엇을하고 있습니까? 왜 사용하지 않습니까?
for i in l:
print i
print "done"
최신 정보:
라인 목록이 있습니까? 그리고 계속 반복하고 싶습니까? 어때요?
for s in l:
while True:
stuff()
# use a "break" instead of s = i.next()
그게 당신이 원하는 것과 비슷한 것 같습니까? 코드 예제를 사용하면 다음과 같습니다.
for s in some_list:
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] )
break # get next s
else:
state = STATE_CODE
# re-evaluate same line
# continues automatically
답변
do-while 루프를 에뮬레이트하는 매우 간단한 방법은 다음과 같습니다.
condition = True
while condition:
# loop body here
condition = test_loop_condition()
# end of loop
do-while 루프의 주요 특징은 루프 바디가 항상 한 번 이상 실행되고 조건이 루프 바디의 하단에서 평가된다는 것입니다. 여기에 표시된 제어 구조는 예외 또는 break 문이 필요없는 두 가지를 모두 수행합니다. 하나의 추가 부울 변수를 소개합니다.
답변
아래 코드는 유용한 구현이 될 수 있습니다. 하면서 vs 동안 내가 이해 한대로
따라서이 경우 항상 루프를 한 번 이상 통과해야합니다.
first_pass = True
while first_pass or condition:
first_pass = False
do_stuff()
답변
예외가 발생하면 루프가 중단되므로 루프 외부에서도 처리 할 수 있습니다.
try:
while True:
if s:
print s
s = i.next()
except StopIteration:
pass
코드의 문제는 break
내부의 동작이 except
정의 되어 있지 않다는 것입니다. 일반적으로 break
하나의 레벨 만 올라갑니다. 예를 들어 break
내부 try
는 finally
(있는 경우) try
루프 밖으로 나가지 않습니다.
관련 PEP : http://www.python.org/dev/peps/pep-3136
관련 질문 : 중첩 루프 해제
답변
do {
stuff()
} while (condition())
->
while True:
stuff()
if not condition():
break
기능을 수행 할 수 있습니다.
def do_while(stuff, condition):
while condition(stuff()):
pass
그러나 1) 추악합니다. 2) 조건은 하나의 매개 변수가있는 함수이어야하며 물건으로 채워져 있어야합니다 ( 클래식 while 루프를 사용 하지 않는 유일한 이유 입니다).
답변
다음은 코 루틴을 사용하는 다른 패턴의 더 크레이지 한 솔루션입니다. 코드는 여전히 매우 유사하지만 한 가지 중요한 차이점이 있습니다. 출구 조건이 전혀 없습니다! 코 루틴 (코 루틴 체인)은 데이터 공급을 중단하면 중지됩니다.
def coroutine(func):
"""Coroutine decorator
Coroutines must be started, advanced to their first "yield" point,
and this decorator does this automatically.
"""
def startcr(*ar, **kw):
cr = func(*ar, **kw)
cr.next()
return cr
return startcr
@coroutine
def collector(storage):
"""Act as "sink" and collect all sent in @storage"""
while True:
storage.append((yield))
@coroutine
def state_machine(sink):
""" .send() new parts to be tokenized by the state machine,
tokens are passed on to @sink
"""
s = ""
state = STATE_CODE
while True:
if state is STATE_CODE :
if "//" in s :
sink.send((TOKEN_COMMENT, s.split( "//" )[1] ))
state = STATE_COMMENT
else :
sink.send(( TOKEN_CODE, s ))
if state is STATE_COMMENT :
if "//" in s :
sink.send(( TOKEN_COMMENT, s.split( "//" )[1] ))
else
state = STATE_CODE
# re-evaluate same line
continue
s = (yield)
tokens = []
sm = state_machine(collector(tokens))
for piece in i:
sm.send(piece)
위의 코드는 모든 토큰을 튜플로 수집 하며 원래 코드 와 는 tokens
차이가 없다고 가정 합니다..append()
.add()
답변
내가 한 방법은 다음과 같습니다.
condition = True
while condition:
do_stuff()
condition = (<something that evaluates to True or False>)
이것은 단순한 해결책 인 것 같습니다. 여기서 그것을 보지 못했다는 것에 놀랐습니다. 이것은 분명히 반전 될 수 있습니다
while not condition:
기타