サーチ…


前書き

プログラミングの最も基本的な機能の1つとして、ループはほぼすべてのプログラミング言語にとって重要な要素です。ループを使用すると、コードの特定の部分を反復と呼ばれるいくつかのループを繰り返すように設定できます。このトピックでは、複数のタイプのループと、Pythonでループのアプリケーションを使用する方法について説明します。

構文

  • while <ブール式>:
  • <iterable>の<variable>に対して:
  • 範囲内の<variable>(<number>)の場合:
  • 範囲内の<変数>(<開始番号>、<終了番号>):
  • 範囲内の<variable>(<開始番号>、<終了番号>、<ステップサイズ>):
  • 私は、列挙型(<iterable>)で<variable>:インデックス#を持つ#
  • zip(<iterable1>、<iterable2>)の<variable1>、<variable2>の場合:

パラメーター

パラメータ詳細
ブール式ブール値のコンテキストで評価できる式、たとえばx < 10
変数 iterableから現在の要素の変数名
繰り返し可能な反復を実装するもの

リストの反復

あなたが使用することができ、リストを反復処理するfor

for x in ['one', 'two', 'three', 'four']:
    print(x)

これはリストの要素を出力します:

one
two
three
four

range関数は、forループでよく使われる数値を生成します。

for x in range(1, 6):
    print(x)

結果は、python> = 3の特殊な範囲のシーケンス型と、python <= 2のリストになります。どちらも、forループを使用してループすることができます。

1
2
3
4
5

あなたは、リストの要素の両方もののループにしたい 、同様の要素のインデックスを持っている場合は、Pythonの使用することができますenumerate機能を:

for index, item in enumerate(['one', 'two', 'three', 'four']):
    print(index, '::', item)

enumerateはタプルを生成し、タプルはindex (整数)とitem (リストの実際の値)に展開されます。上記のループが印刷されます

(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')

maplambdaを使った値操作でリストを繰り返します。つまり、リストの各要素にラムダ関数を適用します。

x = map(lambda e :  e.upper(), ['one', 'two', 'three', 'four'])
print(x)

出力:

['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x

NB:Python 3.x mapではリストの代わりにイテレータが返されるので、リストが必要な場合には、結果print(list(x))をキャストしなければなりません( http://www.riptutorial.com/python/ example / 8186 / map-- http://www.riptutorial.com/python/topic/809/incompatibilities-moving-from-python-2-to-python-3 )を参照してください

Forループ

forループは、 listdictなどのアイテムのコレクションを繰り返し処理し、コレクションの各要素を含むコードブロックを実行します。

for i in [0, 1, 2, 3, 4]:
    print(i)

上のforループは数値のリストを繰り返します。

各反復は、 iの値をリストの次の要素に設定します。したがって、最初それがあろう0次いで、 1 、次いで2 :出力は以下のようになる等、

0  
1
2
3
4

rangeは、反復可能な形式で一連の数値を返す関数であるため、 forループで使用できます。

for i in range(5):
    print(i)

最初のforループとまったく同じ結果for返します。ここで範囲は0から数えて最初の5つの数字ですので、 5は印刷されません。

反復可能なオブジェクトとイテレータ

forループは、 __getitem__または__iter__関数を定義するオブジェクトである反復可能オブジェクトに対して反復処理を実行できます。 __iter__関数は、反復子を返します。反復子は、反復子の次の要素にアクセスするために使用されるnext関数を持つオブジェクトです。

ループで中断し続ける

breakステートメント

breakステートメントがループ内で実行されると、制御フローはすぐにループから "外れ"ます。

i = 0
while i < 7:
    print(i)
    if i == 4:
        print("Breaking from loop")
        break
    i += 1

ループ条件は、 breakステートメントの実行後に評価されません。 break文は、 ループ内でのみ構文的に許可されることに注意してください。関数内のbreakステートメントを使用して、その関数を呼び出したループを終了することはできません。

次のコマンドを実行すると、 break文が満たされてループが停止したときに、数字4まですべての数字が出力されます。

0
1
2
3
4
Breaking from loop

break文は、 forループ内forも使用できます。これは、Pythonによって提供される他のループ構造です。

for i in (0, 1, 2, 3, 4):
    print(i)
    if i == 2:
        break

このループを実行すると、

0
1
2

ループが終了しているので、3と4は印刷されません。

ループにelseある場合、 break文によってループが終了したときには実行されません。

continue声明

continue文は、現在のブロックの残りの部分をバイパスしてループの次の繰り返しにスキップしますが、ループを続行します。 breakと同様に、 continueはループ内にしか現れません:

for i in (0, 1, 2, 3, 4, 5):
    if i == 2 or i == 4:
        continue
    print(i)

0
1
3
5

24は印刷されないことに注意してください。これは、 i == 2またはi == 4ときにprint(i)を続行するのではなく、 continueが次の繰り返しに進むためです。

ネストループ

breakしてcontinueするのは、単一レベルのループでのみ動作します。次の例は、内側のforループから抜け出すだけで、外側のwhileループから抜け出すことはありません。

while True:
    for i in range(1,5):
        if i == 2:
            break    # Will only break out of the inner loop!

Pythonには、一度に複数のレベルのループから抜け出る能力がありません。もしこの振る舞いが必要ならば、1つ以上のループを関数にリファクタリングし、 breakreturn置き換えることができます。

関数内のreturnbreakとして使用する

returnは、関数の後に続くコードを実行することなく、関数から終了します。

関数内にループがある場合、そのループの中からのreturnを使用することは、ループの残りのコードが実行されないbreakすることと同じです( ループの後のコードは実行されません )。

def break_loop():
    for i in range(1, 5):
        if (i == 2):
            return(i)
        print(i)
    return(5)

ネストされたループがある場合、 return文はすべてのループを解除します。

def break_all():
    for j in range(1, 5):
        for i in range(1,4):
            if i*j == 6:
                return(i)
            print(i*j)

出力されます:

1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed

else節を持つループ

forwhile複合ステートメント(ループ)は、オプションでelse節を持つことができます(実際には、この使用法は非常にまれです)。

else節は、 forループが終了するまで終了するか、 whileループがその条件式がfalseになって終了した後にのみ実行されます。

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

出力:

 0
 1
 2
 done

ループが別の方法で終了する場合( break文または例外を発生させることによって)、 else節は実行されませ

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

出力:

0
1

他のほとんどのプログラミング言語には、ループのこのオプションのelse節がありelse 。特にelseキーワードの使用は、しばしば混乱していると考えられます。

このような句の元のコンセプトはDonald Knuthに帰されていelse構造化プログラミングの前日や低レベルのアセンブリ言語からif文とgoto文についてループを書き直すと、 elseキーワードの意味が明確になります。

例えば:

while loop_condition():
    ...
    if break_condition():
        break
    ...

次のものと同等です。

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

これらは、それぞれにelse節を付けると同等です。

例えば:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

次のものと同等です。

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

else節を持つforループも同様に理解できます。概念的には、反復可能なオブジェクトまたはシーケンスにまだいくつかの残りの要素がある限りTrueのままであるループ条件があります。

なぜこの奇妙な構造を使うのだろうか?

for...else構造の主な使用例は、検索の簡潔な実装です(例:

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception") 

この構造のelseを混乱させることを少なくするために、 elseを「 破損していない場合 」または「 見つからない場合 」と考えることができます。

これに関するいくつかの議論は、 [Python-ideas]のfor ... elseスレッドの要約にあります。 なぜforとwhileループの後ろに 'else'を使用しますか? 、およびその他のループ文に関する節

辞書の繰り返し

次の辞書を考えてみましょう。

 d = {"a": 1, "b": 2, "c": 3}

そのキーを反復処理するには、次のものを使用できます。

for key in d:
    print(key)

出力:

"a"
"b"
"c"

これは次のようになります。

for key in d.keys():
    print(key)

またはPython 2:

for key in d.iterkeys():
    print(key)

値を反復処理するには、次のようにします。

for value in d.values():
    print(value)

出力:

1
2
3

キーと値を反復処理するには、次のようにします。

for key, value in d.items():
    print(key, "::", value)

出力:

a :: 1
b :: 2
c :: 3

Python 2では、 .keys() .values()および.items()listオブジェクトを返します。あなたは、単に結果トラフ反復処理する必要がある場合は、同等の使用することができます.iterkeys().itervalues().iteritems()

.keys().iterkeys() .values().itervalues() .items().iteritems()ということであるiter*方法はジェネレータです。したがって、辞書内の要素は、評価されるごとに1つずつ生成されます。 listオブジェクトが返されると、すべての要素がリストにパックされ、その後の評価のために返されます。

また、Python 3では、上記の方法で印刷された項目の順序は順序に従わないことにも注意してください。

Whileループ

whileループでは、ループ条件がfalseになるまでループ文が実行されます。次のコードはループ文を合計4回実行します。

i = 0 
while i < 4:
    #loop statements
    i = i + 1

上記のループは、 forループをよりエレガントなforループに簡単に変換できますが、 whileループは、何らかの条件が満たされているかどうかを確認するのに便利です。次のループはmyObjectが準備ができるまで実行を続けます。

myObject = anObject()
while myObject.isNotReady():
    myObject.tryToGetReady()

whileループは数値なしで実行することもできます(複素数または実数)またはTrue

import cmath

complex_num = cmath.sqrt(-1)
while complex_num:      # You can also replace complex_num with any number, True or a value of any type
    print(complex_num)   # Prints 1j forever

条件が常にtrueの場合、whileループは、breakステートメントまたはreturnステートメントまたは例外によって終了されない場合、永遠に(無限ループ)実行されます。

while True:
    print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...

合格声明

passは、Python構文( forループまたはwhileループの本体の中など)でステートメントが必要なときにはnullステートメントですが、プログラマーはアクションを必要としません。これは、まだ書かれていないコードのプレースホルダとして役立ちます。

for x in range(10):
    pass #we don't want to do anything, or are not ready to do anything here, so we'll pass

この例では何も起こりません。 forループはエラーなく完了しますが、コマンドやコードは実行されません。 passは、すべてのコマンドとアクションを完全に実装することなく、コードを正常に実行できるようにします。

同様に、 whileループや選択や関数定義などでpassを使うことができます。

while x == y:
    pass

異なるステップサイズでリストの異なる部分を反復する

長い要素リストがあり、リストの他のすべての要素にのみ関心があるとします。おそらく最初または最後の要素、またはリスト内の特定の範囲のエントリだけを調べたいと思うかもしれません。 Pythonは強力なインデックス作成機能を備えています。これらのシナリオを達成する方法の例をいくつか示します。

ここでは、例全体を通して使用される簡単なリストを示します。

lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']

リスト全体の反復

リストの各要素を反復処理するには、以下のようなforループを使用できます。

for s in lst:
    print s[:1] # print the first letter

forループはlst各要素にsを代入forます。これは印刷されます:

a
b
c
d
e

多くの場合、要素とその要素のインデックスの両方が必要です。 enumerateキーワードは、そのタスクを実行します。

for idx, s in enumerate(lst):
    print("%s has an index of %d" % (s, idx))

インデックスidxは0から始まり、反復ごとにインクリメントされ、 sは処理される要素を含みます。以前のスニペットは次のように出力されます:

alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4

サブリストを反復する

範囲を繰り返したい場合(Pythonがゼロベースのインデックスを使用していることに注意してください)、 rangeキーワードを使用してください。

for i in range(2,4):
    print("lst at %d contains %s" % (i, lst[i]))

これは出力します:

lst at 2 contains charlie
lst at 3 contains delta

リストはスライスされてもよい。次のスライス表記法は、インデックス1の要素からステップ2の最後に移動します.2つのforループは同じ結果for返します。

for s in lst[1::2]:
    print(s)

for i in range(1, len(lst), 2):
    print(lst[i])

上の抜粋は次のように出力します:

bravo
delta

インデックス作成とスライスは独自のトピックです。

"ハーフループ" do-while

他の言語とは異なり、Pythonはdo-untilやdo-whileの構造を持っていません(これは、条件がテストされる前に一度コードが実行されるようにします)。しかし、同じ目的を達成するために、 while Truebreakを組み合わせることができます。

a = 10
while True:
    a = a-1
    print(a)
    if a<7:
        break
print('Done.')

これは印刷されます:

9
8
7
6
Done.

ルーピングとアンパック

たとえば、タプルのリストをループしたい場合:

collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]

このようなことをするのではなく、

for item in collection:
    i1 = item[0]
    i2 = item[1]
    i3 = item[2]
    # logic

またはこのようなもの:

for item in collection:
    i1, i2, i3 = item
    # logic

これを簡単に行うことができます:

for i1, i2, i3 in collection:
    # logic

これは、タプルだけでなく、 ほとんどのタイプのiterableでも機能します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow