【Python基本文法】関数の使い方

文法

概要

関数を使うと、複数の処理をひとつにまとめることができます。

次のように関数を定義することができます。

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
タイトルとURLをコピーしました