Python Language
ループ
サーチ…
前書き
プログラミングの最も基本的な機能の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')
map
とlambda
を使った値操作でリストを繰り返します。つまり、リストの各要素にラムダ関数を適用します。
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
ループは、 list
やdict
などのアイテムのコレクションを繰り返し処理し、コレクションの各要素を含むコードブロックを実行します。
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
2
と4
は印刷されないことに注意してください。これは、 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つ以上のループを関数にリファクタリングし、 break
をreturn
置き換えることができます。
関数内のreturn
をbreak
として使用する
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節を持つループ
for
とwhile
複合ステートメント(ループ)は、オプションで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 True
とbreak
を組み合わせることができます。
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でも機能します。