初心者向け!Pythonで関数を定義(def)する方法

pythonを使用している人を表す
  • URLをコピーしました!

Pythonで関数を定義し、使いこなすことは、コードをより効率的で読みやすくする鍵です。
しかし、「関数ってなに?」「どうやって自分のプログラムで使うの?」という疑問や不安を抱えている方も多いでしょう。
この記事では、関数の定義方法から、引数や戻り値の扱い方、さらにはローカル変数の独立性に至るまで、分かりやすく解説します。
コード例と共に、関数の作成と利用の基本を学び、プログラミングにおける関数のメリットを最大限に活かす方法を紹介します。
この記事を読めば、あなたも関数を自在に操ることができるようになり、プログラミングがもっと楽しく、効率的になるはずです!

目次

Python関数とは?初心者にも分かる基本概念

関数とは何か?プログラミングにおける役割

関数とは、プログラミングにおいて、特定のタスクを実行するためのコードの集まりです。

関数を使うことで、同じコードを何度も書かずに済み、プログラムの可読性や再利用性が高まります。

Pythonでは、defキーワードを使用して関数を定義します。

defは「define」の略で、Pythonに「これから関数を定義するよ」と伝えます。

これにより、コードの整理と管理が容易になり、複雑なプログラムも読みやすくなります。

プログラミングで同じコードを何度も書くのは正直面倒ですよね。

そんな時に役立つのが関数です。

Pythonにおける関数の特徴

Pythonの関数は使い勝手が良く、柔軟性があります。

関数はデータを受け取り(これを引数と呼びます)、処理を行った後に結果を返すことができます(これを戻り値と呼びます)。

Pythonでは、どんなタイプのデータも引数として渡したり、戻り値として返したりすることが可能です。

Pythonで関数を定義する方法

STEP
defキーワードを使用する

defは「define」の略で、Pythonに「これから関数を定義するよ」と伝えます。

STEP
関数を定義する

まず関数名を決め、その後に括弧()を書きます。

def 関数名()  必要に応じて引数を括弧内に記述します。

def 関数名(引数1,引数2,・・・・)

STEP
関数が実行する処理を記述

if文やfor文とブロックと同様、字下げ(インデント)して記述します。

STEP
関数の定義が終わったら、その関数を呼び出して実行する
def 関数名():
   関数の処理内容

   # 関数の呼び出し
関数名()
  • 関数名: 関数に付ける名前
  • 引数: 関数に渡す値。複数の場合はカンマで区切ります。
  • 関数の処理内容: 関数内で実行される処理
  • 戻り値: 関数から返す値。省略することもできます。

関数を使うメリット:コードの再利用性を高める

関数を使う最大のメリットは、コードの再利用性を高めることにあります。

一度関数として定義しておけば、必要なときにいつでもその関数を呼び出して使うことができます。

これにより、コードの重複を避け、プログラム全体の構造を清潔に保つことができます。

  • コードをスッキリ: 同じ処理を何度も書く必要がなくなり、コードがスッキリと見やすくなります。
  • 再利用で効率アップ: 作った関数は、他のプログラムでも自由に呼び出すことができます。
  • バグを見つけやすい: 関数ごとに処理をまとめることで、バグを見つけやすく、修正も簡単になります。
  • プログラミングが楽しくなる: 関数を使うと、複雑な処理も簡単に記述でき、プログラミングがより楽しくなります。

Pythonで関数を定義する:defの基本

defキーワードを使った関数の定義方法

Pythonで関数を定義するには、defキーワードを使用します。

例1: 引数なしの関数

この例では、挨拶という名前の関数を定義しています。

この関数は引数を取らず、単に「こんにちは!」と画面に表示します。

関数を呼び出すには、関数名に続けて()を記述します。

# 関数の定義
def 挨拶():
    print("こんにちは!")     #関数が実行する処理を記述する

# 関数の呼び出し
挨拶()
こんにちは!

例2: 引数を取る関数

この例では、挨拶する人という名前の関数を定義しており、この関数は名前という引数を一つ取ります。

関数が呼び出されると、引数で指定された名前を使って挨拶を行います。

# 関数の定義
def 挨拶する人(名前):
    print(f"こんにちは、{名前}さん!")

# 関数の呼び出し
挨拶する人("太郎")
こんにちは、太郎さん!

例3: 戻り値を返す関数

基本的な構文は次のようになります。

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

この例では、二つの数の合計という名前の関数を定義しています。

この関数は二つの引数abを取り、その合計を計算して返します。

関数を呼び出した後、その戻り値(この場合は二つの数の合計)を変数合計に格納し、printを使って出力します。

# 関数の定義
def 二つの数の合計(a, b):
    return a + b

# 関数の呼び出しと戻り値の使用
合計 = 二つの数の合計(5, 3)
print(合計)
8

ちなみに下記のような書き方もありますが、上記が一般的です。

# 関数の定義
def 二つの数の合計(a, b):
    合計値=a+b
    print(合計値)
    return 合計値


# 関数の呼び出しと戻り値の使用
合計 = 二つの数の合計(5, 3)

関数のドキュメント文字列(Docstrings)の書き方

Pythonでは、関数の直後に三重引用符(""")で囲んだテキストを記載することで、その関数のドキュメント文字列(Docstrings)を定義できます。

ドキュメント文字列は、関数の目的、引数の説明、戻り値の説明など、関数に関する重要な情報を提供します。

これにより、他の開発者がコードを読んだり、help()関数を使用して関数の使い方を調べたりする際に、役立つ情報を得ることができます。

以下に、簡単な関数の定義とそのドキュメント文字列の記述方法の例を示します。

def add_numbers(a, b):
    """
    二つの数値の和を計算する。

    Parameters:
    a (int): 第一の数値
    b (int): 第二の数値

    Returns:
    int: aとbの和

    Example:
    >>> add_numbers(2, 3)
    5
    """
    return a + b
print(add_numbers(2, 3))
5

この例では、add_numbers関数にドキュメント文字列を追加しています。

このドキュメント文字列は、関数が何をするのか(二つの数値の和を計算する)、引数の説明(abは整数である)、戻り値の説明(整数を返す)、そして具体的な使用例を提供しています。

上記のコードで定義されているadd_numbers関数についてhelp()関数を使用してドキュメントを取得する方法を見ていきましょう。

非常に簡単で、以下のコードで、add_numbers関数に対して記述されたドキュメンテーション文字列(docstring)が表示されます。

help(add_numbers)
Help on function add_numbers in module __main__:

add_numbers(a, b)
    二つの数値の和を計算する。
    
    Parameters:
    a (int): 第一の数値
    b (int): 第二の数値
    
    Returns:
    int: aとbの和
    
    Example:
    >>> add_numbers(2, 3)
    5

関数名とパラメータ:基本ルール

関数名は、その関数が何をするのかを表すように命名します。

Pythonでは、関数名には英小文字を使用し、複数の単語をアンダースコア(_)でつなげるスネークケースが一般的です。

例:add_numbers

ただし、関数名を日本語で定義しても実行することはできます。

パラメータ(引数)は、関数が受け取るデータの「変数名」で、この変数を通じて関数内の処理が行われます。

引数と戻り値:関数の入出力を理解する

引数のデフォルト値

Pythonの関数では、引数にデフォルト値を設定することができます。

この機能を利用すると、関数呼び出し時に特定の引数を省略した場合、定義したデフォルト値が自動的に使用されます。

まずは、デフォルト値で関数を呼び出した場合です。

def 魔法の杖(攻撃力=10, 回復力=5):
   
    return f"攻撃力は{攻撃力}、回復力は{回復力}"

# デフォルト値を使って関数を呼び出し、戻り値を出力
print(魔法の杖())
攻撃力は10、回復力は5

次に、引数を指定して関数を呼び出した場合です。

def 魔法の杖(攻撃力=10, 回復力=5):
    
    return f"攻撃力は{攻撃力}、回復力は{回復力}"


# 引数を指定して関数を呼び出し、戻り値を出力
print(魔法の杖(15, 10))
攻撃力は15、回復力は10

位置引数とキーワード引数

位置引数

位置引数は、関数定義における引数の順番に基づいて、値を渡します。

これは最も一般的な引数の渡し方で、引数を関数に渡す際には定義された順序を守る必要があります。

def 挨拶する(名前, 年齢):
    return f"こんにちは、私の名前は{名前}です。{年齢}歳です。"
# 位置引数を使用して呼び出す場合
挨拶文 = 挨拶する("太郎", 30)


# 戻り値を出力
print(挨拶文)
こんにちは、私の名前は太郎です。30歳です。

この例では、挨拶する関数に"太郎"30という二つの引数を順番に渡しています。

最初の引数"太郎"名前パラメータに、二番目の引数30年齢パラメータにそれぞれ対応しています。

このように引数を渡した場合、関数は引数をその順番に従って処理します。

位置引数を使用する際は、引数の順序が非常に重要です。
引数の順序を間違えると、意図しない動作やエラーが発生する可能性があります。

キーワード引数

キーワード引数は、関数を呼び出す際に、引数の名前を明示的に指定する方法です

キーワード引数を使用すると、引数の順番を気にすることなく、関数に値を渡すことができます。

def 挨拶する(名前, 年齢):
    return f"こんにちは、私の名前は{名前}です。{年齢}歳です。"
# キーワード引数を使用して関数を呼び出し
挨拶文 = 挨拶する(年齢=30,名前="太郎")

# 戻り値を出力
print(挨拶文)
こんにちは、私の名前は太郎です。30歳です。

この例では、引数年齢名前の順番を関数定義時とは逆にしていますが、関数の振る舞いは変わりません。

キーワード引数を使用することで、引数の名前を明示的に指定しているため、関数内で正しい引数に値が渡されます。

Python関数の応用:引数の種類を深掘り

可変長引数:*argsと**kwargsの使い方

Pythonで関数を作成する際、時には「いくつ引数が渡されるかわからない」という状況があります。

そんな時に非常に便利なのが、*argsと**kwargsという二つの特別な引数です。

これらを使うことで、関数に任意の数の引数を柔軟に受け取ることができ、より動的なプログラムを実現できます。

*argsについて

*argsを使うメリットは、関数に任意の数の引数を渡すことができる点にあります。

つまり、関数を作るときに「この関数は何個でも引数を受け取れるよ」って教えてくれます。

*は「いくつでもいいよ」という意味です。

これを使うと、関数に渡される引数を全部一つのタプル(変更できないリストのようなもの)として受け取ることができます。

ちなみに、「args」は引数(arguments)の略です。

例えば、いくつかのフルーツの名前を引数として渡し、それらを列挙する関数があるとしましょう。

def list_fruits(*args):
    for fruit in args:
        print(fruit)
        
list_fruits('リンゴ', 'バナナ', 'チェリー')
リンゴ
バナナ
チェリー

もし*argsを使っていなかったら、各fruitsごとに関数を呼び出す必要があったでしょう。

**kwargsについて

**kwargsは、キーワード引数(名前付き引数)を任意の数だけ関数に渡すことができる特別な引数です。

**は「キーワード引数ならいくつでもいいよ」という意味です。

これを使うと、関数に渡されるキーワード引数を全部一つの辞書として受け取ることができます。

例えば、お友達の名前と、そのお友達の好きな食べ物や色など、いろんな情報を一度に表示する関数を考えてみましょう。

def favorite_things(**things):
    for name, favorite in things.items():
        print(f"{name}のお気に入りは{favorite}です!")

favorite_things(アリス="チョコレート", ボブ="サッカー", チャーリー="青")
アリスのお気に入りはチョコレートです!
ボブのお気に入りはサッカーです!
チャーリーのお気に入りは青です!

関数内関数

Pythonでプログラミングをしていると、時々、ある関数の中でだけ必要な処理があります。

そのような時、その処理を行う小さな関数をその大きな関数の中に作ることができます。

これが「関数内関数」、または「ネストされた関数」と呼ばれるものです。

なぜ関数内関数を使うのか?

  • 整理整頓:関数内関数を使うと、コードが整理されて読みやすくなります。
    特定の処理をする部分を小さな関数として分けることで、大きな関数が何をしているのか理解しやすくなります。
  • 隠蔽:関数の中で定義された関数は、その外側からは見えません(呼び出せません)。
    これにより、その関数内部でのみ使用される特定の処理を「隠す」ことができます。
    他の部分から間違って呼び出されることがなく、より安全なコードを書くことができます。

例:パーティーの招待状を作る

例えば、パーティーの招待状を作る関数があるとします。
この招待状には、招待された人の名前と、パーティーの日時が書かれています。
ここで、日時をきれいに書くための小さな関数を使いたいとしましょう。

def create_invitation(name, day, month, year):
    def format_date():
        # 日付を「日/月/年」の形式で返す
        return f"{day}/{month}/{year}"
    
    date = format_date()  # 関数内関数を呼び出して日付を整形
    return f"{name}さん、{date}にパーティーへ招待します!"

# 招待状の文を印刷するために、create_invitation関数を呼び出します。
invitation = create_invitation("Tomo", 25, 12, 2023)
print(invitation)
Tomoさん、25/12/2023にパーティーへ招待します!

この例では、create_invitation関数が大きな関数で、format_dateがその中に作られた小さな関数です。

format_date関数は日付をきれいに整形して、それをcreate_invitation関数が使って、最終的な招待状の文を作ります。

関数の使用時に気をつけること

組み込み関数名の使用を避ける

Pythonにはinputprintlenなど、あらかじめ定義されている組み込み関数があります。

これらの関数はPythonプログラミングの基本的な部分を構成しており、どのPythonプログラムからもアクセスできます。
これらの組み込み関数名を新たに関数や変数の名前として使用すると、元の組み込み関数が上書きされてしまい、プログラム全体に影響を与える可能性があります。

例:input関数の誤った上書き

def input(prompt):
    print(f"入力されたプロンプト: {prompt}")
    return "ダミーの入力"

# この後、Pythonの組み込み関数inputを使用しようとすると、
# 上で定義したinput関数が呼ばれるため、期待通りに動作しない。
user_input = input("あなたの名前は? ")
print(user_input)

この例では、組み込み関数inputを上書きしてしまっています。
これにより、ユーザーからの実際の入力を受け取ることができなくなります。

ローカル変数の独立性

ローカル変数の独立性って何?って思うかもしれませんね。

この話をする前に、「ローカル変数」って何かを説明していきます。

ローカル変数とは、簡単に言うと、特定の場所(主に関数の中)でだけ使える変数のことです。
外の世界(関数の外)とは完全に切り離されていて、外からは見ることも触ることもできません。

例えば、あなたがゲームで「スコア」を計算するプログラムを書いているとします。
この「スコア」を計算する部分を「関数」という小さなプログラムのブロックで作ることにしました。

def calculate_score():
    score = 10  # これがローカル変数です
    print("スコア:", score)

calculate_score()  
スコア: 10

このコードでは、scorecalculate_score関数の中で定義されています。
つまり、scoreはこの関数の中でだけ使われる変数で、関数の外からはアクセスできないのです。

「独立性」というのは、このローカル変数が、他の場所(他の関数など)で起きることに影響されない、という意味です。
たとえば、もう一つ違う関数で同じ名前の変数を使っても、それぞれの関数の変数は全く別物として扱われます。

def player1_score():
    score = 20  # player1のスコア
    print("プレイヤー1のスコア:", score)

def player2_score():
    score = 30  # player2のスコア、player1のスコアとは全く関係ない
    print("プレイヤー2のスコア:", score)

player1_score()  # プレイヤー1のスコア: 20
player2_score()  # プレイヤー2のスコア: 30
プレイヤー1のスコア: 20
プレイヤー2のスコア: 30

この例で、player1_scoreplayer2_score関数の中のscore変数は、名前は同じでも「ローカル変数の独立性」のおかげで、お互いに影響しません。

ローカル変数の独立性があるおかげで、プログラムの一部(関数など)が他の部分と混ざることなく、きれいに分けられます。これは、プログラムを書いている時に、どこで何をしているのかを明確にするのにとても役立ちます。

まとめ

この記事では、Pythonでの関数の定義方法、利用のメリット、さまざまな引数の使い方、関数の応用方法について解説しました。

関数を使うことで、コードの再利用性を高め、プログラミングの効率を大幅に向上させることができます。

これらの知識を活用して、より良いプログラムを作成していきましょう。

この記事が皆様のお役に立てたら幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次