関数は、入力に対して何らかの処理を施し、出力を返します。一般には、幾つかの処理がまとめられたプログラムになっています。Pythonに元々定義された関数(組み込み関数)もあれば、利用者が独自に作る関数もあります。また、幾つかの関数をまとめたプログラムは、モジュールといいます。このモジュールは、「.py」を拡張子に持つファイル(Python のコードを記述したプログラム)のことで、必要なときに読み込んで使います。幾つかのモジュールをひとまとまりにしたセットがパッケージで、このパッケージの集合体をライブラリとか、フレームワークとかいいます。
組み込み関数は、はじめからPythonに定義された関数です。これまで使ってきたprint()は、その代表例です。この組み込み関数を使うと、効率的にプログラムを作成していくことができます。したがって、頻繁に使う関数は必ず、そうでない関数もできれば、知っておくとよいでしょう。
関数を呼び出すには、「関数名(引数1, 引数2, ...)」というように書きます。引数というのは、関数に代入する数値や文字列のことです。引数は、パラメータということもあります。引数の型は、関数ごとに決まっています。つまり、引数に、どのような種類のデータを代入できるかが決まっているということです。また、引数の数も関数によって決まっています。引数を渡す必要がない関数もあります。
ここで、関数len()を見てみましょう。関数len()は、引数に入力された文字列の長さやリストの要素の数を返します。ここで、print()も組み込み関数です。
In
k1 = len("Hello World") # 文字列の長さ
print(k1)
k2 = len([3, 4, 5, 6, 7, 8]) # リストの要素の数
print(k2)
Out
11
6
注意点として、組み込み関数の関数名は、変数名として使ってはいけません。組み込み関数や予約語(if文のifとか、for文のforとか)の名前を変数名として使うと、その名前が変数名として上書きされてしまいます。したがって、組み込み関数や予約語としての役割を果たさなくなります。
次に、関数int()を見ていきましょう。int()は、文字列を数値に型変換したり、浮動小数点を整数に変換したりします。以下の例は、文字列を10進数の数値に変換します。
In
a = int("300")
print(a)
Out
300
関数の引数は一つしかありませんでしたが、もう一つ設定して基数を指定することができます。引数を指定すると、処理の内容が変わってきます。例えば、以下の例は、文字列100を数値に変換し、それが基数2(二進数)だったとして10進数の数値で表します。
In
a = int("100", 2)
print(a)
Out
4
基数が16(16進数)だった場合、数値は以下のようになります。
In
a = int("100", 16)
print(a)
Out
256
関数int()の例では、文字列を入力して、数値を出力しました。この出力したデータは戻り値といいます。どんな型の戻り値が返るかは、関数によって決まっています。このint()の場合、戻り値は整数型になっています。
In
a = int("300")
print(type(a))
Out
<class 'int'>
戻り値を持たない関数もあります。例えば、上のprint()が一例です。関数print()には、引数の内容を表示する機能があり、戻り値を返す必要がありません。
abs()は、数値の絶対値を返します。abs()の引数には数値を渡し、戻り値として数値(絶対値)が返ります。
In
b1 = abs(10.1)
print(b1)
b2 = abs(-20.2)
print(b2)
Out
10.1
20.2
range()は、整数を一つずつカウントアップする関数です。for文など、ループを特定の回数実行するときによく使います。range()に一つ引数を与えると、0から始まる数値を、引数の一つ前の値まで生成します。例えば、以下のように書くと、0~9の数値10個を生成し、表示します。
In
for i in range(10):
print(i, end = ' ')
Out
0 1 2 3 4 5 6 7 8 9
引数に、開始する数値とステップ数を指定することができます。例えば、20~30までの数値を一つ飛びに生成する(結果として偶数になる)場合、range()の引数は以下のようになります。
In
for i in range(20, 31, 2):
print(i, end = " ")
Out
20 22 24 26 28 30
上の例では、引数の中で「終了する数値」が31になっている点に注意が必要です。終了する値は含まれないので、30にすると結果が違ってきます。
関数は独自のものを作ることができます。独自の関数を作ることで、プログラム全体の見通しがよくなりますし、同じ処理を実装するための同じコードを何度も書かなくてよくなります。つまり、プログラム作成の効率化が図れます。
関数を定義するには、以下のように定義します。引数を渡すと、その関数の中でその値を使うことができます。また、関数内で定義した変数は、その関数の中だけでしか使えません。
def 関数名(引数):
その関数を使うときは、定義した後に「関数名(引数)」と書いて呼び出します。
In
def Birth(m):
print("出身は" + m + "です!")
Birth("千葉県")
Out
出身は千葉県です!
複数の引数を渡すこともできます。引数に設定した数値を累乗してその値を表示するには、以下のように書きます。
In
def eight_cal(x, y):
print(x ** y)
eight_cal(5, 8)
Out
390625
関数の引数に初期値を設定できます。関数の中で初期値を設定しておくと、関数を呼び出したときに引数を省略すると、初期値がその引数の代わりになります。例えば、以下の例では、呼び出す側の関数に引数は書かれていませんが、関数内の初期値が代わりに使われています。
In
def Birth(m = "埼玉県"): # 初期値が使われる
print("出身は" + m + "です!")
Birth()
Out
出身は埼玉県です!
呼び出す側で関数に引数を設定したときは、その引数の値が、定義した関数の中で使われます。
In
def eight_cal(x = 5, y = 8):
print(x ** y)
eight_cal(2, 10) # 呼び出す側の関数の引数が優先される
Out
1024
多くの関数は、呼び出し元に対して処理の結果を戻り値として返します。def文で定義した関数で戻り値を返すには、「return 戻り値」と書きます。戻り値は返り値とも言われます。return文は関数の最後に置き、returnの後に括弧は必要ありません。
In
def Birth(m = "埼玉県"):
return "出身は" + m + "です!"
print(Birth("神奈川県"))
Out
出身は神奈川県です!
関数の中でreturn文の横に複雑なコードが書いてあると見にくいので、変数に代入してその変数の値を返すようにします。
In
def eight_cal(x = 5, y = 8):
z = x ** y
return z
print(eight_cal(2, 12))
Out
4096
パッケージは、同じような用途で使われるモジュールのセットです。モジュールは複数の関数で構成され、必要なときに読み込んで使います。読み込みは、「import 名前」と書きます。モジュールをimport文により呼び出せば、呼び出したモジュールの中のクラスや関数や変数を利用することができます。モジュールの関数を使用する場合、「import モジュール名」で読み込み、「モジュール名.関数名()」で関数を使います。例えば、timeモジュールを使う場合、以下のようにします。
In
import time
current_time = time.time()
print(current_time)
Out
1604555280.0819666
意味不明な数字を表示しているように見えますが、システム依存の時刻を起点にしています。で、これを年月日時分秒の形式で表示するには、gmtime()を使います。出力は、適当に改行しています。
In
import time
current_time = time.gmtime()
print(current_time)
Out
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=5, tm_hour=5,
tm_min=49, tm_sec=25, tm_wday=3, tm_yday=310, tm_isdst=0)
fromを使うと、モジュールの関数を、モジュール名なしで使うことができます。「from モジュール名 import 関数名」と書いて、該当する関数を直接読み出します。こうすると、この関数を使うときにモジュール名を書かなくてよくなります。上の例では、timeというモジュールのtime()という関数を使いました。これは、以下のようにコードを短くできます。
In
from time import time
current_time = time()
print(current_time)
Out
1604636241.1457312
モジュールのモジュール名は、「as」を使って名前を一時的に変更できます。例えば、データを可視化する機能を持ったライブラリmatplotlibには、データをプロットする関数を備えたモジュールpyplotがあります(matplotlibについては、後に詳しく説明します)。このモジュールの関数plot()を使うには、コードの中でmatplotlib.pyplot.plot()のように記述する必要があります。このmatplotlib.pyplotの部分を、pltのような省略語で表すことができるのです。
In
import matplotlib.pyplot as plt
month = [1, 2, 3, 4, 5, 6]
temp = [7.1, 8.3, 10.7, 12.8, 19.5, 23.2] # 東京の平均気温(2020)
plt.plot(month, temp)
plt.show()
Out