Python入門 第8回:関数の定義と使い方

Python入門 第8回:関数の定義と使い方 Python

はじめに

これまでの記事では、変数やリスト、辞書、繰り返し処理、条件分岐など、Pythonプログラムを作成するうえで必要となる基本的な機能を学んできました。

プログラムが短いうちは、処理を上から順番に記述するだけでも問題ありません。しかし、プログラムが長くなるにつれて、同じような処理を何度も書く場面が増えてきます。

たとえば、次のようなあいさつを複数回表示したいとします。

print("こんにちは")
print("Pythonの学習を始めましょう")

print("こんにちは")
print("Pythonの学習を始めましょう")

print("こんにちは")
print("Pythonの学習を始めましょう")

この書き方でも実行できますが、同じ処理を何度も書いているため、プログラムが長くなってしまいます。

また、表示する文章を変更したくなった場合は、すべての箇所を修正しなければなりません。

このような重複した処理をまとめるために使用するのが、今回学習する「関数」です。

関数を使用すると、複数の処理をひとつにまとめ、必要なときに何度でも呼び出せるようになります。

今回は、次の内容について解説します。

  • defを使用した関数の作成
  • 関数の呼び出し方
  • 引数の使い方
  • 戻り値の使い方
  • printreturnの違い
  • 関数を使用するときの注意点

関数とは

関数とは、複数の処理をひとつにまとめたものです。

一度関数を作成しておけば、関数名を指定するだけで、まとめた処理を何度でも実行できます。

これまでの記事でも、すでにいくつかの関数を使用しています。

print("Hello")
len("Python")
int("100")

print()len()int()などは、Pythonにあらかじめ用意されている関数です。

それぞれ、次のような役割があります。

  • print():文字列や数値を画面に表示する
  • len():文字列やリストの要素数を取得する
  • int():文字列や小数を整数に変換する

Pythonにあらかじめ用意されている関数は「組み込み関数」と呼ばれます。

一方で、プログラムを作成する人が独自に作る関数は「ユーザー定義関数」と呼ばれます。

今回の記事では、自分で関数を作成する方法を学習します。


defによる関数の作成

Pythonで関数を作成するときは、defを使用します。

基本的な書き方は次のとおりです。

def 関数名():
    実行する処理

defのあとに関数名を記述し、その後ろに丸括弧とコロンを付けます。

関数の中で実行する処理は、次の行からインデントして記述します。

実際に、あいさつを表示する関数を作成してみましょう。

def greeting():
    print("こんにちは")
    print("Pythonの学習を始めましょう")

このプログラムでは、greetingという名前の関数を定義しています。

ただし、関数を定義しただけでは、関数内の処理は実行されません。

関数を実行するためには、関数を呼び出す必要があります。


関数の呼び出し方

作成した関数を実行するときは、関数名の後ろに丸括弧を付けて記述します。

def greeting():
    print("こんにちは")
    print("Pythonの学習を始めましょう")


greeting()

実行結果は次のようになります。

こんにちは
Pythonの学習を始めましょう

greeting()と記述することで、関数内にまとめた処理が実行されます。

関数は何度でも呼び出せます。

def greeting():
    print("こんにちは")
    print("Pythonの学習を始めましょう")


greeting()
greeting()
greeting()

実行結果は次のようになります。

こんにちは
Pythonの学習を始めましょう
こんにちは
Pythonの学習を始めましょう
こんにちは
Pythonの学習を始めましょう

同じ処理を何度も直接記述する必要がないため、プログラムが短くなり、内容も分かりやすくなります。

関数名の付け方

関数名には、変数名と同じように、英字、数字、アンダースコアを使用できます。

ただし、関数名の先頭に数字を使用することはできません。

def greeting_message():
    print("こんにちは")

Pythonでは、複数の単語を組み合わせた関数名には、アンダースコアを使用する書き方が一般的です。

また、関数名を見るだけで、どのような処理を行う関数なのか分かる名前を付けることが重要です。

def calculate_total():
    pass


def show_message():
    pass


def check_age():
    pass

passは、処理をまだ記述していない場所に一時的に使用できる命令です。


引数の使い方

同じ関数を呼び出す場合でも、状況によって処理する値を変更したいことがあります。

そのような場合に使用するのが「引数」です。

引数を使用すると、関数を呼び出すときに値を渡せます。


ひとつの引数を使用する

次のプログラムでは、名前を受け取ってあいさつを表示します。

def greeting(name):
    print(name + "さん、こんにちは")


greeting("田中")
greeting("佐藤")

実行結果は次のようになります。

田中さん、こんにちは
佐藤さん、こんにちは

関数を定義するときに、丸括弧の中へnameを記述しています。

def greeting(name):

このnameが、関数の中で使用する値を受け取ります。

関数を呼び出すときは、丸括弧の中に実際の値を指定します。

greeting("田中")

この場合、文字列の"田中"nameに渡されます。

そのため、関数内では次の処理が行われます。

print("田中" + "さん、こんにちは")

厳密には、関数を定義するときに記述するnameのような変数を「仮引数」、関数を呼び出すときに渡す"田中"のような値を「実引数」と呼びます。

初心者向けの説明では、どちらもまとめて「引数」と呼ばれることが多くあります。


複数の引数を使用する

関数には、複数の引数を指定できます。

複数の引数を使用するときは、カンマで区切って記述します。

def introduce(name, age):
    print("名前は" + name + "です")
    print("年齢は" + str(age) + "歳です")


introduce("田中", 25)

実行結果は次のようになります。

名前は田中です
年齢は25歳です

この関数では、nameageの2つの引数を受け取っています。

def introduce(name, age):

関数を呼び出すときも、2つの値を指定します。

introduce("田中", 25)

引数は、基本的に左から順番に渡されます。

name = "田中"
age = 25

引数の順番を間違えると、意図しない結果になるため注意しましょう。


キーワード引数

引数名を指定して値を渡す方法もあります。

def introduce(name, age):
    print("名前は" + name + "です")
    print("年齢は" + str(age) + "歳です")


introduce(age=25, name="田中")

実行結果は次のようになります。

名前は田中です
年齢は25歳です

このように、引数名を指定して値を渡す方法を「キーワード引数」と呼びます。

引数名を指定しているため、関数を定義したときと異なる順番でも値を渡せます。

ただし、通常はプログラムが読みやすくなる順番で記述するようにしましょう。


引数の初期値

関数を定義するときに、引数の初期値を設定することもできます。

def greeting(name="ゲスト"):
    print(name + "さん、こんにちは")


greeting("田中")
greeting()

実行結果は次のようになります。

田中さん、こんにちは
ゲストさん、こんにちは

greeting("田中")では、指定した"田中"が使用されます。

一方、greeting()では引数が指定されていないため、初期値として設定した"ゲスト"が使用されます。

引数の初期値は「デフォルト引数」とも呼ばれます。


戻り値の使い方

関数で計算した結果を、関数の外側で使用したいことがあります。

そのような場合は、returnを使用します。

returnを使用して関数の外側へ返す値を「戻り値」と呼びます。

基本的な書き方は次のとおりです。

def 関数名():
    処理
    return 戻り値

2つの数値を足し算する関数を作成してみましょう。

def add(a, b):
    result = a + b
    return result


answer = add(10, 20)
print(answer)

実行結果は次のようになります。

30

関数内では、a + bの計算結果をresultに代入しています。

result = a + b

その後、return resultによって、計算結果を関数の呼び出し元へ返しています。

return result

返された値は、変数に代入できます。

answer = add(10, 20)

この場合、add(10, 20)の戻り値である30が、answerに代入されます。


計算結果を直接返す

戻り値を一度変数に代入せず、計算結果を直接返すこともできます。

def add(a, b):
    return a + b


answer = add(10, 20)
print(answer)

実行結果は同じです。

30

処理が短い場合は、こちらの方が簡潔に記述できます。


戻り値をそのまま使用する

関数の戻り値は、変数に代入せず、そのまま別の処理に使用することもできます。

def add(a, b):
    return a + b


print(add(10, 20))

実行結果は次のようになります。

30

戻り値をさらに計算に使用することもできます。

def add(a, b):
    return a + b


total = add(10, 20) * 2
print(total)

実行結果は次のようになります。

60

複数の値を返す

Pythonの関数では、複数の値をまとめて返すこともできます。

def calculate(a, b):
    addition = a + b
    subtraction = a - b
    return addition, subtraction


add_result, sub_result = calculate(10, 3)

print(add_result)
print(sub_result)

実行結果は次のようになります。

13
7

この関数では、足し算と引き算の結果をまとめて返しています。

return addition, subtraction

受け取る側でも、2つの変数を用意します。

add_result, sub_result = calculate(10, 3)

複数の戻り値は、実際には「タプル」としてまとめて返されています。

そのため、ひとつの変数で受け取ることもできます。

def calculate(a, b):
    addition = a + b
    subtraction = a - b
    return addition, subtraction


result = calculate(10, 3)
print(result)

実行結果は次のようになります。

(13, 7)

returnが実行されると関数が終了する

returnが実行されると、その時点で関数の処理は終了します。

def sample():
    print("処理1")
    return
    print("処理2")


sample()

実行結果は次のようになります。

処理1

returnより後ろにあるprint("処理2")は実行されません。

この仕組みは、条件によって関数を途中で終了させたい場合にも使用できます。

def check_age(age):
    if age < 0:
        return "年齢には0以上の値を指定してください"

    return str(age) + "歳です"


print(check_age(-1))
print(check_age(25))

実行結果は次のようになります。

年齢には0以上の値を指定してください
25歳です

printとreturnの違い

初心者が混乱しやすいのが、printreturnの違いです。

printは、値を画面に表示するための関数です。

一方、returnは、関数内で作成した値を関数の外側へ返すために使用します。

次のプログラムを見てみましょう。

def add_print(a, b):
    print(a + b)


def add_return(a, b):
    return a + b

add_printは、計算結果を画面に表示します。

add_print(10, 20)

実行結果は次のようになります。

30

ただし、計算結果を関数の外側で使用することはできません。

result = add_print(10, 20)
print(result)

実行結果は次のようになります。

30
None

最初の30は、関数内のprintによって表示されたものです。

その後に表示されるNoneは、関数に戻り値が設定されていないことを表します。

一方、returnを使用した関数では、計算結果を変数に代入できます。

result = add_return(10, 20)
print(result)

実行結果は次のようになります。

30

戻り値は、別の計算にも使用できます。

result = add_return(10, 20)
double_result = result * 2

print(double_result)

実行結果は次のようになります。

60

画面に結果を表示するだけであればprintを使用します。

計算結果を後の処理でも使用したい場合は、returnを使用しましょう。


関数内で使用する変数

関数内で作成した変数は、基本的に関数の外側から使用できません。

def calculate():
    result = 10 + 20
    print(result)


calculate()
print(result)

このプログラムを実行すると、エラーが発生します。

NameError: name 'result' is not defined

resultは関数内で作成された変数であるため、関数の外側では使用できません。

このように、関数内でのみ使用できる変数を「ローカル変数」と呼びます。

関数内で計算した結果を外側で使用したい場合は、returnを使用します。

def calculate():
    result = 10 + 20
    return result


answer = calculate()
print(answer)

実行結果は次のようになります。

30

関数ごとに使用する変数を分けることで、ほかの処理によって意図せず値が変更されることを防げます。


関数を組み合わせたプログラム

関数は、ほかの関数と組み合わせて使用できます。

商品の金額と個数から小計を計算し、さらに消費税込みの金額を計算するプログラムを作成してみましょう。

def calculate_subtotal(price, quantity):
    return price * quantity


def calculate_tax_included(subtotal, tax_rate=0.1):
    return subtotal * (1 + tax_rate)


subtotal = calculate_subtotal(1000, 3)
total = calculate_tax_included(subtotal)

print("小計:" + str(subtotal) + "円")
print("税込金額:" + str(int(total)) + "円")

実行結果は次のようになります。

小計:3000円
税込金額:3300円

このプログラムでは、役割ごとに関数を分けています。

calculate_subtotal関数は、小計を計算します。

def calculate_subtotal(price, quantity):
    return price * quantity

calculate_tax_included関数は、小計から税込金額を計算します。

def calculate_tax_included(subtotal, tax_rate=0.1):
    return subtotal * (1 + tax_rate)

ひとつの関数にすべての処理を詰め込むのではなく、役割ごとに関数を分けることで、プログラムの内容が分かりやすくなります。

また、税率だけを変更したい場合や、小計の計算だけを別の場所で使用したい場合にも対応しやすくなります。


関数でよくあるエラー

関数を使用するときに発生しやすいエラーを確認しておきましょう。


関数内のインデントがない

次のプログラムでは、関数内の処理がインデントされていません。

def greeting():
print("こんにちは")

Pythonでは、関数の中に記述する処理をインデントする必要があります。

正しい書き方は次のとおりです。

def greeting():
    print("こんにちは")

関数を呼び出していない

関数を定義しただけでは、処理は実行されません。

def greeting():
    print("こんにちは")

このプログラムを実行しても、何も表示されません。

関数を実行するには、関数を呼び出します。

def greeting():
    print("こんにちは")


greeting()

丸括弧を付けていない

関数を呼び出すときは、関数名の後ろに丸括弧が必要です。

def greeting():
    print("こんにちは")


greeting

この場合、関数そのものを指定しているだけで、関数内の処理は実行されません。

正しくは次のように記述します。

greeting()

引数の数が合っていない

2つの引数が必要な関数に、ひとつしか値を渡さない場合はエラーになります。

def add(a, b):
    return a + b


print(add(10))

実行すると、引数が不足していることを示すエラーが発生します。

TypeError: add() missing 1 required positional argument: 'b'

関数を定義したときと同じ数の引数を渡します。

print(add(10, 20))

returnの位置が間違っている

次のプログラムでは、繰り返し処理の途中でreturnが実行されています。

def calculate_total(numbers):
    total = 0

    for number in numbers:
        total += number
        return total

returnが最初の繰り返しで実行されるため、すべての数値を合計できません。

正しくは、繰り返し処理が終了した後にreturnを記述します。

def calculate_total(numbers):
    total = 0

    for number in numbers:
        total += number

    return total


result = calculate_total([10, 20, 30])
print(result)

実行結果は次のようになります。

60

returnが実行されると、その時点で関数が終了することを覚えておきましょう。


練習問題

最後に、今回学習した内容を使用して、簡単な関数を作成してみましょう。

問題1

名前を引数として受け取り、次の文章を表示する関数を作成してください。

田中さん、ようこそ

解答例は次のとおりです。

def welcome(name):
    print(name + "さん、ようこそ")


welcome("田中")

問題2

2つの数値を引数として受け取り、掛け算の結果を戻り値として返す関数を作成してください。

解答例は次のとおりです。

def multiply(a, b):
    return a * b


result = multiply(5, 4)
print(result)

実行結果は次のようになります。

20

問題3

点数を引数として受け取り、60点以上の場合は"合格"、60点未満の場合は"不合格"を返す関数を作成してください。

解答例は次のとおりです。

def check_score(score):
    if score >= 60:
        return "合格"
    else:
        return "不合格"


print(check_score(80))
print(check_score(50))

実行結果は次のようになります。

合格
不合格

前回学習した条件分岐と関数を組み合わせることで、条件に応じて異なる結果を返せます。


まとめ

今回は、Pythonにおける関数の定義と使い方について学習しました。

関数を作成するときは、defを使用します。

def greeting():
    print("こんにちは")

作成した関数は、関数名の後ろに丸括弧を付けて呼び出します。

greeting()

関数へ値を渡したい場合は、引数を使用します。

def greeting(name):
    print(name + "さん、こんにちは")


greeting("田中")

関数内で計算した結果を外側へ返したい場合は、returnを使用します。

def add(a, b):
    return a + b


result = add(10, 20)
print(result)

関数を使用することで、次のようなメリットがあります。

  • 同じ処理を何度も書く必要がなくなる
  • プログラムが読みやすくなる
  • 処理の修正が簡単になる
  • 複雑なプログラムを役割ごとに分けられる
  • 作成した処理をほかの場所でも再利用できる

プログラムが長くなるほど、関数の重要性は高くなります。

最初のうちは、どの処理を関数にすればよいのか迷うこともあります。まずは、「同じ処理を何度も書いている部分」や「ひとつの目的を持った処理」を関数としてまとめてみましょう。

関数、条件分岐、繰り返し処理を組み合わせることで、より実用的なPythonプログラムを作成できるようになります。

コメント

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