[pythonノート]forループにおけるループ変数反復問題
5384 ワード
[pythonノート]forループにおけるループ変数反復問題
pythonでは、forループは反復器(Iterator)に相当し、ループ体でループ変数の値を変更することはループ回数に影響しません.反復器は独立したスレッドで動作し、mutexロックを有する.反復器が作成されると、メモリインデックステーブル(単一チェーンテーブル)が作成され、このインデックステーブルは元のオブジェクトを指し、元のオブジェクトの数が変更されると、このインデックステーブルの内容は同期的に変更されないため、インデックスポインタが下に移動すると反復するオブジェクトが見つからず、エラーが発生します.つまり、反復器は、動作中に反復されたオブジェクトが変更されることは許されません.例えば、iは0から10サイクル、jはi+1から10をとり、i+jが5より大きい場合、iは現在のjにジャンプし、後のサイクルを行う(どのように説明すればいいか分からないので、コードを直接見ましょう/(ㄒoㄒ)/~~~).forループで書くと:
実行結果:
運転結果からiは変動していないことがわかる.
List,Setなどは動的,可変オブジェクト数のデータ構造であるが,反復器は一方向に可変ではなく,順序読み取りのみ可能で,逆順操作ができないデータ構造であり,反復器が指す元のデータが変化すると,反復器自体が方向を見失う.そのため、whileサイクルを変更することができます.
実行結果:
この時、私たちが望んでいる効果が得られました.
注意すべきは、whileサイクルの実行効率がforサイクルよりも低いため、時間がかかることです.
pythonでは、forループは反復器(Iterator)に相当し、ループ体でループ変数の値を変更することはループ回数に影響しません.反復器は独立したスレッドで動作し、mutexロックを有する.反復器が作成されると、メモリインデックステーブル(単一チェーンテーブル)が作成され、このインデックステーブルは元のオブジェクトを指し、元のオブジェクトの数が変更されると、このインデックステーブルの内容は同期的に変更されないため、インデックスポインタが下に移動すると反復するオブジェクトが見つからず、エラーが発生します.つまり、反復器は、動作中に反復されたオブジェクトが変更されることは許されません.例えば、iは0から10サイクル、jはi+1から10をとり、i+jが5より大きい場合、iは現在のjにジャンプし、後のサイクルを行う(どのように説明すればいいか分からないので、コードを直接見ましょう/(ㄒoㄒ)/~~~).forループで書くと:
print("when we use 'for':")
for i in range(10):
print('i:',i)
for j in range(i+1,10):
print('\tj=',j)
if i+j<5:
j=j+1
continue
else:
i=j
break
実行結果:
when we use 'for':
i: 0
j= 1
j= 2
j= 3
j= 4
j= 5
i: 1
j= 2
j= 3
j= 4
i: 2
j= 3
i: 3
j= 4
i: 4
j= 5
i: 5
j= 6
i: 6
j= 7
i: 7
j= 8
i: 8
j= 9
i: 9
運転結果からiは変動していないことがわかる.
List,Setなどは動的,可変オブジェクト数のデータ構造であるが,反復器は一方向に可変ではなく,順序読み取りのみ可能で,逆順操作ができないデータ構造であり,反復器が指す元のデータが変化すると,反復器自体が方向を見失う.そのため、whileサイクルを変更することができます.
print("
when we use 'while':")
i=0
while i < 10:
print('i:',i)
j=i+1
while j < 10:
print('\tj=',j)
if i+j<5:
j=j+1
continue
else:
i=j
break
i=i+1
実行結果:
when we use 'while':
i: 0
j= 1
j= 2
j= 3
j= 4
j= 5
i: 6
j= 7
i: 8
j= 9
この時、私たちが望んでいる効果が得られました.
注意すべきは、whileサイクルの実行効率がforサイクルよりも低いため、時間がかかることです.