Pythonで線形探索をおこなうプログラムを作成します。
プログラムはGoogl Colabで作成します。次のリンクから開いて新しいノートブック「ip0208」を作成しましょう。
今回のプログラムは以下の関数・メソッドの作成、利用を行います。
| 関数(メソッド)名 | 種類 | 説明 |
|---|---|---|
| generate_array(size, low, high) | ユーザー定義 | 重複無しで、要素数size個のランダムなデータを作成する。データの値はlow~highまでの範囲で作成する。 |
| random.sample | ライブラリ | 重複の無い乱数を作成する。プログラムの先頭に「import random」を記述することで利用することが可能。 |
| int | 組み込み | 値を整数に変換する。 |
| input | 組み込み | キーボードからデータを入力する。入力された値はすべて文字として入力される。 |
| len | ライブラリ | 配列の要素数を返す。例えば配列dataの要素数が10の場合、len(data)は10を表す。 |
上記の関数は、線形探索の処理とは直接関係ありません。キーボードからデータを入力したり、配列に任意のデータを作成するために利用します。
メソッド:メソッドとは、Pythonで用意された部品(クラス)の機能のこと。呼び出すことで機能を利用することができます。
種類:関数にはプログラマが独自で作成したユーザ関数とあらかじめPythonのシステムが用意した組み込み関数の2種類があります。
今回作成するPythonプログラムのフローチャートを確認します。線形探索を行う部分は前のスライドと一緒ですが、配列の作成、探索値のキーボード入力などの違いがあります。
① data = generate_array
配列(リスト)を作成し、変数dataに代入します。
配列の作成は、Pythonプログラム内で作成したユーザー関数「generate_array関数」を使い作成します。
配列指定個数分、重複無しでランダムな値が格納されます。
関数の使い方
generate_array(作成する要素数,値の最小値,値の最大値)
例:data = generate_array(20 , 1, 100)
説明:20個の要素を持つ配列(リスト)を作成する。値は1~100までの中でランダムに格納される。
② 作成したdataの表示
作成したデータを表示します。
作成した値がランダムに決まるため、どのような値があるかを確認するために表示します。
③ キーボードからtargetへ入力
キーボードから探索する値を入力し、変数targetに代入します。
実行のたびに自由に値を入れられるようになります。
上記フローチャートをPythonプログラムで作成すると次のようになります。
import random
# 配列をランダムに生成する関数
def generate_array(size=10, low=1, high=100):
"""
ランダムな整数の配列を生成する
size : 要素数
low : 最小値
high : 最大値
"""
return random.sample(range(low, high+1), size) # 重複なし
# ===== メイン処理 =====
# ランダムに配列を作成
data = generate_array(20, 1, 100)
print("探索対象データ:", data)
# 探す値を入力
target = int(input("探す値を入力してください: "))
# フラグと位置変数
found_flag = False
i = 0
# フラグを条件に使った線形探索
while (a):
if data[i] == target:
found_flag = True
else:
i = i + 1
# 結果表示
if (b):
print("見つかりました。")
else:
print("見つかりませんでした。")
前回「関数」を学習しました。今回も「def」で記述されている「generate_array」は関数です。
関数は、プログラムから呼ばれることで実行されます。今回のプログラムは、コメント「メイン処理」の下にある16行目からプログラムが始まります。
本当だ。16行目は配列を作っているところだけれど、フローチャートの最初と一緒ですね。
16行目からはPythonとフローチャートは一緒みたいですね。
はい、そうです。ただし、これまでと違って繰り返し処理はfor文ではなくwhile文を使っています。
while文では、添字変数 i は勝手に増えたりしないので、24行目の初期値を代入したり、31行目の1加算する処理をすることで、添字の値を繰り返すたびに更新しています。