web-dev-qa-db-ja.com

python 3でforループ内からイテレータをインクリメントする方法

for i in range (0, 81):
    output = send command
    while True:
        last_byte = last_byte - offset
    if last_byte > offset:
       output = send command
       i+
    else:
        output = send command
        i+
        break

Sendコマンドが実行されるたびに反復子を増やしたい。現在、forループが実行されたときに1だけ増加します。お知らせ下さい

for i in range(0,10):
    print(i)
    i +=2
    print("increased i", i)

このコードを実行すると、0〜9で生成されました。反復子が2増えると予想していました。

12
ilaunchpad

イテレータのコピーを名前付きオブジェクトとして保存します。その後、必要に応じてスキップできます。

>>> myiter = iter(range(0, 10))
>>> for i in myiter:
    print(i)
    next(myiter, None)
...
0
2
4
6
8
12
Matt Anderson

forループ内ではできません。ループが再開されるたびに、変数iが再割り当てされるため(ループ内で変数を変更した後でも)、再割り当てされた変数を増やすだけです。そのようなことをしたい場合は、whileループを使用して、スローアウェイ変数を手動で増やした方が良いでしょう。

_>>> i=0
>>> while i< 10 :
...     print(i)
...     i +=2
...     print("increased i", i)
... 
0
('increased i', 2)
2
('increased i', 4)
4
('increased i', 6)
6
('increased i', 8)
8
('increased i', 10)
_

それに加えて、特定の条件に基づいてではなく期間で変数を増やしたい場合は、適切なスライサーを使用して、ループしている反復可能オブジェクトをスライスできます。

たとえば、イテレータがある場合は、itertools.islice()を使用できます。リストがある場合は、インデックス付け中にステップを使用できます(_my_list[start:end:step]_)。

5
Kasramvd

range() には、ステップを指定するオプションの3番目のパラメーターがあります。それを使用して、カウンターを2ずつ増やします。例えば:

for i in range(0, 10, 2):
    print(i)
    print("increased i", i)

通常の変数のようにiをインクリメントできない理由は、forループが実行を開始すると、リスト(またはPython 3+)の範囲オブジェクト)が作成されるためです。 、およびiは、単にそのオブジェクトの各値を増分的に表します。

2
pzp

@ilaunchpad申し訳ありませんが、これを投稿するには遅すぎますが、ここにあなたが探していたものがあります

i=0
for J    in range(0,10):
    print(i)
    i = i + 2
print("increased i", i)

Forステートメント全体で同じ変数を使用しないでください。

Output
vaibhav@vaibhav-Lenovo-G570:~$ python3 /home/vaibhav/Desktop/Python/pattern_test.py
0
2
4
6
8
10
12
14
16
18
increased i 20
1
user7422128