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