データ作成や取得あれこれ-range関数他

記事の内容

 この記事では、実用的なプログラムにおけるデータの作成や取得にどのような方法があるか紹介します。for文の記事で紹介したサンプルプログラムのように、データをいちいち手入力するのはあまり実用的とはいえませんよね。

***わからない用語があるときは索引ページへ***

1.range関数を使う

 range関数は、整数の(等差)数列を自動で作成する関数です。

range(start, stop,step)

の形式で記述し、

(1)stepが正の数の場合、start以上、stop未満の整数が、stepごとに昇順に並んだ、イテラブルなオブジェクトを返します。
(2)stepが負の数の場合、start以下、stopより大きい数が、stepごとに降順にならんだ、イテラブルなオブジェクトを返します。

 規則的な数値データでループ処理する場合は、range関数を使うと簡単にサイズの大きなオブジェクトを作成できます。
 まずは使い方をみてみましょう。
---以下、補足---
 range関数で作成された整数列は、python2ではリストオブジェクトとして、python3ではrangeオブジェクトというイテラブルなオブジェクトとして返されます。rangeオブジェクトは、整数要素しかもてない、リストのようにメソッドが使えない、の制約がある代わりに、リストよりもメモリの消費を小さくできます。
---補足ここまで---

引数を1つ指定する
 引数を1つだけ指定した場合、引数はstopに渡されます。startは0、stepは1にセットされますので、0以上、stop未満の整数列が返されます。
---以下、補足---
 print文で最後にend='<データ>'を指定すると、指定した引数を出力した後に、endで指定したデータを出力します。何も指定しない場合は改行("\n")が出力されます。ここでは、空文字('')を指定したので、引数を出力した後に改行されなくなります。
---補足ここまで---

##引数を1つだけ指定した場合は、start=0, step=1
for i in range(5):
   print(i, " ", end='')

 出力結果

0  1  2  3  4  


引数を2つ指定する
 引数を2つ指定した場合、最初の引数はstartに、2つめの引数はstopに渡されます。stepは1にセットされますので、start以上、stop未満の整数列が返されます。

for i in range(5, 10):
       print(i, " ", end='')

出力結果

5  6  7  8  9


引数を3つ指定、stepに正の整数を指定
 stepが正の数の場合、start以上、stop未満の整数が、stepごとに昇順に並んだ数列を返します。この場合、start < stopである必要があります。start < stopでない場合、空のオブジェクトが返されます。

for i in range(1, 10, 2):
       print(i, " ", end='')

出力結果

1  3  5  7  9  


引数を3つ指定、stepに負の整数を指定
 stepが負の数の場合、start以下、stopより大きい数が、stepごとに降順にならんだ、イテラブルなオブジェクトを返します。
 stepに負の数を渡す場合、要素は降順に並びます。この場合、start > stopである必要があります。start > stopでない場合、空のオブジェクトが返されます。

for i in range(10, 1, -2):
       print(i, " ", end='')

出力結果

10  8  6  4  2  


range関数を使って任意の数列を生成
 計算式を併用すると、項を一般式で表せる任意の数列を自動で作成できます。下記の例では、初項1, 公比2の等比数列を11個出力しています。

for n in range(11):
   a = 1
   r = 2
   an = a * r  ** n
   
   print("a" + str(n) + " =", an, end=', ')

出力結果

a0 = 1, a1 = 2, a2 = 4, a3 = 8, a4 = 16, a5 = 32, a6 = 64, a7 = 128, a8 = 256, a9 = 512, 


range関数とrandomオブジェクトを使って乱数列を生成
 range関数とrandomオブジェクトを組み合わせて乱数列を作成することができます。統計シミュレーションをしたいときに便利です。

import random

##seedを設定。
##seedを指定しない場合、seedは0に自動設定される。
##seedが同じの場合、同じ乱数列が出力されるので要注意。
##ただし、出力できる乱数列の数に制限はない。
random.seed(1.5)
for i in range(10):
   rnd_num = random.random()
   print("r" + str(i) + "=", rnd_num)

 この事例では0位上1未満の一様乱数を生成するrandomメソッドを使っていますが、正規分布や指数分布など、他の統計分布の乱数を生成するメソッドも利用できます。詳しくはPythonの公式ドキュメントをご覧ください。
 randomオブジェクトは組み込みオブジェクトではないので、呼び出す前にimport文でプログラムに取り込む必要があります。
出力結果

r0= 0.13436424411240122
r1= 0.8474337369372327
r2= 0.763774618976614
r3= 0.2550690257394217
r4= 0.49543508709194095
r5= 0.4494910647887381
r6= 0.651592972722763
r7= 0.7887233511355132
r8= 0.0938595867742349
r9= 0.02834747652200631


2.エクセルやデータベースなどのアプリケーションからデータを読み込む

 Pythonでは、Excelやリレーショナルデータベース(SQLite, MySQL, postgresql他)などの外部のアプリケーションからイテラブルなオブジェクトにデータを読み込むことができます。
 少し基礎知識が必要になるので、具体的なプログラミングの方法についてはまた別の記事で少しずつ説明します。

3.ネットスクレイピング

 インターネットのwebサイトにアクセスしてwebコンテンツから必要なデータだけを抜き出すことをスクレイピングといいます。
 株価、競馬のレース結果、こういうのしか思いつきませんが、webで公開されているデータであれば何でもスクレイピングしてデータを読み込むことができます。
 これも少し基礎知識が必要になるので、具体的なプログラミングの方法についてはまた別の記事で少しずつ説明します。

4.zip関数を使う

 zip関数を使うと、複数のイテラブルなオブジェクトを同時にfor文でループ処理することができます。

zip(iterable1, iterable2, •••)

 まずは、使い方を見ていましょう。複数のイテラブルオブジェクトの要素を、1つのfor文でループ処理することができます。

list0 = [0, 2, 4, 6, 8]
list1 = [1, 3, 5, 7, 9]

for gusu, kisu in zip(list0, list1):
   print(gusu, "は偶数です")
   print(kisu, "は奇数です")

print("\n")

出力結果

0 は偶数です
1 は奇数です
2 は偶数です
3 は奇数です
4 は偶数です
5 は奇数です
6 は偶数です
7 は奇数です
8 は偶数です
9 は奇数です


 zip()関数の引数となる各イテラブルオブジェクトの要素数が異なる場合は、最も要素数の少ないオブジェクトに合わせ、それより後ろの要素は切り捨てられます

list0 = [0, 2, 4]
list1 = [1, 3, 5, 7, 9]

for gusu, kisu in zip(list0, list1):
   print(gusu, "は偶数です")
   print(kisu, "は奇数です")

出力結果

0 は偶数です
1 は奇数です
2 は偶数です
3 は奇数です
4 は偶数です
5 は奇数です

 参考までに、zip関数を使ったfor文の動きの詳細を説明します。
 zip関数の戻り値は、イテラブルなオブジェクト(zipオブジェクト)であり、各要素はタプルオブジェクトになっています。
 for文のin演算子を使った変数の代入方法は、タプルの記事で説明した、タプルの要素をそれぞれの変数にばらして代入するときと同じような動きになっています。

list0 = [0, 2, 4, 6, 8]
list1 = [1, 3, 5, 7, 9]

for zip_elem in zip(list0, list1):
   print(zip_elem, end=', ')

出力

(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), 


前の記事 次の記事



この記事が気に入ったらサポートをしてみませんか?