Python: 高度なパラメータとスコープ

最終更新:2026-09-22

関数の基本を学んだので、高度なテクニックを探ってみましょう。パラメータの書き方にはどのような方法があるでしょうか?「変数のスコープ」とは何でしょうか?再帰とは何でしょうか?これらの概念により、関数に対する理解が次のレベルに進みます。


関連するキーワード/文:return global print None len

1. デフォルトパラメータ

デフォルトパラメータを使うと、関数呼び出し時に引数を省略できます:

▶ サンプル:基本的なデフォルトパラメータ

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

(1) ⚠️ デフォルトパラメータの落とし穴

デフォルトパラメータの値は関数定義時に一度だけ評価され、関数が呼び出されるたびに評価されるわけではありません。デフォルトがミュータブルなオブジェクト(リストや辞書など)の場合、予期しない動作を引き起こす可能性があります:

▶ サンプル:ミュータブルなデフォルトの落とし穴

TEXT 📖 参照専用
def add_item(item, items=[]):   # ❌ 危険!
    items.append(item)
    return items

print(add_item("apple"))     # ['apple']
print(add_item("banana"))    # ['apple', 'banana'] — ['banana'] ではない!
print(add_item("orange"))    # ['apple', 'banana', 'orange']

なぜ? 空のリスト items=[] は関数定義時に一度だけ作成されます。後続のすべての呼び出しは同じリストに追加します。

正しい方法: デフォルトに None を使用し、関数内で新しいリストを作成します:

▶ サンプル:安全なデフォルトパラメータ

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 黄金律: デフォルトパラメータは常にイミュータブルな値(None、数値、文字列、タプル)にすべきです。リストや辞書のようなミュータブルなオブジェクトをデフォルトとして決して使用しないでください。



2. キーワード引数

関数を呼び出すときに、パラメータ名で値を指定でき、順序を入れ替えて引数を渡せます:

▶ サンプル:キーワード引数

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功


3. *args:可変長位置引数

関数がいくつの引数を受け取るかわからない場合は、*args を使います:

▶ サンプル:*args を使った合計関数

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

*args はすべての位置引数をタプルにまとめます:

▶ サンプル:args の調査

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功


4. **kwargs:可変長キーワード引数

**kwargs は任意の数のキーワード引数を受け取り、辞書にまとめます:

▶ サンプル:**kwargs を使ったユーザープロファイル作成

▶ 試してみよう

出力:

TEXT 📖 参照専用
User Profile:
  name: Alice
  age: 25
  city: Beijing
  job: Engineer

▶ サンプル:*args と **kwargs の組み合わせ

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 パラメータの順序は固定: 通常パラメータ → *args → デフォルトパラメータ → **kwargs



5. スコープ:LEGB ルール

変数はどこからアクセスできるでしょうか?これはスコープによって決まります。Python には 4 つのスコープレベルがあります:

▶ サンプル:LEGB スコープのネスト

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

LEGB の意味:

Python は変数を L → E → G → B の順で検索します。

(1) global と nonlocal

関数内でグローバル変数を変更するには、global を使います:

▶ サンプル:global の使用

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
⚠️ global の使用は最小限に。 グローバル変数はコードの理解とデバッグを困難にします。関数はパラメータで入力を受け取り、return で出力を返すべきであり、グローバル変数を密かに変更すべきではありません。



6. 再帰の基本

再帰は関数が自分自身を呼び出すことです。核となる考え方:大きな問題をより小さな同様のサブ問題に分割します。

▶ サンプル:再帰的階乗

▶ 試してみよう

実行過程:

TEXT 📖 参照専用
factorial(5) = 5 * factorial(4)
            = 5 * 4 * factorial(3)
            = 5 * 4 * 3 * factorial(2)
            = 5 * 4 * 3 * 2 * factorial(1)
            = 5 * 4 * 3 * 2 * 1
            = 120

▶ サンプル:フィボナッチ数列(難易度 ⭐⭐⭐)

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 再帰の 2 つの必須要素: ① 終了条件(これがないと無限再帰→スタックオーバーフロー)。② 再帰条件(各呼び出しが終了条件に近づく)。すべての問題が再帰に適しているわけではありません——ループで解決できるならループを優先しましょう。再帰は木構造、分割統治アルゴリズムなどに最適です。



7. よくあるユースケース


関連するキーワード/文:return global print None len

❓ よくある質問

Q *args と可変キーワード引数のアンパック構文の名前を変更できますか?
A はい。*args と二重アスタリスクのキーワードアンパックは命名規則に過ぎません——重要なのはアスタリスクです。*numbers と書くか、アスタリスクを2つ options に付けることもできます。しかし、他の Python プログラマーがすぐに理解できるよう、慣習に従うことをお勧めします。
Q 関数内でグローバル変数を読み取れるのに、変更できないのはなぜですか?
A 読み取り時、Python は LEGB ルールに従ってグローバル変数を見つけます。しかし、代入時にはデフォルトで新しいローカル変数を作成します——関数内の x = 10 は「ローカル変数 x を作成する」と扱われます。本当にグローバルを変更する必要がある場合は global を使います。ただし、それは通常、設計を改善できることを意味します。

📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):関数 multiply(*nums) を書いてください。任意の数の数値を受け取り、その積を返します。引数がない場合は 0 を返します。

  2. 中級(難易度 ⭐⭐):関数 create_student(name, **scores) を書いてください。学生名と任意の数の科目スコア(キーワード引数)を受け取り、平均を計算して返します。呼び出し例:create_student("Alice", Chinese=85, Math=92, English=78)。

  3. 挑戦(難易度 ⭐⭐⭐):再帰関数 sum_digits(n) を書いてください。正の整数の各位の和を計算します。例:sum_digits(123) は 1+2+3=6 を返します。ヒント:10 で割った余りが最後の桁。10 で割った整数部分がそれを除去。終了条件:n < 10。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%