0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python 条件式を使用してカウンタが最大値になったら初期値に戻す処理で失敗した話

Posted at

はじめに

よくあると思われるカウンタの制御で値が最大値になったら初期値に戻すよくありそうなやつ。
以下のような処理を条件式(三項演算子)で書こうとしたら、
うまく動かなかったので戒めメモします。

sandbox.py
MAX_VALUE = 5
cnt_a = 0
list_a = []

for _ in range(10):
    if cnt_a < ( MAX_VALUE - 1 ):
        cnt_a += 1
    else:
        cnt_a = 0
    list_a.append(cnt_a)

print(list_a)
実行結果
[1, 2, 3, 4, 0, 1, 2, 3, 4, 0]

勘違いしていた書き方

初めは以下のような書き方をしていました。
しかし、カウンタは0に戻すことができませんでした。

sandbox.py
MAX_VALUE = 5
cnt_b = 0
list_b = []

for _ in range(10):
    cnt_b += 1 if cnt_b < (MAX_VALUE - 1) else 0
    list_b.append(cnt_b)
print(list_b)
実行結果
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4]

ぱっと見てみると、想定している動きをしそうですが、
cnt_bに対して0を足すような動きになっているんですね。

書き直したやり方

色々動きを試してみたのですが、
以下の書き方ならできそうです。

sandbox
MAX_VALUE = 5
cnt_c = 0
list_c = []

for _ in range(10):
    cnt_c = cnt_c + 1 if cnt_c < (MAX_VALUE - 1) else 0
    list_c.append(cnt_c)

print(list_c)
実行結果
[1, 2, 3, 4, 0, 1, 2, 3, 4, 0]

3つ同時に動かす

sandbox.py
MAX_VALUE = 5
cnt_a = 0
list_a = []
cnt_b = 0
list_b = []
cnt_c = 0
list_c = []

for _ in range(10):
    if cnt_a < ( MAX_VALUE - 1 ):
        cnt_a += 1
    else:
        cnt_a = 0

    cnt_b += 1 if cnt_b < (MAX_VALUE - 1) else 0

    cnt_c = cnt_c + 1 if cnt_c < (MAX_VALUE - 1) else 0

    list_a.append(cnt_a)
    list_b.append(cnt_b)
    list_c.append(cnt_c)

print('a',list_a,sep=':')
print('b',list_b,sep=':')
print('c',list_c,sep=':')
実行結果
a:[1, 2, 3, 4, 0, 1, 2, 3, 4, 0]
b:[1, 2, 3, 4, 4, 4, 4, 4, 4, 4]
c:[1, 2, 3, 4, 0, 1, 2, 3, 4, 0]
0
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?