【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のさらなる魅力に触れていくことになるでしょう。お楽しみに!
コメント
コメントを投稿