Pythonにはインクリメントを行う++演算子やデクリメントを行う--演算子はない。累算代入文やrange関数、enumerate関数などを使い1ずつ増加/減少する値を取り扱う方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
* 本稿は2023年2月21日に公開された記事をPython 3.12.2で動作確認したものです(確認日:2024年3月1日)。
# 代入文/累算代入文
x = 100
x += 1 # インクリメント(累算代入文)
print(f'{x=}') # x=101
x = x + 1 # インクリメント(代入文)
print(f'{x=}') # x=102
x = x - 1 # デクリメント(代入文)
print(f'{x=}') # x=101
x -= 1 # デクリメント(累算代入文)
print(f'{x=}') # x=100
# 指定した範囲を1ずつインクリメント/デクリメント
result = ''
for x in range(5):
result += f'{x} ' # xの値は0、1、2、3、4と1ずつインクリメントされる
print(result) # 0 1 2 3 4
result = ''
for x in range(5, 10): # 5〜9の範囲の整数を順に得る
result += f'{x} '
print(result) # 5 6 7 8 9
result = ''
for x in range(4, -1, -1): # デクリメント
result += f'{x} '
print(result) # 4 3 2 1 0
# リストの要素とインデックスが必要なとき
mylist = list(range(5))
mylist.reverse()
print(mylist) # [4, 3, 2, 1, 0]
for idx, item in enumerate(mylist):
print(f'{idx}: {item}')
# 出力結果:
#0: 4
#1: 3
#2: 2
#3: 1
#4: 0
Pythonには変数の値をインクリメントする(1つ増加させる)ための++演算子や、変数の値をデクリメントする(1つ減少させる)ための--演算子はない。そのため、「x++」や「--x」のような書き方はできない。変数の値を1つ増減させるには以下のようなやり方がある。
それぞれについて以下で簡単に見ていこう。
変数xの値をインクリメントする(1つ増加させる)には「x = x + 1」という代入文か「x += 1」という累算代入文を使用できる。累算代入文は「+=」「-=」「*=」などの演算子を使用して、左辺の変数(など代入可能なもの)と右辺の式を用いた2項演算を行い(+=演算子なら2項の加算演算)、その結果を左辺の変数に代入するものだ。「x = x + 1」という代入文は、累算代入文を使うと「x += 1」のように書ける。
以下に例を示す。
# 代入文/累算代入文
x = 100
x += 1 # インクリメント(累算代入文)
print(f'{x=}') # x=101
x = x + 1 # インクリメント(代入文)
print(f'{x=}') # x=102
x = x - 1 # デクリメント(代入文)
print(f'{x=}') # x=101
x -= 1 # デクリメント(累算代入文)
print(f'{x=}') # x=100
「0、1、2、3、4」のように、特定の範囲で1ずつ変化する値を得る必要があるときにはrange関数が使える。これは指定した初期値/最終値/差分で表される等差数列を反復するrangeオブジェクトを作成する。特に初期値が0でよいときには、range関数に最終値を与えるだけでよい。注意が必要なのは、最後に得られる値はrange関数に渡した最終値よりも1つ小さな値となる点だ。つまり、range(5)は0、1、2、3、4という数値を順に返すrangeオブジェクトを作成する。
以下に例を示す。
result = ''
for x in range(5):
result += f'{x} ' # xの値は0、1、2、3、4と1ずつインクリメントされる
print(result) # 0 1 2 3 4
この例では「range(5)」としているので、このrangeオブジェクトは0、1、2、3、4という数値を順に返送する。
初期値が0でないときには、初期値と最終値を指定する必要がある(差分を省略すると1を指定したものと見なされる。つまり、初期値から最終値−1まで1ずつインクリメントされた値が得られる)。以下に例を示す。
result = ''
for x in range(5, 10): # 5〜9の範囲の整数を順に得る
result += f'{x} '
print(result) # 5 6 7 8 9
この例では初期値に5、最終値に10を指定しているので、5から9まで1ずつインクリメントされた値を反復するrangeオブジェクトが得られる。
デクリメントするときには、初期値/最終値/差分の3つを指定する。このとき最終値よりも1だけ大きな値までが反復されることには注意しよう。つまり、初期値に4、最終値に0、差分に−1を指定すると、4、3、2、1の4つの値を反復するrangeオブジェクトが作成される。0までの値を反復したければ、最終値には−1を指定する必要がある。
以下に例を示す。
result = ''
for x in range(4, -1, -1): # デクリメント
result += f'{x} '
print(result) # 4 3 2 1 0
なお、range関数にこのように指定するよりもreversed関数を使って、以下のように記述してもよい。reversed関数は引数に指定した反復可能オブジェクトの要素を逆順に取り出すのに使える。
result = ''
for x in reversed(range(5)):
result += f'{x} '
print(result) # 4 3 2 1 0
リストなどの反復可能オブジェクトの要素とそれらに対応して1ずつ変化するインデックスが必要なときにはenumerate関数が使える。
例えば、以下のコードを考えよう。
mylist = list(range(5))
mylist.reverse()
print(mylist) # [4, 3, 2, 1, 0]
このリストの要素とインデックスを同時に取り扱いたい場合、次のようなコードを書くことが考えられる。
length = len(mylist)
for idx in range(length):
print(f'{idx}: {mylist[idx]}')
このコードではリストの要素数を得て、上述のrange関数と組み合わせて、そのインデックスを反復し、リストの要素にアクセスをしている。しかし、Pythonではこうした書き方はせずにenumerate関数を使用する。
enumerate関数に反復可能オブジェクトを渡すと、そのインデックスと対応する要素を先頭から反復するイテレータが得られる。
enumerate関数を使って上のコードを書き直したものを以下に示す。
mylist = list(range(5))
mylist.reverse()
print(mylist) # [4, 3, 2, 1, 0]
for idx, item in enumerate(mylist):
print(f'{idx}: {item}')
# 出力結果:
#0: 4
#1: 3
#2: 2
#3: 1
#4: 0
Copyright© Digital Advantage Corp. All Rights Reserved.