エンジニアの備忘録

エンジニアの備忘録

元文系出身のエンジニアが、趣味から現場レベルまで様々なIT技術を紹介します。

PythonでAIをつくろう!~練習2:アドレス帳作成~

前回はじゃんけんプログラムの作成を行いました。

 

network-engineer.hatenablog.jp

 

今回はアドレス帳の作成を行っていきます。

クラスというプログラミングに必須の概念を勉強していくので、ぜひ頑張りましょう。

 

 

1.  要件定義をしよう

 では、さっそく作成に移っていきましょう。

今回はアドレス帳なので、情報の紐づけとキーワードによる検索を意識しましょう。

 

①全体の流れを考える

アドレス帳なので、まずは入れ物が必要です。

#アドレス帳そのものを作成する

そして、登録する情報が必要です。

登録したい情報は以下です。

・苗字

・名前

・電話番号

・メールアドレス

・生年月日

#データを登録する

また、登録した情報を検索して表示できるようにしたいです。

 #登録した情報を検索できるようにする

 

これらの流れを簡単にまとめてみましょう。

 

アドレス帳を作る

アドレスに個人情報を追加する

アドレス帳と個人のクラスを作成する

アドレス帳に検索機能を作成する

 

クラスについては次の項目で説明します。

 

②クラス・オブジェクト

 続いて細かい要素の定義を行いますが、その前にクラスについて説明します。

プログラムにおいては「表現力」が非常に重要になります。

ある程度の基本形が利用できるようになると、今度は組み合わせたり自分のオリジナルの関数を作ったりでプログラムを動かす必要があります。

ただプログラムを作成するだけではなく、メンテナンスがしやすく理解がしやすいプログラムを作成することが非常に重要です。

そして、その表現力を実現するための概念が「オブジェクト」「クラス」の2つです。

 

☆オブジェクトとは

オブジェクトはプログラミングにおいて最も多義的に解釈される難しい単語です。

Pythonの公式ドキュメントの内容をようやくしてみます。

 

 「Pythonにおけるオブジェクトとは、データを抽象的に表したものです。Pythonプログラムにおけるデータはすべて、オブジェクトまたはオブジェクト間の関係として表されます。オブジェクトはアイデンティティ値、型、値を持ちます。」

 

※全文はこちら

docs.python.org

 

分かりにくいですが、まとめると以下になります。

 

①データを抽象的に表したもの

オブジェクトは自分に所属する関数を保持することができます。

例えば、文字列について考えていきます。

「test='AbCdEfG'」というデータは文字列です。

この場合、「test」は文字列の型と、「AbCdEfG」という値を所持していることになります。

また、オブジェクトは「.(ドット)」をつけることで保有している関数を利用することができます。

「lower(文字を小文字にする)」や「upper(文字を大文字にする)」を利用する際に、testに対して「.」で呼び出すことができるのです。

f:id:Network_engineer:20210217214746p:plain

 

 

アイデンティティ(ID)、型(Type)、値(Value)の3つを持っていること

ID:データに対して固有の番号が割り当てられる

型:すべてのオブジェクトは型が存在する

値:すべてのオブジェクトは値を所有する

 

☆クラスとは

 クラスとは、オブジェクトでデータを表現するためのテンプレートです。

そして、テンプレートから作成するオブジェクトをインスタンスといいます。

例えば、人間というクラスがあったとします。

構成要素は「性別・年齢・名前・身長・体重・生年月日」です。

このクラスをもとに、田中というインスタンスを作ります。

「男性・25歳・田中・170cm・60kg・10月10日」

同じように、加藤というインスタンスを作ります。

「女性・20歳・加藤・150cm・45kg・9月9日」

このように、クラスを用いればテンプレートとして様々なデータを扱うことができます。

 

③ 要素を考える

 では、実際に要素を考えていきます。

 

アドレス帳を作る

アドレス帳を作るにあたって、アドレス帳自体に登録したり検索したりできる機能がないといけません。

ですので、今回はアドレス帳をクラスとして作成し、中に関数を作成する方式を取ろうと思います。

#アドレス帳のクラスを作成する

 

アドレスに個人情報を追加する

次に、アドレス帳に登録する個人情報について考えます。

今回アドレス帳に登録する情報は「苗字・名前・電話番号・メールアドレス・生年月日」です。

これらの情報を毎回入力するのは非常に手間がかかるので、今回はクラスでテンプレートの作成を行います。

#個人情報のクラスを作成する

 

アドレス帳の機能を用意する

今回必要な機能は、「追加」「表示」「検索」です。

これらを実行できるプログラムを考えていきます。

「追加」については、配列を用意して配列の中に情報を追加していきたいと思います。

そのためには「appned関数」を利用します。

「表示」については、配列の中身を繰り返し表示することですべてのデータを閲覧できるようにします。

「検索」については、配列の中身から条件に一致するものを表示するようにします。

そのためには「in関数」を利用します。

#配列を作成する

#appned関数で配列に追加する

#繰り返しで配列データを表示する

#in関数で条件に一致するデータを表示する

 

これで全体の流れと要素の整理ができました。

続いてコードの作成を行っていきましょう。

2.  設計をしよう

では、実際にコードの作成を行いましょう。

 

①要素をコード化しよう

#配列を作成する

person_list=

こちらはクラスの中に埋め込みます。

 #アドレス帳のクラスを作成する

class AddressBook:

  person_list=
    #アドレス帳に登録された人物一覧

   

  def add(self,person):
    #新規にアドレス帳に人を追加
    pass

※passは外枠をとりあえず作るときに各値です。

関数の中身を作成したら削除します。

  def show_all(self):
    #登録された個人一覧を表示
    pass

  def search(self,keyword):
    #検索条件にマッチする人を表示
    pass

 

 #個人情報のクラスを作成する

class Person:

  firstname=''
  #名前
  lastname=''
  #苗字
  tel=''
  #電話番号
  mail_address=''
  #メールアドレス
  age=''
  #年齢

 

 インスタンスで関数利用するためには「.」を利用します。

 例えば、AddressBookの「add関数」を利用するとします。

クラスを変数で定義すると、クラスに対してオブジェクトを呼び出すことが可能です。

test = AddressBook()

test.add('追加します')

 

②関数を作成しよう

つづいて、クラスの中で利用する関数を作成します。

クラスの中の関数を利用するときは、()の中に「self」を入れます。

これは、クラスの中の自分自身に変数を代入するという意味です。

とりあえずは、クラスではselfを入れると覚えておいてください。

 

#appned関数で配列に追加する

def add(self,person):
  self.person_list.append(person)

#「person_list」に、()の変数を追加する

#繰り返しで配列データを表示する

def show_all(self):
#登録された個人一覧を表示
  for person in self.person_list:
    print(person.lastname + '' + person.firstname)
    #「person_list」の苗字と名前を繰り返し表示

#in関数で条件に一致するデータを表示する

 for person in self.person_list:
  if keyword in person.firstname or keyword in person.lastname:
    print(person.firstname + '' + person.lastname)

     #名前か苗字が含まれていたら表示する

③クラスの中身を確定させる

上記で作成した関数をクラスの中に入れましょう。

 

class AddressBook:

  person_list=[]
  #アドレス帳に登録された人物一覧

  def add(self,person):
    self.person_list.append(person)

  def show_all(self):
  #登録された個人一覧を表示
    for person in self.person_list:
      print(person.lastname + '' + person.firstname)
      #「person_list」の苗字と名前を繰り返し表示
  def search(self,keyword):
  #検索条件にマッチする人を表示
    for person in self.person_list:
      if keyword in person.firstname or keyword in person.lastname:
      print(person.lastname + '' + person.firstname)

 

class Person:

  firstname=''
  #名前
  lastname=''
  #苗字
  tel=''
  #電話番号
  mail_address=''
  #メールアドレス
  age=''
  #年齢

  

3.  プログラムを作成しよう

先ほどのクラスで概ねプログラムは完成しました。

ここからは、実際にアドレス帳を利用する流れを確認します。

 

①変数にクラスを代入する

ab = AddressBook()

#変数に代入する

#クラス名と()でクラスの利用が可能

p = Person()

#変数に代入する

 

②Personクラスを利用してインスタンスを作成する

 今回は以下の3名を追加します。

☆田中 一郎(080-0000-0000)

☆加藤 次郎(080-1111-1111)

☆中村 三郎(080-2222-2222)

 

p = Person()

p.firstname = '一郎'

p.lastname =  '田中'

p.tel = '090-0000-0000'

ab.add(p)

 

p2 = Person()
p2.firstname = '次郎'
p2.lastname = '加藤'
p2.tel = '090-1111-1111'

ab.add(p2)

 

p3 = Person()
p3.firstname = '三郎'
p3.lastname = '中村'
p3.tel = '090-2222-2222'

ab.add(p3)

 

③作成したアドレス帳の機能を利用する

print('---動作確認---')
print('アドレス帳の人数 ->' + 'str(len(ab.person_list))' + '人')

#len関数:指定したオブジェクトの数を数える

#配列のデータ数を数えることで人数を把握する
print('---一覧表示---')
ab.show_all()

#アドレス帳の関数を利用する
print('---検索---')
ab.search(input('検索したい名前を入れてください: '))

#inputで好きな文字を指定してもらい、検索可能にする

 

f:id:Network_engineer:20210221223404p:plain

f:id:Network_engineer:20210221223415p:plain


4.試験をしよう

 では、実際に作成したアドレス帳を実行してみましょう。

今回はデスクトップに「アドレス帳.py」というファイルを作成しました。

実行はコマンドプロンプトから行います。

 

f:id:Network_engineer:20210221224455p:plain

 

 以上で一連の流れが完了しました。

今回はプログラムの中に実行を組み込みましたが、最終的には自分で追加する情報を入力できるのが理想です。

追加機能の実装については別の記事でおまけとして説明します。

 

 次回はいよいよ人工無能の作成を行いたいと思います。

ここまで読んでいただきありがとうございました。