Python には、一部の言語に存在する「やり直し」ステートメントのようなものがありますか?
(「redo」ステートメントは、(「break」や「continue」と同様に) ループ動作に影響を与えるステートメントです。最も内側のループの先頭にジャンプして、再度実行を開始します。)
Python には、一部の言語に存在する「やり直し」ステートメントのようなものがありますか?
(「redo」ステートメントは、(「break」や「continue」と同様に) ループ動作に影響を与えるステートメントです。最も内側のループの先頭にジャンプして、再度実行を開始します。)
いいえ、Python は を直接サポートしていませんredo
。1 つのオプションは、次のようなネストされたループを含む、かすかにひどいものです。
for x in mylist:
while True:
...
if shouldredo:
continue # continue becomes equivalent to redo
...
if shouldcontinue:
break # break now equivalent to continue on outer "real" loop
...
break # Terminate inner loop any time we don't redo
しかし、これは、例外、フラグ変数、またはすべてを関数としてパッケージ化することなしに、" -able" ブロックbreak
内で外側のループを ing することが不可能であることを意味します。redo
while
または、ループの機能を複製するストレート ループを使用しfor
て、イテレータを明示的に作成して進めます。それには独自の問題があります(デフォルトでcontinue
は事実上、「本当の」イテレータを明示的に進める必要があります)が、それらはひどいものではありません(意図することを明確にするためにの使用をコメントしている限り、 、回避するためにメンテナーを混乱させます)。他のループ操作を許可するには、次のようにします。redo
continue
continue
redo
continue
redo
# Create guaranteed unique sentinel (can't use None since iterator might produce None)
sentinel = object()
iterobj = iter(mylist) # Explicitly get iterator from iterable (for does this implicitly)
x = next(iterobj, sentinel) # Get next object or sentinel
while x is not sentinel: # Keep going until we exhaust iterator
...
if shouldredo:
continue
...
if shouldcontinue:
x = next(iterobj, sentinel) # Explicitly advance loop for continue case
continue
...
if shouldbreak:
break
...
# Advance loop
x = next(iterobj, sentinel)
上記は、 の 2 つの引数の代わりに/try
を使用して実行することもできますが、ループ全体をラップすると、他のソースがキャッチされるリスクがあり、内部呼び出しと外部呼び出しの両方に対して適切に制限されたスコープで実行すると、非常に醜いものになります (ベースのアプローチよりもはるかに悪い)。except StopIteration:
next
sentinel
StopIteration
next
sentinel
いいえ、そうではありません。while ループを使用して、チェック変数を初期値にリセットすることをお勧めします。
count = 0
reset = 0
while count < 9:
print 'The count is:', count
if not someResetCondition:
count = count + 1
あまり洗練されていませんが、読みやすくwhile
、ループの最後に a とインクリメントを使用しています。そのためcontinue
、その間にはやり直しの効果があります。3 の倍数ごとにやり直すサンプル:
redo = True # To ends redo condition in this sample only
i = 0
while i<10:
print(i, end='')
if redo and i % 3 == 0:
redo = False # To not loop indifinively in this sample
continue # Redo
redo = True
i += 1
結果: 00123345667899
これは、:=
演算子があるため、python 3.8+ のソリューションです。
for key in mandatory_attributes: # example with a dictionary
while not (value := input(f"{key} (mandatory): ")):
print("You must enter a value")
mandatory_attributes[key] = value