[解決!Python]変数の値をインクリメント/デクリメントするには解決!Python

Pythonにはインクリメントを行う++演算子やデクリメントを行う--演算子はない。累算代入文やrange関数、enumerate関数などを使い1ずつ増加/減少する値を取り扱う方法を紹介する。

» 2024年03月01日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

* 本稿は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には++演算子/--演算子はない

 Pythonには変数の値をインクリメントする(1つ増加させる)ための++演算子や、変数の値をデクリメントする(1つ減少させる)ための--演算子はない。そのため、「x++」や「--x」のような書き方はできない。変数の値を1つ増減させるには以下のようなやり方がある。

  • 代入文または累算代入文を使用する
  • 特定の範囲で1ずつ変化する値を使用するにはrange関数を使用する
  • リストの要素と対応するインデックスを反復するにはenumerate関数を使用する

 それぞれについて以下で簡単に見ていこう。

代入文と累算代入文

 変数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



range関数

 「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 



enumerate関数

 リストなどの反復可能オブジェクトの要素とそれらに対応して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



「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。