【Python入門】コードを整理整頓!関数の作り方と使い方をマスターしよう (def, 引数, 戻り値) #6

「同じようなコードの塊が、プログラムのあちこちに出てきてしまう…」
「もっとプログラムをスッキリさせて、読みやすくできないかな?」

こんにちは! Pythonプログラミングの旅は進んでいますか? 前回はループ処理について学び、繰り返し作業を自動化する方法を身につけましたね。今回は、プログラムをさらに整理整頓し、より効率的で美しいコードを書くための強力なテクニック、「関数(かんすう)」について学んでいきましょう。

関数とは、簡単に言えば「特定の仕事をするための、名前が付いたコードのまとまり」のことです。一度作っておけば、必要な時に何度でも呼び出して使うことができます。この記事では、Pythonの関数の基本的な作り方(def文)、使い方、そして関数に情報を渡す「引数(ひきすう)」や、関数から結果を受け取る「戻り値(もどりち)」について、具体的なサンプルコードと共に分かりやすく解説します。関数を使いこなせば、あなたのPythonプログラミングは次のレベルへと進化しますよ!


1. 関数とは? プログラミングでなぜ必要なの?

プログラミングにおける関数とは、特定のタスクを実行するための一連の処理をひとまとめにし、それに名前を付けたものです。まるで、料理のレシピの中の「野菜を細かく刻む」とか「ソースを作る」といった個々の手順に名前を付けて、必要な時にその手順を実行するようなイメージです。

なぜ関数が必要(便利)なのでしょうか?

  • コードの再利用性が向上する: 同じ処理をプログラムの複数の場所で使いたい場合、その処理を関数として定義しておけば、関数名を呼び出すだけで何度でも同じ処理を実行できます。同じコードを何度も書く手間が省けます。
  • プログラムの可読性が向上する: 複雑な処理を関数にまとめることで、メインのプログラムの流れがスッキリとし、何をしているのかが理解しやすくなります。関数名がその処理内容を表していれば、さらに分かりやすくなります。
  • 保守性が向上する: もし処理内容に修正が必要になった場合、その関数定義の部分だけを修正すれば済みます。複数の場所に同じコードが散らばっていると、修正漏れやバグの原因になりやすいですが、関数化されていればそのリスクを減らせます。
  • プログラムのモジュール化(部品化): 大きなプログラムを、機能ごとに小さな関数(部品)に分割して作ることができます。これにより、開発やテストがしやすくなります。

関数は、あなたのプログラムをより整理され、効率的で、そしてエラーの少ないものにするための強力なツールなのです。


2. Pythonの関数の基本的な使い方

Pythonで関数を使うには、まず関数を「定義」し、その後でその関数を「呼び出す」というステップが必要です。

2.1. 関数の定義:オリジナルの「魔法の箱」を作る (def文)

関数を定義するには、defキーワードを使います。基本的な構文は以下の通りです。

def 関数名(引数1, 引数2, ...):
    # この関数が実行する処理
    # この部分はインデント(字下げ)する
    処理1
    処理2
    # return 戻り値  # (オプション:関数が何か結果を返す場合)

重要なポイント:

  • defキーワードで関数の定義を開始します。
  • defの後には、あなたが付けたい「関数名」を書きます。関数名は、変数名の付け方と同じルールと慣習に従うのが一般的です(例: スネークケース my_function_name)。
  • 関数名の後には丸括弧 () を付けます。この括弧の中に、後述する「引数」を指定できます(引数がない場合は空の括弧 () のままです)。
  • 丸括弧の後には必ずコロン (:) を付けます。
  • 関数が実行する処理(関数の本体)は、次の行からインデントして記述します。
  • 関数が何らかの結果を呼び出し元に返したい場合は、return文を使います(後述)。

サンプルコード:簡単な挨拶をする関数

# 「say_hello」という名前の関数を定義する
def say_hello():
    print("こんにちは、Pythonの世界へようこそ!")
    print("関数を学ぶのは楽しいですね。")

これでsay_helloという関数が定義されました。しかし、この時点ではまだ何も実行されません。

2.2. 関数の呼び出し:定義した関数を使ってみる

関数を定義しただけでは、その中の処理は実行されません。関数を実行するには、関数名を指定して「呼び出す」必要があります。

関数名(引数の値1, 引数の値2, ...)

サンプルコード:say_hello関数を呼び出す

# say_hello関数を定義 (再掲)
def say_hello():
    print("こんにちは、Pythonの世界へようこそ!")
    print("関数を学ぶのは楽しいですね。")

# say_hello関数を呼び出す
print("関数を呼び出します...")
say_hello()  # これで関数内のprint文が実行される
print("関数の呼び出しが終わりました。")

# 何度でも呼び出せる
say_hello()

実行結果 (例):

関数を呼び出します...
こんにちは、Pythonの世界へようこそ!
関数を学ぶのは楽しいですね。
関数の呼び出しが終わりました。
こんにちは、Pythonの世界へようこそ!
関数を学ぶのは楽しいですね。

3. 引数(ひきすう):関数に情報を渡して動作を変える

多くの場合、関数は外部から情報(データ)を受け取って、その情報に基づいて処理を行います。この関数に渡す情報のことを「引数(ひきすう)」と呼びます。引数を使うことで、同じ関数でも渡す値によって異なる結果を得たり、動作をカスタマイズしたりできます。

3.1. 引数のある関数の定義と呼び出し

関数定義の丸括弧 () の中に引数名を指定します。呼び出す際には、その引数に対応する値を渡します。

サンプルコード:名前を受け取って挨拶する関数

def greet(name):  # 'name'という名前の引数を1つ受け取る
    print(f"こんにちは、{name}さん!")

# 関数を呼び出す際に、引数'name'に値を渡す
greet("佐藤")
greet("鈴木")

my_friend_name = "田中"
greet(my_friend_name) # 変数を引数として渡すことも可能

実行結果 (例):

こんにちは、佐藤さん!
こんにちは、鈴木さん!
こんにちは、田中さん!

関数内で引数nameは、呼び出し時に渡された値("佐藤" や "鈴木" など)を持つ変数のように振る舞います。

3.2. 複数の引数を持つ関数

関数は複数の引数を受け取ることもできます。引数名をカンマ , で区切って定義します。

def add_two_numbers(num1, num2): # 'num1'と'num2'という2つの引数
    total = num1 + num2
    print(f"{num1} + {num2} = {total}")

add_two_numbers(5, 3)
add_two_numbers(100, 200)

実行結果 (例):

5 + 3 = 8
100 + 200 = 300

3.3. デフォルト引数値:引数を省略可能にする

関数を定義する際に、引数にデフォルトの値を設定しておくことができます。これにより、関数呼び出し時にその引数を省略すると、デフォルト値が使われます。

def introduce(name, age, country="日本"): # 'country'のデフォルト値を"日本"に設定
    print(f"私の名前は{name}、{age}歳です。出身は{country}です。")

introduce("山田", 28)                     # countryを省略するとデフォルト値が使われる
introduce("ジョン", 35, country="アメリカ") # countryを指定するとその値が使われる

実行結果 (例):

私の名前は山田、28歳です。出身は日本です。
私の名前はジョン、35歳です。出身はアメリカです。

注意:デフォルト引数値を持つ引数は、持たない引数の後に定義する必要があります。

3.4. キーワード引数:引数の順番を気にせず値を渡す

関数を呼び出す際に、引数名=値の形で値を渡す方法を「キーワード引数」と呼びます。キーワード引数を使うと、引数の順番を気にせずに値を渡すことができます。

def describe_pet(animal_type, pet_name):
    print(f"私は {animal_type} を飼っています。")
    print(f"名前は {pet_name} です。")

# 通常の引数 (位置引数)
describe_pet("犬", "ポチ")

print("---")
# キーワード引数 (順番を逆にしてもOK)
describe_pet(pet_name="タマ", animal_type="猫")

実行結果 (例):

私は 犬 を飼っています。
名前は ポチ です。
---
私は 猫 を飼っています。
名前は タマ です。

位置引数とキーワード引数を混ぜて使うこともできますが、その場合は位置引数を先に書く必要があります。


4. 戻り値(もどりち):関数から処理結果を受け取る

関数は、処理を実行した結果として、何らかの値を呼び出し元に返すことができます。この返される値のことを「戻り値(もどりち)」または「返り値(かえりち)」と呼びます。戻り値を使うにはreturn文を使用します。

4.1. return文の使い方

関数内でreturn 値と書くと、その「値」が関数の呼び出し元に返されます。return文が実行されると、その時点で関数の処理は終了します。

サンプルコード:二つの数を足し算して結果を返す関数

def calculate_sum(a, b):
    result = a + b
    return result  # 計算結果resultを返す

# 関数の戻り値を変数に代入
sum_value = calculate_sum(10, 25)
print(f"10と25の合計は: {sum_value} です。")

another_sum = calculate_sum(sum_value, 100) # 関数の戻り値を別の関数の引数に使う
print(f"さらに100を足すと: {another_sum} です。")

実行結果 (例):

10と25の合計は: 35 です。
さらに100を足すと: 135 です。

4.2. 複数の値を返す(タプルとして)

Pythonの関数は、カンマ,で区切ることで複数の値を一度に返すことができます。この場合、戻り値は「タプル」というデータ型になります。

def get_circle_properties(radius):
    pi = 3.14159
    circumference = 2 * pi * radius  # 円周
    area = pi * (radius ** 2)      # 面積
    return circumference, area # 円周と面積をタプルとして返す

# 戻り値を複数の変数で受け取る (アンパック)
circ, ar = get_circle_properties(5)
print(f"半径5の円の円周: {circ:.2f}") # .2f で小数点以下2桁表示
print(f"半径5の円の面積: {ar:.2f}")

# 戻り値を一つのタプルとして受け取ることも可能
properties = get_circle_properties(10)
print(f"半径10の円の情報 (タプル): {properties}")
print(f"その円周: {properties[0]:.2f}")

実行結果 (例):

半径5の円の円周: 31.42
半径5の円の面積: 78.54
半径10の円の情報 (タプル): (62.8318, 314.159)
その円周: 62.83

4.3. return文がない関数

関数にreturn文がない場合、またはreturn文があっても値が指定されていない場合、その関数は暗黙的に特別な値であるNone(ノン)を返します。print()関数のように、何かを表示するだけで特定の値を返さない関数もあります(これらは「副作用を持つ関数」と呼ばれることもあります)。

def simple_greet():
    print("Hello!")
    # return文がない

result = simple_greet()
print(f"simple_greetの戻り値: {result}")
print(type(result))

実行結果 (例):

Hello!
simple_greetの戻り値: None
<class 'NoneType'>

5. 変数の有効範囲(スコープ)について少しだけ

関数の中で定義(代入)された変数は、基本的にその関数の中だけで有効です。これを「ローカル変数」と呼びます。関数の外で定義された変数は「グローバル変数」と呼ばれ、関数の内外から参照できます(ただし、関数内でグローバル変数の値を変更するには特別な記述が必要で、注意が必要です)。

global_var = 100 # グローバル変数

def my_function():
    local_var = 10  # ローカル変数
    print(f"関数内から見たlocal_var: {local_var}")
    print(f"関数内から見たglobal_var: {global_var}")
    # global_var = 200 # 関数内でグローバル変数を変更しようとすると、新しいローカル変数が作られる (注意点あり)

my_function()

print(f"関数の外から見たglobal_var: {global_var}")
# print(local_var) # これはエラーになります!ローカル変数は関数の外からは見えない

変数の有効範囲(スコープ)は、プログラムが複雑になってくると非常に重要になる概念です。まずは「関数内で作った変数は、その関数の中だけのもの」と覚えておきましょう。


6. 実践的な例題に挑戦!

これまでの知識を使って、簡単な関数を作ってみましょう。

例題1:長方形の面積を計算して返す関数

def calculate_rectangle_area(width, height):
    """長方形の幅と高さを受け取り、面積を返す関数"""
    area = width * height
    return area

# 関数を使ってみる
w = 5
h = 10
rect_area = calculate_rectangle_area(w, h)
print(f"幅{w}、高さ{h}の長方形の面積は {rect_area} です。")

rect_area2 = calculate_rectangle_area(7, 3)
print(f"幅7、高さ3の長方形の面積は {rect_area2} です。")

関数の最初に"""Docstring(ドックストリング)"""として関数の説明を書くのは良い習慣です。

例題2:リスト内の偶数だけを合計する関数

def sum_even_numbers_in_list(numbers):
    """数値のリストを受け取り、その中の偶数のみを合計して返す関数"""
    total_even = 0
    for num in numbers:
        if num % 2 == 0: # 偶数かどうか
            total_even += num
    return total_even

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_sum = sum_even_numbers_in_list(my_list)
print(f"リスト {my_list} の中の偶数の合計は {even_sum} です。") # 結果: 30

まとめ:関数でプログラムを部品化し、もっと便利に!

今回は、Pythonの「関数」について、以下の内容を学びました。

  • 関数の定義方法 (defキーワード) と呼び出し方
  • 関数に情報を渡すための「引数」(デフォルト引数値、キーワード引数も)
  • 関数から結果を受け取るための「戻り値」(return文)
  • ローカル変数の基本的な考え方(スコープ)

関数は、プログラムを部品のように機能ごとにまとめ、再利用しやすく、そして読みやすくするための非常に重要な仕組みです。最初は少し難しく感じるかもしれませんが、自分で色々な関数を作って使ってみることで、その便利さが実感できるはずです。

関数を使いこなせるようになると、より複雑で大きなプログラムも、整理された形で効率的に開発できるようになります。次は、これらの関数をさらにまとめて管理するための「モジュール」や、より高度なデータ構造を扱う「クラス」(オブジェクト指向プログラミングの第一歩)など、Pythonのさらなる魅力に触れていくことになるでしょう。お楽しみに!


コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀