Python:関数の基本的な使い方と利用例

Python

Pythonには、画面に文字を表示するprint関数やキーボードから入力を受け付けるinput関数などの標準関数があります。

プログラミングでの《関数》は一般に処理のまとまりを意味します。
また、関数はプログラマが独自に作成することもできます。

本記事では、Pythonで関数を作るときに知っておきたい関数の定義方法引数を伴う関数戻り値を持つ関数について解説します。

関数の作り方と使い方

例えばhelloという関数を作ってみます。

def hello():
    print("Hello,")
    print("Do you remember how many breads you have eaten?")

上記は関数helloの定義です。実行するには呼び出さなくてはなりません。
呼び出すにはこうします。

hello()

まとめるとこうなります。(関数helloを作って、1回実行する)

48_kansu1.py

# 関数の基本

# 関数helloの定義
def hello():
    print("Hello,")
    print("Do you remember how many breads you have eaten?")

# 関数helloを呼び出す
hello()

関数の定義が4~6行目までありますが、プログラムの実行は9行目開始であることに注意してください。実行順は9行目→4行目→5行目→6行目→終了となります。

実行イメージ

Hello,
Do you remember how many breads you have eaten?

関数の記述方法

関数の記述には def を用います。
関数の処理はfor文やif文のようにインデント(字下げ)して記述するようにします。

def 《関数名》(引数):
[インデント] 関数の処理
[インデント] 関数の処理
[インデント]   :

関数のメリット

一度作った関数は何度でも呼び出し出来ることが関数を作るメリットです。同じ記述を何度もコピーしたり入力したりする必要が無いため、間違いが減りプログラムが見やすくなるというメリットもあります。

例えば次のようにすれば関数zenigataを5回呼び出すことができます。

49_zenigata.py

def zenigata():
    print("奴はとんでもないものを盗んでいきました。")
    print("あなたの心です")

for i in range(5):
    zenigata()

実行イメージ

奴はとんでもないものを盗んでいきました。
あなたの心です
奴はとんでもないものを盗んでいきました。
あなたの心です
奴はとんでもないものを盗んでいきました。
あなたの心です
奴はとんでもないものを盗んでいきました。
あなたの心です
奴はとんでもないものを盗んでいきました。
あなたの心です

関数の種類1:引数を持つ関数

前述の関数は何回実行しても同じ実行結果です。
これを関数の定義で呼び出すときに引数を伴う形にすると、呼び出し毎に処理を変える関数が作成できます。

50_kansu2.py

# 関数の基本2

# 引数を持つ関数
def hello(name):
    print("こんにちは {} さん!".format(name))

# 関数helloを呼び出す
hello("一樹")
hello("有希")

実行イメージ

こんにちは 一樹 さん!
こんにちは 有希 さん!

引数は、関数名の後の( )の中に指定する文字列数値変数名などのことを指します。引数はカンマ区切りでいくつでも指定できます。

def 関数名(引数1, 引数2, ….):

次は引数に指定した2つの数を足し算して表示してくれる関数です。

51_kansu3.py

# 関数の基本3

# 引数を持つ関数
def gokei(x, y):
    print("合計は{}です".format(x + y))

# 関数gokeiを呼び出す
gokei(10, 90)

実行イメージ

合計は100です

呼び出し元は、

gokei(10, 90)

の部分です。引数の10と90がそれぞれ def gokei (x, y)で定義されたxとyにそれぞれ代入されます。

イメージ

関数の種類2:戻り値を持つ関数

呼び出し元に値を返す関数として関数内にreturn文を伴う関数があります。
これを戻り値を持つ関数、と呼びます。

戻り値のイメージ

戻り値を持つ関数の単純な例です。

# 戻り値をもつ関数
def sub():
    return 100

a = sub()
print(a)

実行イメージ

100

上記関数内の処理にある return には、読み出し元に処理を移るという意味があり、return 100 は、呼び出し元に100を返すという意味になります。
呼び出し元とは a = sub() の sub() の部分です。

イメージで表すとこうなります。

呼び出し元である sub() return文で指定された 100置き換わる、と考えてください。

例)引数に指定した2つの数の合計を返す関数

戻り値を持つ関数で実際によく用いられるのが、計算結果を返すというものです。
以下は、引数に指定した2つの数の合計を戻り値として呼び出し元に返す関数の例です。

52_kansu4.py

# 関数の基本4

# 戻り値を持つ関数
def gokei(x, y):
    return(x + y)

result = gokei(234, 432)  # 関数gokeiを呼び出して戻り値をresultにセット

print("合計は{}です".format(result))

実行イメージ

合計は666です

解説
result = gokei(234, 432) でgokei関数が呼び出されます。
gokei関数では、引数の xy にそれぞれ234432が代入されます。
return(x + y) が実行されるので、呼び出し元である result = gokei(234, 432) は、結果的に result = 666 となり、最後に「合計は666です」が表示されます。

サイコロを関数で表現する

ゲームなどでよく使うような乱数を関数の戻り値に設定するとサイコロ関数が出来上がります。

実行イメージ(実行するたびに変わります)

4
3
1
2
4
1
5
2
6
4

saikoro.py

# サイコロを関数で表現する

import random

def saikoro():
    return random.randint(1, 6)  # 1~6の乱数

for i in range(10):
    print(saikoro())

月(1~12)を引数に指定すると月の和名を返す関数

実行イメージ

何月? 2
如月(きさらぎ)

kansu_watuki.py

# 月の和名を返す関数kisaragi

def kisaragi(tuki):
    # 月の和名
    watuki = ["睦月(むつき)", "如月(きさらぎ)", "弥生(やよい)", "卯月(うづき)", "皐月(さつき)", "水無月(みなづき)", "文月(ふみづき)", "葉月(はづき)", "長月(ながつき)", "神無月(かんなづき)","霜月(しもつき)", "師走(しわす)"]

    # 和名を返す
    if tuki >= 1 and tuki <= 12:
        return(watuki[tuki-1])
    else:
        return ""

# 月を入力
tuki = int(input("何月? "))
print(kisaragi(tuki))

補足
上記関数kisaragiは、if文を使わずに

return(watuki[tuki-1])

としてもいいのですが、引数に間違いがあったときの事を想定してあえて

if tuki >= 1 and tuki <= 12:
    return(watuki[tuki-1])
else:
    return ""

としています。このプログラムの場合、単純に return(watuki[tuki-1]) としてしまうと、引数にリストの添え字の範囲外(-1や12など)が指定された時、エラーが出て止まってしまいます
関数を作る上でこうした想定外を考えてプログラミングすることは大事かと思います。

以上、Python:関数の基本的な使い方と利用例でした。

プログラムの一定の処理をまとめて関数にすることを関数化と言います。
関数化することで大きなプログラムに挑戦できるようになります。
わたしの知っている人でプログラムがディスプレイ一杯になってきたら関数化を考える、という方がいました。大きなプログラムを俯瞰(ふかん)できるメリットも関数化にはあります。

課題

以下の機能を持つ関数を作成せよ。
なお、作成するファイルには関数定義および関数の動作確認も含めること。

1~100までの数値を縦に1ずつ順に表示する関数 show1to100 を作成せよ。
ファイル名:kansu_1to100.py

実行イメージ

1
2
3
:
99
100
# 1~100までの数値を縦に1ずつ順に表示する関数 show1to100

# 関数定義
def show1to100():
	for i in range(1, 101):
		print(i)

show1to100()  # 関数呼び出し


引数に範囲を指定すると範囲の数値を横に1ずつ増やして表示する関数 show_range を作成せよ。
ファイル名:kansu_range.py

関数定義

def show_range( n, m):
 # 関数の処理

n範囲の最小値
m範囲の最大値

※ n<mである。n~mの範囲の数値を横向きに表示する

【使い方例】
 show_range(8, 12)

【表示結果】

8 9 10 11 12
# 範囲を指定して数値を表示する関数 show_range

def show_range(n, m):
	for i in range(n, m+1):
		print("{} ".format(i), end="")
	print()

# 関数show_rangeを実行
show_range(8, 12)
show_range(111, 120)

身長(cm)体重(kg)を引数に指定するとBMI値を返す関数 getBMI を作成せよ。
なお、作成した関数を確認する際は、身長と体重をキーボードから入力させ、小数点1桁を四捨五入して表示させよ。

ファイル名: kansu_bmi.py

【実行イメージ】

身長(cm)? 171.5 [Enter]
体重(kg)? 62.5 [Enter]
BMI値は 21.2 です

関数定義

def getBMI( height, weight):
 # 関数の処理

 return 《BMI値》

height身長 (cm)
weight体重 (kg)

BMI値 = 体重(kg) ÷ ( 身長(m) × 身長(m) )

※ 身長と体重、BMI値計算式の単位に注意!
※ height、weight、BMI値ともに実数型である

【使い方例】
 bmi = getBMI ( 171.5, 62.5 )

# 身長と体重を引数に指定するとBMI値を返す関数 getBMI

# 関数 getBMI定義
def getBMI(height, weight):
	height /= 100  # cm --> m
	bmi = weight / (height ** 2)  # BMI = 体重(kg) ÷ 身長(m)の2乗
	return bmi

# 身長と体重を入力
height = float(input("身長(cm)? "))
weight = float(input("体重(kg)? "))

# BMI値を求める(関数getBMI呼び出し)
bmi = getBMI(height, weight)

# 戻り値を整形して表示(小数点以下1桁で表示)
print("BMI値は {:.1f} です".format(bmi))

コメント

タイトルとURLをコピーしました