forループの上限がデフォルトで除外されていることを覚えておくと、少し混乱することがあります。それを包括的にする方法はありますか?
4 に答える
10回のうち9回for
、ある範囲の数値を反復処理するPythonループを作成し、それらの数値を使用してリストまたは他のコンテナーにインデックスを付ける場合、それは間違っています。言い換えれば、これを行う代わりに:
for i in range(len(container)):
print container[i]
あなたはこれをするべきです:
for item in container:
print item
ちょっと待って!あなたは反対します。何らかの方法でアイテムを変更するためにインデックスが必要な場合はどうなりますか?これを行うPythonの方法は、enumerate()
組み込み関数を使用することです。
for i, item in enumerate(container):
print item
container[i] += 1
リストのコピーを作成してもかまわない場合は、リスト内包表記が最良の選択であることがよくあります。
container = [item + 1 for item in container]
または、リストを適切に変更する必要がある場合は、これを試してください。これは、スライス割り当て(既存のリストを置き換えるため)とジェネレーター式(アイテムを遅延変更するため)を組み合わせたものです。
container[:] = (item + 1 for item in container)
はい、for i in range(upper + 1)
または必要に応じて機能しますがfor i in range(lower, upper + 1)
、
多くのプログラミング言語はゼロベースのインデックスを使用するため、包括的でない上限が一般的な方法です(これは、メモリのアドレス指定とオフセットの追加によるものです)。
単なる例:インデックス0でar
始まるサイズ5の配列がある場合、有効な最大のインデックス値は4(つまり、0、1、2、3、4)になりますが、ループ構造はサイズを参照します配列(5)のように:
for i in range(5):
またはより一般的でより良い:
for i in range(len(ar)):
..有効なインデックス値のみを取得するようにする0..4。
あなたはそれになれるようになる。上限に1つ追加するだけです。
あまり苦労せずに1つを定義できます。
def fullrange(lower, upper, step = 1):
return range(lower, upper + 1, step)
しかし、他の人が言っているように、慣れたほうがいいかもしれませんrange(lower, upper + 1)
。+ 1
の意図はかなり明確だと思います。