[Python入門]関数の基本Python入門(1/2 ページ)

「関数とは」「関数呼び出しの方法」「組み込み関数」「ユーザー定義関数」「関数定義の方法」など、Pythonの関数の基本知識を説明する。

» 2023年10月16日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「Python入門」のインデックス

連載目次

* 本稿は2019年5月17日、2022年6月10日に公開/改訂された記事を、Python 3.12.0で動作確認したものです(確認日:2023年10月16日)。


 前回までは3回に分けて、Pythonプログラムの実行の流れを制御するif文、for文、while文などを見てきた。これらの文は何らかのロジックを含んだ複雑なコードを書く上で必須のものだった。今回から数回に分けて、そうしたロジックに名前を付けて、再利用を可能にする仕組みである「関数」について見ていこう。

関数の基本と呼び出し方

 Pythonの「関数」とは、数学の関数に似て、「何らかの値を渡すと、その値に応じた何らかの値を返すもの」といえる。関数に渡す値(関数への入力値)のことを「引数」と呼ぶ。そして、「関数に引数を渡して、関数のコードを実行し、その処理結果を得る」ことを「関数を呼び出す」「関数呼び出し」「関数の実行」などと呼ぶ。また、関数を呼び出したときに得られる結果(関数からの出力)のことを「戻り値」とか「返り値」などという。

関数 関数

 本連載でも、これまでにPythonが標準で備えている関数を幾つか使ってきた(それらの関数のことを「組み込み関数」という)。代表的なものはもちろん「print関数」だ。これは、引数に与えた値を出力(画面などに表示)するものだ。ただし、これは「(画面などに)出力する」が「戻り値はない」*1。数学の世界では、関数は値を返すものだが、多くのプログラミング言語では、関数は値を返すとは限らない(その代わりに、画面出力やグラフの描画など、別の手段で処理結果が得られる)。

*1 正確には「None」という値を返すが、Pythonにおける「None」は「値がない」ことを意味する値である。よって、print関数は「値がないことを意味する値を返す」つまり「戻り値はない」といってもよいだろう。


 関数を呼び出すには、「その関数を実行するのに必要」となる引数を与えてやる必要がある。関数に引数を渡すときには、関数名に続けて引数をかっこ「()」で囲み、引数が複数あるときにはそれらをカンマで区切って並べる。また、関数を呼び出した結果(戻り値)を受け取るには、それを変数に代入する。よって、関数を呼び出す一般的な形式は次のようになる。数学における「y = f(x)」と似た記述方法になっているのが分かるはずだ。

変数名 = 関数名(引数1, 引数2, ……)

関数呼び出しの一般的な形式

関数呼び出しの一般的な形式 関数呼び出しの一般的な形式

 print関数など戻り値がないものについては「変数名 =」の部分は必要なく、単に「関数名(引数1, 引数2, ……)」のように記述できる(例:print('Hello', 'World'))。関数を呼び出した結果を使って、また別の関数を呼び出したければ「関数名1(関数名2(関数2の引数))」のように書くこともできる。

 既におなじみのprint関数を題材に、関数を呼び出す例を以下に示す。

print('Hello World'# Hello World
print('Hello', 'World'# Hello World

result = print('Hello', 'World'# Hello World
print(result)  # None

print関数の呼び出し例

 最初の行は'Hello World'という文字列を唯一の引数として指定してprint関数を呼び出している。その結果はこれまでに見た通りだ。

 次の行は'Hello'と'World'という2つの文字列を引数に指定してprint関数を呼び出している。このとき、print関数はそれぞれの引数の値を順番に、ただし間に空白文字を挟んで出力する。その結果、'Hello'に続けて空白文字、その後に'World'、つまり'Hello World'が出力される。

 最後の2行はprint関数を呼び出して'Hello World'と出力し、その戻り値を変数resultに代入して、それをprint関数で表示している。

 実行結果を以下に示す。

実行結果 実行結果

 最後の出力を見ると、print関数が確かにNoneという値を返していることが分かるはずだ。

 ここでprint関数が引数を1つ受け取ったり、2つ受け取ったりしていることを疑問に思ったかもしれない。実はprint関数は任意の数の引数(これを引数の数が変わるという意味で「可変長引数」と呼ぶ)を受け取れるようにできている。このような関数に値を渡すときには特別な引数の渡し方もある。

 例えば、本連載ではまだ取り扱っていないがリストという「複数の値を格納するためのオブジェクト」を引数にprint関数を呼び出してみよう。

str_list = ['Hello', 'World']

print(str_list)  # ['Hello', 'World']
print(*str_list)  # Hello World

リストをprint関数に渡す

 リストに関する詳しい説明は第16回「リストの基本」以降を参照してほしいが、上のコードでは変数str_listには「'Hello'と'World'という2つの文字列を格納しているリスト」というオブジェクトが代入されている。

 そして、1つ目のprint関数にはこのstr_listをそのまま渡している。2つ目のprint関数呼び出しでは「*str_list」のようにstr_listの前にアスタリスク「*」が置かれている点に注目してほしい。実行結果は次のようになる。

実行結果 実行結果

 1つ目のprint関数呼び出しでは「['Hello', 'World']」とリストがそのまま表示され、2つ目のprint関数呼び出しではこれまでに見たような「Hello World」が表示されていることに注目してほしい。

 1つ目の「print(str_list)」呼び出しでは、リストが1個の引数としてprint関数に渡されているので、print関数はそれを1個のデータとしてそのまま表示している。これに対して、2つ目の「print(*str_list)」ではリストに格納されている2つの文字列が「展開」されて(リストから取り出されて2つの値として)print関数に渡されている。つまり、後者の呼び出しは実質的には「print('Hello', 'World')」と同じことをしているということだ。このような可変長引数の受け渡しについては次回でも取り上げることにしよう。

組み込み関数

 Pythonには言語が標準で持っていて、プログラマーがいつでも利用できる「組み込み関数」が多く用意されている。これまでに出てきたものも含めてそのうちの幾つかを以下に示す。呼び出し例の「→」の隣にあるのは関数の戻り値の例だ。

関数 説明 呼び出し例
print 引数に受け取ったものを画面などに出力する print('Hello')→None
input ユーザーにプロンプトを表示して、ユーザー入力を受け取り、それを文字列として返す input('input some number: ')→'100'など
len 引数に指定した文字列やリストなどの要素数を返す len('string')→6
ord 引数に指定した1文字のコードポイントを返す ord('A')→65
chr 引数に指定した整数値をコードポイントとする文字を返す chr(65)→'A'
int 引数に指定した文字列や浮動小数点数値などを整数値にしたものを返す int('1')→1
int(2.5)→2
float 引数に指定した文字列や整数値などを浮動小数点数値にしたものを返す float('1.1')→1.1
float(2)→2.0
str 引数に与えたものの文字列表現を返す str(1)→'1'
max 引数に与えたものの中で最大のものを返す max(1, 2)→2
max('a', 'b')→'b'(文字は辞書式の順序に大小が定められている)
min 引数に与えたものの中で最小のものを返す min(1, 2)→1
min('a', 'b')→'a'(文字は辞書式の順序に大小が定められている)
bin 引数に与えた整数値を2進数表現にした文字列を返す bin(8)→'0b1000'(10進数表現の整数「8」を2進数で表現すると「1000」となり、それに'0b'を前置したもの)
oct 引数に与えた整数値を8進数表現にした文字列を返す oct(8)→'0o10'(10進数表現の整数「8」を8進数で表現すると「10」となり、それに'0o'を前置したもの)
hex 引数に与えた整数値を16進数表現にした文字列を返す hex(255)→'0xFF'(10進数表現の整数「255」を16進数で表現すると「ff」となり、それに'0x'を前置したもの)
type 引数に与えたオブジェクトの型を返す type(1)→<class 'int'>
組み込み関数(一部)

 ここに挙げなかった関数や詳細な情報(引数や戻り値の説明)はPython公式サイトの「組み込み関数」を参照のこと。「こんな機能はないかな」「この関数の使い方ってどんなだっけ」となったときには、このページを検索してみるとよい。

ユーザー定義関数

 組み込み関数だけがPythonで使える関数ではない。自分で関数を定義することも可能だ。そうした関数を「ユーザー定義関数」と呼ぶ。なぜ関数を自分で定義するのかというと、それには幾つかの理由がある。例えば、以下のようなことがそうだ。

  • プログラム中で何度も利用するコードを1つにまとめる
  • まとまったコードの固まりに名前を付けて、コードの意図を分かりやすくする
  • プログラムを関数の形で他のプログラムから利用できるようにする

 プログラムを作成していると、同じプログラムの複数の箇所で同じ処理を行うことがある。そのたびに同じコードを何度も何度も記述するのはバカげている。コンピュータやプログラムは人がラクをするためのものなので、同じことを人が何度も繰り返すのはよくない。そこで、同じコードを書く必要があるのなら、それを関数にして、必要な場所でそれを呼び出すようにするのが効率的だ。

 また、変数を使うメリットとして「その値に名前を付けることで、その値の意味が分かるようになる」というのがあったが、それと同じで「何かの処理を行うひとまとまりのコード」に名前を付けることで、それが何をするコードかが明確になる。そうなっていれば、自分で(あるいは他の人が)後からプログラムを見返すときに、プログラムの意味を把握しやすくなる。

 さらにそうしたコードを関数にまとめておくと、後から別のプログラムで「前に書いたあのコード」と同じコードが必要になったときに、それを書き直すのではなく、関数にまとめられたコードを使える(「コードの再利用」ともいう)。

 こうしたことから、定型的な処理や、何らかの意図を持ったひとまとまりのコードは関数としておくのがよい。では、ユーザー定義関数はどのようにして作るのだろう。

def文:関数定義の構文

 Pythonでは、関数は「def文」を使って定義する。「関数の定義」とは「関数の名前、その関数を実行するのに必要なデータが何か、実際に実行するコードがどんなものかをPythonに伝えること」だと考えられる。Pythonはプログラム実行時にdef文を見ると、「関数定義が始まったな」と認識して、今述べた情報を基にその関数を表すオブジェクトを作成する。定義した関数は、その後、自由に呼び出せるようになる。

 関数定義のおおよその構文は次の通りとなっている。

def 関数名(パラメーター1, パラメーター2, ……):
    関数で行う処理関数ボディー

def文の構文

 これまでに見てきたif文やfor文など(複合文)と同様に、1行目は「def」というキーワードで始まって、コロン(:)で終わる。関数を呼び出したときに実行する処理(これを「関数ボディー」や「関数本体」などと呼ぶ)はインデントを付けて記述する必要がある(これもif文やfor文と同様だ)。

 「def」と空白文字に続けて「関数名」を書き、その後にはかっこ「()」で囲んで「その関数が受け取る値のリスト」を(複数あるときにはカンマで区切って)並べる。これら「関数が受け取る値」のことを「パラメーター」「仮引数」と呼び、それらを(カンマで区切って)並べたものを「パラメーターリスト」「仮引数リスト」と呼ぶ。これに対して、関数呼び出し時に実際に関数へと渡す値のことを「実引数」と呼ぶことがある。

 パラメーターとは、その関数を実行するのにどのような値が必要かを示すと同時に、その関数が呼び出される際に「呼び出し側から渡された値」を受け取るための変数のように機能する。その関数が行う処理を記述するために、関数ボディーではパラメーターは変数と同じにように使えるが、その値は関数呼び出し時に渡される「実引数」によって決定される。

パラメーター/仮引数と実引数の関係 パラメーター/仮引数と実引数の関係

簡単な関数の定義

 では、実際に簡単な関数を定義してみよう。ここでは、以下のような関数を定義する。

  • 関数名:hello
  • パラメーター:1つ。パラメーター名は「whom」とする
  • 関数で行う処理:文字列'Hello'とパラメーターwhomの値を文字列化したものを結合して、それをprint関数で表示する

 以上から、hello関数の定義は次のようになる。

def hello(whom):
    message = 'Hello ' + str(whom)
    print(message)

hello関数の定義

 上のコードの関数ボディーでは、パラメーターwhomに受け取った値をstr関数で文字列化して、それを文字列'Hello'と結合したものを変数messageに代入している。これが画面に表示するメッセージだ。2行目のprint関数ではそれを表示しているだけだ。1行でも書けることだが(「print('Hello', whom)」とすればよい)、2行に分けたのは、各行のインデントがそろっていることを見てもらうためだ。また、関数定義の内部では、上に示したように他の関数を呼び出すことも可能だ。

 このコードをセルに入力して実行することで、hello関数が定義される。

hello関数の定義 hello関数の定義

 ユーザー定義関数の呼び出し方は、今までに見てきたprint関数などの組み込み関数の呼び出し方と変わらない。この場合は、あいさつする相手を引数に指定して呼び出せばよい。「Hello World」と表示したいのであれば次のようになる。

hello('World')

引数に文字列'World'を指定してhello関数を呼び出す

 実行結果は次のようになる。

「hello('World')」と引数に文字列'World'を指定して、hello関数を実行すると、「Hello World」と表示される 「hello('World')」と引数に文字列'World'を指定して、hello関数を実行すると、「Hello World」と表示される

 この関数は戻り値を持たない。そこで次に関数を呼び出した側に値を返す関数を定義してみよう。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。