3. 関数でまとまった処理を扱おう

変数に代入し、それを使った式を評価するといった一連の文を書けるようになりましたね。 プログラミングでは、代入してから式を評価のような 一連の文をまとめて1つの処理にできます。 この章から 5 章関数を作って処理をまとめよう」までで、文がまとまった処理 について学びましょう。

プログラミングでは、ひとまとまりにした処理 のことを 関数 (かんすう)と呼びます。 この章では、プログラミング言語が用意した関数を使えるようになりましょう。 対話モードにプログラムを入力しながら読み進めてください。

3.1. 関数とは

3.1.1. 処理をする箱

関数には「数」という字が付きますが、数値ではありません。 まとまった 処理 を指します。

関数は「函数」(かんすう)とも書かれます。 「函」という字は、 を意味します。 つまり、函数(関数)は、何らかの箱ということです。

関数は、入れられたものを決まった手順で処理し、結果を出す箱 です。 箱には、どんな処理かが分かるように名前が付いています。 箱の中身がどうなっているかは、外から見えません。 ですが、プログラマーは中身を詳細に知らなくても処理の結果を利用できます。

関数の4要素

  • 箱の名前

  • 箱は何をするか

  • 箱に入れるもの

  • 箱から出てくるもの

../_images/4-1-function_is_box.png

入力した値を箱が処理し、結果が出てくる

3.1.2. 関数のイメージ:自動販売機

身近なものでは、例えば自動販売機が関数に近いです。 自動販売機を関数だと思うと、こんな箱です:

自動販売機という関数

箱の名前

自動販売機

箱は何をするか

飲み物を販売する

箱に入れるもの

お金、飲み物の指定

箱から出てくるもの

飲み物、おつり

../_images/4-2-vending_machine_metaphor.png

お金を入れ、飲み物を指定すると、飲み物とおつりが出てくる

私たちは自動販売機の中身やどう動いているかを事細かに知りませんが、自動販売機を使って飲み物が買えますね。

関数のイメージが少しでもつかめたでしょうか。 百聞は一見にしかず、次は実際に関数を使ってみましょう。

[コラム] 箱の「機能」

皆さんがこの節で出会った「関数」は、英語では function と言います。 辞書で function を引いてみると、「機能」という訳語があることに気づくでしょう。 実は、functionを「関数」と訳したことで、少し分かりづらくなってしまっています。

何か 機能をもった箱 があると想像してください。 その箱にものを入れると、機能を適用した結果が返ってきます。 入れたものに対して、機能を働かせた結果を返す、そんな箱が関数です。

3.2. 関数を使ってみよう

3.2.1. 文字列の長さを数える関数

文字列は文字の並びですから、何文字あるか数えることができます。 例えば、 "こんにちは" という文字列の場合は、「こ」「ん」「に」「ち」「は」の5文字ですね。

文字列が何文字か数えるという処理はよく使うので、関数として用意されています。

何文字か数える関数

箱の名前

len

箱は何をするか

文字列が何文字か数える

箱に入れるもの

文字列

箱から出てくるもの

整数(文字数を表す)

では len 関数を使ってみましょう。 対話モードに len("こんにちは") と入力してEnterキーを押すと、文字数が表示されます。

>>> len("こんにちは")
5

箱の名前 len にカッコ () を続けます。 箱に入れるもの(ここでは "こんにちは")は、カッコの中に書きます。 Enterキーを押すと、箱が処理をして、文字数(5 文字)が出てきます。

../_images/4-3-len_box_image.drawio.png

文字列 "こんにちは" を箱に入れる

別の文字列を入れると、len 関数から出てくる長さは変わります。 文字列の繰り返しを使って用意した20文字の文字列を入れてみましょう。

>>> len("ー" * 20)
20

文字列の長さ 20 文字と結果が出ていますね。 式を箱に入れる場合、評価された値が入ります。

../_images/4-4-len_pass_expression.drawio.png

箱に入るのは評価された値

3.2.1.1. 練習問題

ここまでで使った文字列を1つ思い出し、len 関数で長さを求めてみましょう (思い出せない場合は、好きな言葉でかまいません)。

[解答]

>>> len("さしもしらじな" + "もゆるおもひを")
14

3.2.2. 値の型を確認する関数

1 章プログラムで数と文字を扱ってみよう」で取り上げた、型(値の種類)を確認する処理も、関数として用意されています。

型を確認する関数

箱の名前

type

箱は何をするか

引数に渡した値の型を返す

箱に入れるもの

箱から出てくるもの

では、type 関数を使って型を確認しましょう。 整数と文字列を入れてみます。

>>> type(2)
<class 'int'>
>>> type("もゆるおもひを")
<class 'str'>

1 章 の中の「値には種類がある:型」で紹介した型(int, str)が出ていますね。

../_images/4-11-type_box_image.drawio.png

関数 type の結果は型

3.2.2.1. 練習問題

type 関数で浮動小数点数の型を確認してみましょう。

[解答]

>>> type(1.08)
<class 'float'>

浮動小数点数を表す型は float と分かりました(floating(浮動)の省略です)。

[コラム] 関数でよく見かけるエラー2つ

1つ目は関数の名前の打ち間違いです。 変数の打ち間違いと同じように、処理系は NameError を出します。

>>> lem("こんにちは")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'lem' is not defined

関数を使っていて、NameError に出会ったら、関数の名前を打ち間違えていないか 確認しましょう。

もう1つのエラーは、型に関係するエラーです。 len に整数を入れてみたらどうなるでしょうか。

>>> len(123)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

整数を len 関数に入れられないために、処理系は TypeError を出しました。

関数で TypeError が出たら、その関数が処理できない型を入れています。 できない使い方をしているということなので、諦めましょう(別の方法での実現を考えます)。 どこかを修正すれば出なくなる NameError と異なります。 ここでは、関数によっては 箱に入れられない値がある ことを、頭の片隅に留めておいてください。

3.3. 関数をもう少し詳しく知ろう

3.3.1. 関数を表す用語

関数を言い表すときに使われる用語を紹介します。

() を通して関数に入れられるものを 引数 (ひきすう)と呼びます。

引数という言葉を使うと、 len("こんにちは") というプログラムの実行は、次のようにも言い表されます。

  • len 関数に引数 "こんにちは"渡す

  • "こんにちは" を引数に len 関数を 呼び出す

また、関数が処理の結果を出すことを、関数が値を 返す とも言い表します。 len 関数は引数の文字列の長さを返します。

関数が返す値のことを 返り値 (かえりち)や 戻り値 (もどりち)と呼びます。

../_images/4-7-function_petit_summary.png

関数にまつわる用語まとめ

3.3.2. 関数は式

これまでの章で演算子を使った式を知りましたね。 実は、関数も式 です。 演算子を使わない式もあるのです。

関数(式)の評価結果は、関数の返り値 です。 例えば len("こんにちは") を評価すると、len 関数の返り値 5 が評価結果になります。

3.3.2.1. 関数の結果を変数に代入する

演算子を使った式と同じように、関数の評価結果の値を変数に代入 できます。

>>> mojisuu = len("こんにちは世界")
>>> mojisuu
7

変数 mojisuu (文字数)に、len 関数を適用した結果が代入されました。

関数を適用した結果に名前を付けたり、一時保存したりする目的で使います。

../_images/4-6-len_store_variable.drawio.png

関数が出した結果を変数に代入する

3.3.2.2. 関数に変数を入れる(式の評価の順序)

関数の引数に変数を使う場合について見てみましょう。

>>> a = "こんにちは世界"
>>> len(a)
7

len(a) という式の評価には 順番 があります。

  1. まず、関数の引数(式)が評価されます。ここでは、a が評価されて "こんにちは世界" となります。

  2. 次に関数の呼び出し len("こんにちは世界") が評価されます。

  3. len("こんにちは世界") の評価結果 7len(a) の評価結果となります。

../_images/4-5-len_pass_variable.drawio.png

箱に入るのは変数の指す値

3.3.2.3. 練習問題

以下のプログラムを上から順番に実行した時、len(banzai * 3) の返す値は何になりますか? まずは対話モードを使わずに考え、その後対話モードで確認してください。

>>> banzai = "万歳!"
>>> len(banzai * 3)  

[解答]

評価順により

  1. 引数(式 banzai * 3)を評価して "万歳!万歳!万歳!"

  2. len("万歳!万歳!万歳!") を評価して 9 (9文字)

  3. len(banzai * 3) の返す値は 9

>>> banzai = "万歳!"
>>> len(banzai * 3)
9

[発展] Pythonの組み込み関数

この章で紹介した len 関数や type 関数は、Pythonの 組み込み関数 と呼ばれます。 組み込み関数は数が多く、筆者たちもすべてを事細かく把握していません。 ではどうしているかというと、分からないことがあったら そのたびに 組み込み関数の 使い方を調べ ています。 組み込み関数を覚えるのではなく、使い方の 調べ方を覚える ことをおすすめします。

PCでブラウザーを開き、以下を入力してください。 https://docs.python.org/ja/3/library/functions.html

../_images/4-8-python-functions-document.png

組み込み関数の一覧ドキュメント

組み込み関数の一覧から len() をクリックすると、 len 関数の説明が現れます。

../_images/4-9-len_document.png

len 関数のドキュメント

このように、組み込み関数の使い方が分からなくなったら調べられます。 Pythonに限らず、プログラミング言語には、あらかじめ用意された関数があります。 それらの使い方は、ドキュメントで調べられます

なお、len 関数のドキュメントを読んでよく分からなくても心配ありません。 ドキュメントはPythonに慣れた人向けに書かれているからです。 「オブジェクト」「シーケンス」「コレクション」といった言葉は、Pythonの学習を進めていく中で徐々に意味がつかめてきます。 意味をつかんだ語が増えるにつれて、ドキュメントを読めるようになっていきます。

[コラム] ◯文字以内で書く時に len 関数が便利

日常生活で◯文字以内で文章を書くことはたびたびありますよね(例えば本書の説明文を100文字で書く)。 そんなときに私は、対話モードを立ち上げて len 関数を使います。

今書いている文章の文字数を変数に代入します。 そして len 関数を呼び出し、今の文字数を確認します。 100文字との差を求めて「もっと書かなきゃ」「ここを削ろう」などと推敲しています。