元セブ島在住のエンジニアの僕「Tommy」が、プログラミング・英語・セブ事情を発信するブログ

Tommy's blog

【Python】range配列をfor文で使う【→3つの具体例で理解しやすい】

1月 22, 2020

プログラム学生
Pythonのrangeって関数、どういう時に便利なんですか?
例えば、「日付でこの日からこの日っていう指定があった場合」は、0や1始まりではない途中の数字を扱う場合が多いよね?そのような場合にrangeは便利に使えるよ。例を使って説明するね。
Tommy

この記事で分かること

  • Pythonのrange関数を使うメリットが分かる
  • range関数の具体的な使い方が分かる

Pythonのrange配列をfor文で使う概要

この記事では、Pythonの「range」という関数で作った配列をfor文で使う方法を説明します。「range」は、「数値が連続した配列を作る」という役割を持った関数です。引数を2つ指定した場合には、指定した2つのある整数から整数までを順番に配列(リスト形式)を提供してくれる関数です。

この記事の構成としては、どのような場合に関数「range」が効果的に使われるかが分かるように、3つのプログラムを書いています。それぞれのケースを比較して、関数「range」がどのように使われるかを説明します。

Pythonのrange配列をfor文で使う前提環境

rangeの使い方の説明の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。

もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

Pythonのrange配列をfor文で使うサンプルプログラム

ここでは、2010年から2019年までの年で、それぞれの年の1月1日から12月31日までの期間を表示するプログラムを題材に、合計3つのプログラムを示します。

1つ目と2つ目は関数「range」を使わない比較的非効率なプログラム、3つ目に関数「range」を使ったプログラムを紹介します。

  1. 関数「range」を使わないサンプルプログラム(その1)
  2. 関数「range」を使わないサンプルプログラム(その2)
  3. 関数「range」を使ったサンプルプログラム

1.関数「range」を使わないサンプルプログラム(その1)

サンプルプログラムの作成

2つの日付を表す文字列のリストを準備して、それらを1つずつ取り出しながら、表示していくプログラムです。リストの初期化に書く量が多い為、あまり効率が良いとは言えません。

if __name__ == '__main__':

	start_list = ("2010-01-01","2011-01-01","2012-01-01","2013-01-01","2014-01-01","2015-01-01","2016-01-01","2017-01-01","2018-01-01","2019-01-01")
	end_list = ("2010-12-31","2011-12-31","2012-12-31","2013-12-31","2014-12-31","2015-12-31","2016-12-31","2017-12-31","2018-12-31","2019-12-31")

	for start_day, end_day in zip(start_list,end_list):
		print(start_day + ' ~ ' + end_day)

  1. 変数「start_list」を2010年から2019年までの1月1日の日付で初期化する
  2. 変数「end_list」を2010年から2019年までの12月31日の日付で初期化する
  3. 変数「start_list」と「end_list」をぞれぞれを1つずつ変数「start_day」と「end_day」に入れて繰り返す
  4. 変数「start_day」と「end_day」の内容を表示する

実行結果

表示は下記のようになりました。

$ python test.py
2010-01-01 ~ 2010-12-31
2011-01-01 ~ 2011-12-31
2012-01-01 ~ 2012-12-31
2013-01-01 ~ 2013-12-31
2014-01-01 ~ 2014-12-31
2015-01-01 ~ 2015-12-31
2016-01-01 ~ 2016-12-31
2017-01-01 ~ 2017-12-31
2018-01-01 ~ 2018-12-31
2019-01-01 ~ 2019-12-31

2.関数「range」を使わないサンプルプログラム(その2)

サンプルプログラムの作成

上のサンプルプログラムを今度は、for文の中で、年だけの文字列のリストを回して、表示するように変更してみました。

変化するのは年の年数だけで、それぞれの年の日付は1月1日と12月31日だけなので、日付の部分は固定することができます。

これもfor文の宣言が長くなってしまい、2010年から2019年の文字列を書かなければいけない為、これもあまり効率いいとは言えないプログラムです。

if __name__ == '__main__':

	for year in ("2010","2011","2012","2013","2014","2015","2016","2017","2018","2019"):
		print(year+"-01-01" + ' ~ ' + year+"-12-31")

  1. 2010年から2019年までのを1つずつ変数「year」に入れて繰り返す
  2. 変数「year」の内容を表示する

実行結果

表示は下記のようになり、先ほどのプログラムと同じ結果になりました。

$ python test.py
2010-01-01 ~ 2010-12-31
2011-01-01 ~ 2011-12-31
2012-01-01 ~ 2012-12-31
2013-01-01 ~ 2013-12-31
2014-01-01 ~ 2014-12-31
2015-01-01 ~ 2015-12-31
2016-01-01 ~ 2016-12-31
2017-01-01 ~ 2017-12-31
2018-01-01 ~ 2018-12-31
2019-01-01 ~ 2019-12-31

3.関数「range」を使ったサンプルプログラム

サンプルプログラムの作成

上の2つのサンプルプログラムを、関数「range」を使い、2010から2019までの整数のリストを作成しながら、for文を回し、その整数(年数)を文字列に変換し、表示していくプログラムに変更しました。

また、先程と同様に1月1日と12月31日は固定なので、for文の外で、文字列変数の「start_day」と「end_day」を定義しておきます。1つ目や2つ目のプログラムより年数を文字列で書く量が減り、for文が随分スッキリしました。

if __name__ == '__main__':

	start_day = "-01-01"
	end_day = "-12-31"
	
	for year in range(2010,2020):
		print(str(year)+start_day + ' ~ ' + str(year)+end_day)

  1. 変数「start_day」を文字列「-01-01」で初期化する
  2. 変数「end_day」を文字列「-12-31」で初期化する
  3. rangeを使って2010年から2019年までのを1つずつ変数「year」に入れて繰り返す
  4. 変数「year」「start_day」「end_day」の内容を表示する

実行結果

もちろん、実行結果は、先ほどの2つのプログラムの結果と同じになりました。

$ python test.py
2010-01-01 ~ 2010-12-31
2011-01-01 ~ 2011-12-31
2012-01-01 ~ 2012-12-31
2013-01-01 ~ 2013-12-31
2014-01-01 ~ 2014-12-31
2015-01-01 ~ 2015-12-31
2016-01-01 ~ 2016-12-31
2017-01-01 ~ 2017-12-31
2018-01-01 ~ 2018-12-31
2019-01-01 ~ 2019-12-31