web-dev-qa-db-ja.com

Pythonでの「continue」ステートメントの使用例

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

continueステートメントは、ループの次の反復で続行されます。

コードの良い例が見つかりません。

continueが必要な単純なケースを誰かが提案できますか?

157
JohnG

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

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

出力は次のとおりです。

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

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

196
Snehal Parmar

私は、「ビジネスに取り掛かる」前に満たすべき多くの条件があるループでcontinueを使用するのが好きです。したがって、このようなコードの代わりに:

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など)だけを処理する必要があります。

95

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

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

17
pcalcao
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が整数を返すため、端数がある場合は常にゼロになります。わかりやすくするために省略しました。

12
user1871712

読みやすさについてコメントしている人もいます。

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

if precondition_fails(message): continue

''' main code here '''

これを行うことができることに注意してくださいafterとにかくそのコードを変更せずにメインコードが書かれました。コードを比較すると、メインコードにスペースの変更がないため、「continue」が追加された行のみが強調表示されます。

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

9
C S
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']
5
ILYA Khlopotov

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
4
ytpillai

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ステートメントの後に間違った値が設定されていません。

3
Bastian

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

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を使用すると、インタープリターはループをスキップします。ただし、continueitを使用すると、if-Elifステートメントのみがスキップされ、ループの次の項目に直接移動します。

2
jonathan.hepp