IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes 

第71回 Pythonのインデックスの考えと、ループ処理を簡単にするenumerate() (菱沼佑香) 2025年12月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

前回から6章「パイソニックなコードを書こう」に入り、PythonicとThe Zen of Pythonについて学びました。今回はPythonのインデックスに対する他言語出身者との感覚の違いと、ループ処理を簡単にするenumerate()関数について学びたいと思います。

インデントの存在感

今回は「6.2 インデント愛を伝えたい」という項目からスタートします。まずは引用から。

------------------------------------
P.95 6.2 インデント愛を伝えたい
他の言語から来たプログラマーがPythonに対して抱く懸念で一番多いのは、インデントが重要な意味を持つこと(キチンとスペースを入れることと誤解されることが多い)が気持ち悪いというものです。Pythonでは、コードの行等にあるインデント数は、どの行が同じコードブロックの中にあるかを意味しています。
他の言語ではブロックの最初と最後を中括弧{}で囲んでいるので、Pythonのコードブロックをインデントでまとめるのは奇妙に思えるのかもしれません。
------------------------------------

個人的にインデントに愛を覚えたことはないのでタイトルについてはなんともですが。
私はPythonが初めてしっかりとプログラム言語を学んだと言える言語(習熟度は別として...)ですが、たまに他の言語のプログラムを見る機会があります。見ていると、「ここから始まった中括弧はどこで終わってるんですかね...」と追うのがおっくう...と思ってしまうのですが、むしろ他言語の方からすると中括弧がないことが落ち着かないんだそうです。これは他の言語はブロックを{} や begin ... endといった、見える形で囲う文化があること、そしてインデントはあくまで読みやすくするための飾りという扱いが影響しているんだとか。
一方で、Pythonは、インデントでブロックを決め、インデントが崩れるとすぐにエラーになります。そのため、他の言語を習得されてからPythonに触れる場合、コピペでインデントが崩れればエラーになるという、見えない境界線がストレスになるんだとか。

一度覚えた文化や慣習はなかなか抜けないと言いますし、慣れるまでは仕方ないんだろうなと思います。ただ、他言語をすでに習得されているだけあって、慣れてしまえばあっという間に習得できるそうなので、やっぱりプロはすごいなあと思います。

enumerate()でループ処理を簡単に

さて次の項目へ。よくある誤用の例とお勧めするコードの書き方です。

------------------------------------
P.96 6.3.1 range()ではなくenumerate()を使う
リスト等の連続するデータに対するループを処理するとき、プログラマーの中にはrange()やlen()関数を使って0からデータの長さ未満のインデックスを生成する人がいます。このようなforループでは、(インデックスとして)iという変数名を使うのが一般的です。
(中略)
この書き方の代わりに、リスト等を組み込みのenumerate()関数に渡すと、インデックスを表す整数とそのインデックスの項目が返されます。
(中略)
range(len())の代わりにenumerate()を使うと、書くコードがすっきりします。インデックスではなく項目だけが必要な場合は、直接リストを走査することもできます。
昔ながらのrange(len())を使うよりも、enumerate()を呼び出して直接リストを走査する方が望ましいです。
------------------------------------

初心者向けの書籍で学習しているとenumerate()はなかなか出てこないと思います。私自身、何冊かの初心者向け書籍を読みましたが、range()やlen()を使い、forループを行う処理の説明が中心でした。

enumerate()は組み込み関数で、importなしで使用できます。イテラブル(リスト、タプル、文字列など)に対してインデックスと要素をペアにして返すことができるものです。書式はenumerate(イテラブル, start=0)です。startを省略した場合は0からスタートしますが、1からスタートしたい場合には開始値に1を指定すると1から始まります。

ではここから書籍にあるサンプルコードを見ていきます。
例えば、range()とlen()を使う場合は次のように記述します。

fig01

同じ処理をenumerate()関数を使って行う場合は次のように書くことができます。

fig02

すっきりしますし、意味さえ知っていればわかりやすいですね。
これが初心者向けの本に出てこない理由としては、前提知識(イテラブル、for文の仕組み、タプル、アンパック、インデックスの概念)を知っておく必要があるからだそうです。まずは基本的な部分を学ぶために後回しにされているようですね。
とはいえ、別に玄人向けの関数というわけではなく、コードをシンプルにできて、可読性や保守性が高められる便利な関数なのでどんどん使っていくといいものです。

ちなみにインデックス番号が必要ない場合は次のように書けます。

fig03

それでは今回はこちらで終了です。
今回もお付き合いいただきありがとうございました。

 

 [IT研修]注目キーワード   Python  Power Platform  最新技術動向  生成AI  Docker  Kubernetes