概要
関数を使うと、複数の処理をひとつにまとめることができます。
次のように関数を定義することができます。
def print_hello(name):
s = "Hello, " + name + "!"
print(s)
print_hello("tomato") # Hello, tomato!
関数って何?なぜ関数を使うの?
関数とは、複数の処理をひとまとめにして、後から他の場所で使えるようにしたものです。
プログラミングを学習し始めた人にとって、関数はやや難しく感じます。(私もそうでした)
ではなぜ関数を使うのでしょうか。
コードが簡潔になる
関数を使うと、コードが簡潔になり、書くのも読むのも楽になります。
例として、リストの最大値を求めるプログラムを見てみましょう。
# list1, list2, list3の最大値を求める。
list1 = [23, 12, 1, 4, 2, 11, 75]
list2 = [33, 24, 10, 30, 45, 21, 41]
list3 = [81, 44, 54, 72, 19, 46, 5]
max1 = list1[0]
for num in list1:
if num > max1:
max1 = num
max2 = list2[0]
for num in list2:
if num > max2:
max2 = num
max3 = list3[0]
for num in list3:
if num > max3:
max3 = num
print(max1, max2, max3) # 75 45 81
「リストって何?」という方は、以下の記事をご覧ください。
上記のプログラムは、list1、list2、list3に対して同じ処理を行っており、無駄が多いように感じます。そこで、「リストの最大値を求める」という処理を関数にしてみましょう。
# リストlの最大値を求める関数
def find_max(l):
max_num = l[0]
for num in l:
if num > max_num:
max_num = num
return max_num
# list1, list2, list3の最大値を求める。
list1 = [23, 12, 1, 4, 2, 11, 75]
list2 = [33, 24, 10, 30, 45, 21, 41]
list3 = [81, 44, 54, 72, 19, 46, 5]
max1 = find_max(list1)
max2 = find_max(list2)
max3 = find_max(list3)
print(max1, max2, max3) # 75 45 81
さっきよりも簡潔に書けて、何をやっているか分かりやすくもなりましたね。
別の場所で使うことができる
Pythonのソースコード中で定義した関数は、外部から使用することもできます。
先ほどのfind_max関数を書いたファイルをcode.pyという名前で保存した場合、code.pyと同じフォルダ内では次のようにfind_maxを呼び出すことができます。
from code import find_max
# list1, list2, list3の最大値を求める。
list1 = [23, 12, 1, 4, 2, 11, 75]
list2 = [33, 24, 10, 30, 45, 21, 41]
list3 = [81, 44, 54, 72, 19, 46, 5]
max1 = find_max(list1)
max2 = find_max(list2)
max3 = find_max(list3)
print(max1, max2, max3) # 75 45 81
こうしておけば、一度find_max関数を作れば、いろいろなところでfind_max関数を使うことができます。
さらに、組み込み関数(自分で定義せず、標準で使える関数)のmaxを用いても、同じことができます。
# list1, list2, list3の最大値を求める。
list1 = [23, 12, 1, 4, 2, 11, 75]
list2 = [33, 24, 10, 30, 45, 21, 41]
list3 = [81, 44, 54, 72, 19, 46, 5]
max1 = max(list1)
max2 = max(list2)
max3 = max(list3)
print(max1, max2, max3) # 75 45 81
他にも便利な組み込み関数はたくさんあります。関数の概念を知っておけば、様々な便利な処理を呼び出すことができますね。
関数の使い方
構文
関数の構文は以下の通りです。
def 関数名(引数1, 引数2, ...):
処理
引数
関数には、引数というものを渡すことができます。引数とは、関数の中で使用する値のことです。冒頭のprint_hello関数の例だと、nameが引数です。
まず、引数なしの関数の例を見てみましょう。
def print_hello():
print("Hello!")
単に”Hello!”と表示するだけの関数です。関数を呼び出すときは次のように書きます。
print_hello() # Hello!
関数は複数の引数をとることもできます。
以下は引数を2つとる関数の例です。
def print_hello(name1, name2):
s = "Hello, " + name1 + " and " + name2 + "!"
print(s)
print_hello("tomato", "broccoli") # Hello, tomato and broccoli!
引数名を指定して呼び出すこともできます。このようにして指定される引数をキーワード引数といいます。
print_hello(name1="tomato", name2="broccoli") # Hello, tomato and broccoli!
print_hello(name2="broccoli", name1="tomato") # Hello, tomato and broccoli!
引数にはデフォルト値を持たせることもできます。
以下の例では、引数name2のデフォルト値を”carrot”としています。こうした場合、name2を指定せずに関数print_helloを呼び出すと、name2には”carrot”が代入された状態で関数内の処理が実行されます。
def print_hello(name1, name2="carrot"):
s = "Hello, " + name1 + " and " + name2 + "!"
print(s)
print_hello("tomato", "broccoli") # Hello, tomato and broccoli!
print_hello("tomato") # Hello, tomato and carrot!
ただし、デフォルト値がある引数はデフォルト値がない引数よりも先に(左に)書くことはできません。
REPLで定義しようとすると、以下のようなエラーとなります。
>>> def print_hello(name1="tomato", name2):
File "<stdin>", line 1
def print_hello(name1="tomato", name2):
^^^^^
SyntaxError: non-default argument follows default argument
戻り値
関数が返す値のことを戻り値といいます。return文を用いて戻り値を指定することができます。returnを実行せずに関数の処理が終了する場合や、return文で戻り値を指定しない場合は、戻り値はNoneになります。
def add(x, y):
return x + y
print(add(10, 15)) # 25
def do_nothing():
pass # 何もしない
print(do_nothing()) # None
練習問題
関数を書く練習をしてみましょう。
文字列を出力する関数
文字列”tomato!”を表示する関数print_tomatoを定義してください。
def print_tomato():
print("tomato!")
引数の2乗を返す関数
1つの引数を整数として受け取り、その引数の2乗を返す関数powerを定義してください。
例えば、power(3)は9を、power(5)は25を返します。
def power(x):
return x * x
文字数をカウントする関数
1つの引数を文字列として受け取り、その文字列中にa、b、cが合計何個含まれるかを返す関数count_abcを定義してください。
例えば、count_abc(“banana”)は4を、count_abc(“aabbccdd”)は6を、count_abc(“xxyyzz”)は0を返します。
def count_abc(s):
count = 0
for c in s:
if c == "a" or c == "b" or c == "c":
count += 1
return count