Pythonでの「継続」ステートメントの使用例?


177

定義continueステートメントは次のとおりです。

continue文は、ループの次の反復を続行します。

コードの良い例を見つけることができません。

誰かcontinueが必要ないくつかの簡単なケースを提案できますか?

回答:


218

以下に簡単な例を示します。

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

出力は次のようになります。

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

ループの次の反復まで続きます。


1
私は過去3日間または4日間考えていましたが、なぜ「継続」ステートメントが必要なのでしょうか。この投稿に出くわすと、QAに役立ちます。ありがとうございます。
Freddy

3
ここでも同じですが、Pythonスクリプト(cronジョブ用)を記述し、大きな値で繰り返し、いくつかの例外が発生すると、cronジョブが停止し、翌日しか知ることができません。例外時にメール送信機能を記述できますが、それでも実行は停止されます。
Snehal Parmar

2
これは何をするかを示してcontinueいますが、可能な場合はあまり役に立ちませんif letter != 'D': print 'Current Letter:', letter
Chris_Rands '26

私はPray / remove rまたはFast / remove sを選択しました。
Benjamin Crouzier

102

私はあなたが「仕事に取り掛かる」前に満たさなければならない多くの条件があるループで継続を使用するのが好きです。したがって、次のようなコードの代わりに:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

私はこのようなコードを取得します:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

このようにすることで、非常に深くネストされたコードを回避します。また、最も頻繁に発生するケースを最初に排除することでループを最適化するのは簡単です。そのため、他のショートッパーがないときに、まれであるが重要なケース(除数が0など)のみに対処する必要があります。


2
したがって、「継続」は、インデントを減らすことによる読みやすさのために主に使用されます。「続ける」が表現力を増すのではないかと思っています。
JohnG

14
continueこの方法での使用は、の使用に似ていGOTOます。ただし、これはを使用する正しい方法GOTOです。
dotancohen 2013年

1
@JohnG実行時に高価になる可能性はありますが、それなしでは再現できない継続(または中断)の使用はないと思います。
Sparr

18

通常、続行が必要/有用な状況は、ループ内の残りのコードをスキップして反復を続行する場合です。

ifステートメントを使用して同じロジックを提供することができるので、私はそれが必要だとは本当に信じていませんが、コードの可読性を高めるのに役立つ場合があります。


23
注意して使用することif <condition>: continueではなく、if not <condition>: ...それはそれなしで書かれていた場合はそれ以外に必要とされるインデントのレベルを避けることができます。
Dan D.

1
私はJohnGに同様のqnを投稿しようとしていましたが、JohnGは私が知りたいことをすでに尋ねていることに気付きました。ここですべての応答を読むことは役に立ちましたが、私はまだ1つのことを確認する必要があります-つまり、continueステートメントを使用するときはいつでも、基本的に条件テストセクションから飛び出し、ループの反復が続行できるようにします次のイテレーションへ?これがを使用するよりも優れているかどうかは、私にはわかりませんelse。読みやすさと実行時のパフォーマンスの向上がすべてなのでしょうか?
AKKO、2014

「私はそれが必要だとは思わない」...まあ、Pythonの作成者はそうではないと考えました。
ジャン=フランソワ・ファーブル

12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

continueは非常に重要な制御ステートメントです。上記のコードは、ゼロによる除算の結果を回避できる典型的なアプリケーションを示しています。プログラムからの出力を保存する必要があるときによく使用しますが、プログラムがクラッシュした場合は出力を保存しません。上記の例をテストするには、最後のステートメントをprint 1 / float(x)に置き換えます。または、randintは整数を返すため、小数部がある場合は常にゼロになります。わかりやすくするために省略しました。


10

一部の人々は読みやすさについてコメントし、「ああ、それは読みやすさをそれほど助けにはなりません、誰が気にしますか?」

メインコードの前にチェックが必要だとします。

if precondition_fails(message): continue

''' main code here '''

メインコードが記述された後でも、コードを変更せずにこれを実行できます。コードを比較すると、メインコードの間隔が変更されないため、「継続」の追加された行のみが強調表示されます。

プロダクションコードのブレークフィックスを実行する必要がある場合を想像してみてください。コードを確認すると、それが唯一の変更であることが簡単にわかります。メインコードをif / elseでラップし始めると、間隔の変更を無視しない限り、diffは新しくインデントされたコードを強調表示します。これは、特にPythonで危険です。短期間でコードを展開しなければならない状況でない限り、これを十分に評価できないかもしれません。


5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']

4
しかし、continue声明ここに何を追加しますか?これはを使用して削除できelement not in colors、コードは同じように読みやすくなります。
ekhumoro

4

3と5の倍数ではないすべての数値を出力するとします。

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x

また、単に使用することができif x %3 == 0 or x % 5 == 0:passelse:print x
ワイルドカード

正しい方法は、continueまたはnot演算子を使用することです。なぜ不必要にパスを使用するのですか?
ytpillai

私はあなたのほうが好きです(それゆえ賛成票です)。使用する必要があるかどうかを整理するためにこのページに来ましたcontinue。私の結論は必要がないということですが、場合によっては(この例のように)を使用するとコードが読みやすくなりcontinueます。これは非常に良い例です。
ワイルドカード

3

IFを使用して実行できるため、絶対に必要というわけではありませんが、読みやすく、実行時のコストも低くなります。

データがいくつかの要件を満たさない場合、ループ内の反復をスキップするために使用します。

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

出力:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

ご覧のように、continueステートメントの後に間違った値が設定されていません。


ifcontinueすべてのコードがブロックに含まれている場合にのみ実行できることを実行できます。ブロックのcontinue外側にあるコードもスキップしますif
bryc 2017年

なぜ時間は 24を含み、は60を含まないのですか?
Patrick Artner

特定の理由はなく、単なる例として、自由に編集してください
Bastian

1

たとえば、変数の値に応じて別のことをしたい場合:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

上記の例で使用する場合 break、インタープリターするとループがスキップされます。しかし、continueこれを使用すると、if-elifステートメントがスキップされ、ループの次の項目に直接移動します。


3
最初の条件は常に真であるため、この例では何も出力されません。初期値と仮定my_varすると0
ダン・D.

私は単に私の古いコードの例を採用しました。varの元の値は0ではなく、元の場所がなかったため、増加する部分が便宜上追加されました。これは例であり、その値は重要ではないので、大丈夫だと思います。
jonathan.hepp

9
それは大丈夫ではありません。の使用に適した広告ではありませんcontinue
John Machin

3
そして、最初elifはである必要がありifます。このコードは、自分が何をしているのかを理解しているようには見えません。
John Machin

これは悪い例です
パトリック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.