Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

print() と list.append() はなぜ書き方が違うの?Pythonでの関数・メソッドの意味を調べました。

f:id:kenken0326:20200612165747p:plain

nana こんにちは、PyQスタッフnanaです。
PyQでは、日々学習している皆さんからのフィードバックをいただいています(いつもありがとうございます!)。
その中で、「解説に書いているプログラミング用語がそもそもわからない」という内容を多くみかけました。

私も同じくPythonを学習中なのですが、それらのフィードバックを読んで 「確かにわかっているつもりで読み飛ばしていて、しっかり理解していないな」と気づきました。

そこで、そんな「わかったようでわからないプログラミング用語」を調べ、 Pythonで例をあげて説明していこうと思います。

f:id:nana_yu:20180404165106j:plain

この連載は何?

nana Python学習中のPyQスタッフnanaが、ちまたでよく聞くプログラミング用語を調査し、 エンジニアのスタッフに聞いたりしながらまとめてPythonで説明するシリーズです。 自分が調べてかみくだいた内容が伝わるよう、 図などを用いてプログラミングが初めてでもわかりやすく説明します。
f:id:nana_yu:20180404165106j:plain

今回のテーマは?

今回は、メソッド関数の違いを調べます。 Pythonを学習していても、基礎から頻出する用語ですが、いまいち違いがわからないという方も いるのではないでしょうか?まずはそれぞれの意味を調べてから、具体的な例を用いてPythonを学習する上での違いや見分け方を紹介します。

関数とは?

最初に、プログラムでの関数の言葉の意味を調べました。

関数

  • 関数とは、与えられた値を元に計算や処理を行い、結果を返すもの
  • 「与えられた値」を引数(ひきすう)といい、「返された結果」を戻り値(もどりち)という
  • 引数・戻り値は必須でない。引数がない関数、戻り値がない関数もある
    • データがないことを示すNoneという値がある。Noneを返すとは、データを返さないことと同じ

f:id:nana_yu:20200615163605p:plain

Pythonでの例

例えばprint()は、Pythonの中にもともと組み込まれている関数です。 print()は、「文字列や数値など」を元に「渡された引数を表示する」処理を行います。
print()は戻り値のない関数です。

f:id:nana_yu:20200602153136p:plain

よびだし方

関数は、単独でよびだせます。単独で呼び出すというのは、【関数名】(【引数】) の形で呼び出すことです。

    print("Hello World") #print()単独でよびだしている

メソッドとは?

次に、メソッドという言葉の定義です。

メソッド

メソッドとは、オブジェクトを通して呼び出す関数のこと。

メソッドという用語は、オブジェクト指向プログラミングの中で使われる用語です。 定義から、メソッドも関数に含まれる言葉だということが解ります。 図にすると以下のようなイメージでしょうか。

f:id:nana_yu:20200615163729p:plain:w450

ただし、Pythonはオブジェクト指向に基づいて作られた言語でもあるので、 プログラミング全般で使われる用語とオブジェクト指向プログラミングの用語で厳密な区別をつける必要があまりありません。 そのため、Pythonを学ぶ上ではメソッドは関数の一部とシンプルにとらえても問題ないでしょう。

f:id:nana_yu:20200615163918p:plain:w450

さて、語句の意味を調べたことで、「オブジェクト指向プログラミング」や「オブジェクト」がわからない!という問題が出てきました。 「メソッド」という言葉の意味をまず理解するために、一旦以下のように考えておきましょう。

オブジェクト(という何か)を通して呼び出す関数のことを、オブジェクト指向プログラミングの考え方ではメソッドという

f:id:nana_yu:20200615165746p:plain

nana 文章を読んでいてわからない用語Aを調べていて、さらに知らない単語Bが出てくるというのは学習あるあるです。 こうして出てきた言葉をどんどん調べていくと、深みにハマって脱線します。ですので、私は以下の方法をオススメします。

  • 「Aは(詳しくわからない)Bの一部」などとしてまずは用語Aの大まかな位置づけを理解する
  • 用語Bを、メモ等に控えておく
  • Aの出てきた文章を読み切る
  • 用語Bを別途調べる

まずは用語Aの理解度を、0から1にします。これで、用語Aが出てきた文章全体を理解できます。 その後用語Bの意味を理解することで、用語Aの理解もより深まっていき、知識全体が底上げされます。 今回はその方式で進めてみます。

f:id:nana_yu:20180404165106j:plain

オブジェクト指向プログラミング・オブジェクトについて

オブジェクトもメソッドと同様に、オブジェクト指向プログラミングの用語です。 「オブジェクト指向」は思想・概念ですので、実際に多くの例に触れた上で改めて学ぶのが良いでしょう。

基礎文法を学ぶ段階では、Pythonでは、リスト、辞書などすべての要素がオブジェクトだということを押さえておくと良いです。すべてがオブジェクトであるのは、Pythonがオブジェクト指向の考え方を元に書かれた言語だからです。
Pythonにおいては、普通にプログラミングをしていればオブジェクトを使ってプログラミングができる、と言い換えることもできます。

現段階では、オブジェクトと示された場合には整数・文字列・リスト・辞書・タプルなどなどPythonで使われる1つ1つのモノを包括的に説明する語句だと捉えればよいでしょう。

※Pythonではすべてがオブジェクトですので、実は関数もオブジェクトです。 ですが、関数とメソッドの違いを考える時にその部分を言及すると、ややこしくなります。 この記事で示される【オブジェクト】は、関数オブジェクト以外として読み進めてください。

Pythonでの例

オブジェクト

今回はリストを例にしてみましょう。 以下のようなリストを作ります。

    tea_party = ["Hatter", "March Hare", "Dormouse"] #まず具体的なリストを定義する

オブジェクトは包括的な語句です。 リストという型そのものも、具体的な値を入れて定義したリストtea_partyもオブジェクトとよびます。 今回の例では、リストオブジェクトtea_partyについて考えていきましょう。

メソッド

ここでいうメソッドは、どういうものでしょうか。

  • 関数とは「引数を元に処理を行い、戻り値を返すもの」
  • メソッドとは「オブジェクトを通して呼び出す関数」

ということは、リストのメソッドとは「リストを通して呼び出す、引数を元に処理を行い、戻り値を返すもの」です。 具体的には、リストに値を追加する.append()、リストの値を削除する.pop()などがリストに対応するメソッドです。

  • .append()は、引数で指定した値を、メソッドにひも付くリストへ追加します。

f:id:nana_yu:20200615165854p:plain - .pop()は、リストの値を削除します。引数を指定しないと、末尾の値を削除します。

f:id:nana_yu:20200615165923p:plain

よびだし方

メソッドは、単独ではよびだせず、オブジェクトにひも付けて呼び出すことが特徴です。 今回の例では、オブジェクトは定義したリストtea_partyのことです。 ひもて呼び出すにはピリオド.を使い、【オブジェクト】.【メソッド】(【引数】)と書きます。 先に例として上げた関数print()と比較してみましょう。

    #関数の例
    print("Hello,World!") #単独でよびだせる

    #メソッドの例
    tea_party = ["Hatter", "March Hare", "Dormouse"] #まず具体的なリストを定義する
    tea_party.append("Alice") #具体的なリストに紐づけて呼び出す
    tea_party.pop() #具体的なリストに紐づけて呼び出す

このように、関数とメソッドではよびだし方、すなわちコードの書き方に違いがあります。 オブジェクト指向の理解が進んでいなくても、 メソッドと関数の違いを書き方の面から押さえておくと、文法が理解しやすくなります。

まとめ

関数とメソッドの共通点

  • 引数を受け取り、戻り値を返すという働きは同じ

関数とメソッドの違い

  • メソッドは、オブジェクト指向プログラミングの考え方に基づいている用語
    • メソッドは関数(の一部)
  • よびだし方(=コードの書き方)が異なる
    • 関数:単独で呼び出す 【関数名】(【引数】)
    • メソッド:オブジェクトにひも付けて呼び出す 【オブジェクト名】.【メソッド】(【引数】)

最後に

関数とメソッドの違い、見分け方は理解できたでしょうか。 私はPyQでPythonを学習しているのですが、入門範囲を学習した時 「なぜprint()【リスト名】.append()のような書き方があるんだろう?」 と混乱することがありました。

同じような「解ったようで解らない」もやもや感がある人の助けになればうれしいです。

Copyright ©2017-2020 BeProud Inc. All rights reserved.