Pythonロボティクスコース レッスン 5

Pythonであつかうオブジェクトの基本を学ぼう

このレッスンで学ぶこと

Pythonは「オブジェクト指向」と言われるプログラミング言語の1つです。このレッスンではその中心となる「オブジェクト(Object)」について、その基本を学習します。レッスンの最後では、オブジェクトの機能を使って、Studuino:bitのLEDディスプレイを利用した電子ウェルカムボードを作成します。

Pythonのオブジェクト

プログラミングにおける「オブジェクト」 とは、プログラム上の変数や関数をひとまとめにしたデータを表します。Pythonでは、数値も文字列も含めて、様々なデータを全てオブジェクトとして扱います。オブジェクトにおける変数を「プロパティ」、関数を「メソッド」と呼びます。オブジェクトは現実の世界にあるものに例えると理解しやすいため、ここからは、オブジェクトを「人」に例えて、プロパティとメソッドのそれぞれの役割について見ていきます。

2. 1 オブジェクトのプロパティ

プロパティは、日本語では属性情報と訳され、オブジェクトの性質を表す要素となります。例えば、人は「名前」「年齢」「性別」「住所」といった属性情報を持っています。同じように、ひとつひとつのPythonのオブジェクトも、それぞれ固有のプロパティを持っています。コンピュータ上で扱う図や写真などの画像データがもつ「高さ」や「幅」、「色」、「撮影日」などの要素がこれにあたります。

2. 2 オブジェクトのメソッド

メソッドは、日本語では振る舞いと訳され、オブジェクトがもつ働きを表します。例えば、人は「食べる」「寝る」「話す」といった振る舞い(行動)をします。同じようにPythonのオブジェクトも、様々な機能を実行するメソッドを持っています。コンピュータ上で画像データを扱うときに、「画像を加工する(切り抜き・明るさ調整・サイズ変更など)」、「加工した画像を保存する」といった機能がまさにメソッドになります。

■ メソッドと関数の違い

「メソッド」と「関数」は役割としては非常に似ていますが、呼び出し時の書き方に次のような違いがあります。

まず、これまでに出てきたprint() やint()などの「関数」は、以下のように記述するものでした。

関数名(引数1, 引数2, ...)

それに対して、「メソッド」は以下のように記述します。

オブジェクト名.メソッド名(引数1, 引数2, ...)

2. 3 オブジェクト思考のプログラミング

「プロパティ」や「メソッド」をはじめとするオブジェクトの特徴を使ってプログラミング行うことを「オブジェクト指向プログラミング」と言います。オブジェクト指向プログラミングには、他にも「継承」や「カプセル化」、「ポリモーフィズム」などの重要な概念があります。これらは、学習を進めて行く中で少しずつ説明をしていきますので、今の段階では「オブジェクトはプロパティとメソッドを持っている」とだけ理解しておきましょう。

文字列のメソッドを使う

Pythonのデータはすべてオブジェクトということを説明しましたが、数値や文字列も、もちろんオブジェクトであり、複数のメソッドを持っています。ここでは、文字列のメソッドの中で使いやすいものを、いくつかピックアップして紹介します。それぞれにどのようなメソッドが用意されているのか詳しく知りたい場合は、少し難しいですが下記のドキュメントを読んでください。

数値型 – Python 3.6 ドキュメント

文字列型 – Python 3.6 ドキュメント

3. 1 英字を大文字・小文字に相互変換するメソッド

半角英字の大文字を小文字にするには、lower()メソッドを使います。反対に、小文字を大文字にするには、upper()メソッドを使います。それぞれのメソッドを使用した以下のコードをエディタエリアに書いて実行してみましょう。

【サンプルコード 3-1-1】
  1. text = ‘Python’
  2. low = text.lower()
  3. up = text.upper()
  4. print(low)
  5. print(up)
  6. print(text)

このプログラムを実行すると、次のようにターミナルに結果が表示されます。

python
PYTHON
Python

lower()メソッドやupper()メソッドは、文字列オブジェクトの「text」が持っている文字列データ「'Python'」に対して「小文字にする」「大文字にする」という命令を実行しています。そのため、標準関数のprint()のように引数として、処理の対象となる文字列を指定する必要はありません。

また、これら2つのメソッドは大文字や小文字に置き換わった文字列が戻り値となります。このとき、オブジェクトが元々持っている文字列データが変換後のデータに置き換えられることはありません。そのため、最後に実行した「print(text)」の結果は「Python」と初めに代入した文字列のままになっています。

このようにメソッドを呼び出しただけでは、中身のデータが上書きされないメソッドのことを非破壊的メソッドといいます。他にも、英文の中にある単語ひとつひとつの先頭文字だけを大文字にするtitle()メソッドや、英文の最初の文字だけを大文字にするcapitalize()メソッドも非破壊的メソッドです。

もし、textが持っている文字列のデータを上書きしたい場合は次のように、演算子「=」を使い、メソッドの戻り値を再び代入します。

text = text.lower()

3. 2 文字列に含まれる文字列を検索するメソッド

文字列の中に特定の文字列が入っているかを検索するには、find()メソッドを使います。このメソッドの引数に検索したい文字列を指定すると、その文字列が最初に出てくる場所を「先頭から〇文字目」を表す整数値で返してきます。

実際に次のコードを書いて実行結果を確認しましょう。

【サンプルコード 3-2-1】
  1. text = ‘tomato’
  2. print(text.find(‘a’))
  3. print(text.find(‘o’))
  4. print(text.find(‘p’))
(実行結果)

3
1
-1

1番目から数えると、始めに「a」が出てくるのは「4番目」ですが、Pythonの場合はスタートを「0番目」から数えるため、結果は1少ない「3」になっています。「o」のように文字列の中に2つ以上その文字が含まれる場合は、先頭から検索して先に見つかった方の番号(ここでは「1」)が返されます。また、このメソッドでは、文字列が見つからなかった場合は「-1」が戻るようになっています。

他にも、「探したい文字列が何個存在するか」を調べたい場合は count()メソッドが使えます。同じく検索したい文字列を引数に指定すると、その文字列が出てくる回数が戻ります。

【サンプルコード 3-2-2】
  1. text = ‘tomato’
  2. print(text.count(‘o’))
(実行結果)

2

3. 3 特定の文字列を別の文字列に置き換えるメソッド

文字列を置き換えたい場合はreplace()メソッドを使います。このメソッドには、「置換したい文字列」と「置換後の文字列」の2つの引数が必要です。このように複数の引数を指定する場合は、引数の間を「,(カンマ)」で区切ります。

文字列オブジェクト.replace(置換したい文字列, 置換後の文字列)

replace()メソッドは1つめの引数に置換したい文字列を、2つめに置換後の文字列を指定します。戻り値は置き換わったあとの文字列となりますが、これも非破壊的メソッドであるため、上書きする場合は演算子「=」で戻り値を代入しなければなりません。次の例は文字列「'sunny'」「'rainy'」 に置き換えています。

  1. text = ‘Today is a sunny day.’
  2. text = text.replace(‘sunny’, ‘rainy’)
  3. print(text)
(実行結果)

‘Today is a rainy day.’

3. 4 文字列をトリムするメソッド

前後の余計な文字(空白や改行記号など)を取り除く処理を「トリム(trim)」と言います。Pythonの文字列には、トリムを行ってくれる便利なstrip()メソッドがあります。strip()メソッドは引数を省略すると、文字列の先頭と末尾から空白文字を削除した文字列が戻ります。

【サンプルコード 3-3-1】
  1. text = ‘ white_space’
  2. print(text)
  3. print(text.strip())
(実行結果)

 white_space
white_space

また、先頭と末尾からのみ探索するため、他の文字との間にある半角文字は削除されません。

【サンプルコード 3-3-2】
  1. text = ‘ w h i t e _ s p a c e’
  2. print(text)
  3. print(text.strip())
(実行結果)

 w h i t e _ s p a c e
w h i t e _ s p a c e

他にも、strip()メソッドは取り除きたい特定の文字列を引数に指定することもできます。

【サンプルコード 3-3-3】
  1. text = ‘****Happy Birthday!!****’
  2. print(text.strip(‘*’))
(実行結果)

Happy Birthday!!

3. 5 文字列の特殊な置換メソッド

複数の人に宛名や一部の文章を除いて同じ内容のメールを送りたいとき、時間を短縮するため、先にその定型文を用意しておくことがあります。

上のメール文の例では、送り先に合わせて名前の{○○}を変更するだけで、簡単にメールの文面が用意できるようになっています。こういった文章の文字列データに対して、format()メソッドを使うと、{○○}の所を指定した文字列で置き換えることができます。

format()メソッドでは、文字列に含まれる「{}」を、引数に指定した文字列に置き換えることができます。また、「{}」が複数含まれる場合は、複数の引数を指定して、先頭から順番に置換することができます。実際に以下のコードを書いて実行してみましょう。

【サンプルコード 3-4-1】
  1. text = ‘{} and {} are {}.’
  2. print(text.format(‘An apple’, ‘an orange’, ‘fruits’))
  3. print(text.format(‘A cat’, ‘a dog’, ‘animals’))
(実行結果)

An apple and an orange are fruits.
A cat and a dog are animals.

課題:Studuino:bitをウェルカムボードとして使う

レッスンの最後にStuduino:bitのLEDディスプレイを利用して、電子ウェルカムボードを作成してみましょう。

4. 1 プログラムの作成

次のプログラムは「Welcom {人の名前}!」というように、Welcomeの後に続けて歓迎する人の名前をLEDディスプレイに表示するようになっています。

【サンプルコード 4-1-1】
  1. from pystubit.board import display
  2.  
  3. message = ‘Welcome {}!’
  4. display.scroll(message.format(‘Takahashi’))
  5. display.scroll(message.format(‘Imai’))
  6. display.scroll(message.format(‘Sakurada’))

Welcomeという共通の言葉があるため、{}を使って定型文を用意し、format()メソッドでそれぞれの人の名前に置き換えています。このプログラムを参考にして、簡単なあいさつやメッセージに続けて人の名前がスクロール表示されるプログラムを自分で考えて作成してみましょう。

おわりに

5. 1 このレッスンのまとめ

このレッスンではPythonの「オブジェクト」について学習しました。これまでのレッスンで使用してきたStuduino:bitのブザーから音を鳴らすbuzzer.on()やLEDディスプレイに文字を表示するdisplay.scroll()もオブジェクトのメソッドです。これらの他にも多くのメソッドが用意されています。一度にすべてを覚えるのは難しいですが、よく使うものから中心に覚えていくようにしましょう。

5. 2 次回のレッスンについて

次回のレッスンでは、プログラムの基本となる「順次」と「反復」の2つの処理について学びます。

TOP