18

Python には、一部の言語に存在する「やり直し」ステートメントのようなものがありますか?

(「redo」ステートメントは、(「break」や「continue」と同様に) ループ動作に影響を与えるステートメントです。最も内側のループの先頭にジャンプして、再度実行を開始します。)

4

7 に答える 7

9

いいえ、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は事実上、「本当の」イテレータを明示的に進める必要があります)が、それらはひどいものではありません(意図することを明確にするためにの使用をコメントしている限り、 、回避するためにメンテナーを混乱させます)。他のループ操作を許可するには、次のようにします。redocontinuecontinueredocontinueredo

# 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:nextsentinelStopIterationnextsentinel

于 2016-04-12T12:59:41.577 に答える
6

いいえ、そうではありません。while ループを使用して、チェック変数を初期値にリセットすることをお勧めします。

count = 0
reset = 0
while count < 9:
   print 'The count is:', count
   if not someResetCondition:
       count = count + 1
于 2016-04-12T12:54:27.060 に答える
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

于 2018-02-01T23:18:05.157 に答える
0

これは、:=演算子があるため、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
于 2021-11-16T22:25:49.540 に答える