Python での欠落または無効な関数引数の処理方法

PythonPythonBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Python の関数引数はプログラミングの基本的な側面ですが、引数の欠落や無効な引数への対処は難しい場合があります。このチュートリアルでは、Python での関数引数の扱いについて、基本の理解から堅牢な検証とエラー処理戦略の実装までを解説します。最終的には、関数引数を適切に管理する Python コードを記述できるようになり、より信頼性が高く、保守性の高いアプリケーションにつながります。

基本的な関数引数とデフォルト値の理解

Python では、関数は特定のタスクを実行する再利用可能なコードのブロックです。関数を定義する際、関数が受け取ることを期待するパラメータを指定できます。さまざまな種類の引数を持つ関数をセットアップし、デフォルト値を指定する方法を学びましょう。

最初の関数の作成

まず、作業用の簡単な Python ファイルを作成することから始めましょう。WebIDE で、プロジェクトディレクトリに移動し、function_args.py という名前の新しいファイルを作成します。

  1. WebIDE の「File」メニューをクリックします。
  2. 「New File」を選択します。
  3. ファイル名として function_args.py を入力します。
  4. 「OK」をクリックします。

次に、このファイルに基本的な関数を追加しましょう。

def greet(name):
    """A simple function that greets a person by name."""
    return f"Hello, {name}!"

## Call the function and print the result
result = greet("Alice")
print(result)

ファイルを保存し (Ctrl+S または File > Save)、ターミナルで実行します。

python3 function_args.py

次のような出力が表示されるはずです。

Hello, Alice!

必須引数の理解

上記の例では、name は必須引数です。この引数を指定せずに関数を呼び出そうとすると、Python はエラーを発生させます。

これを実証するために、ファイルを変更してみましょう。

def greet(name):
    """A simple function that greets a person by name."""
    return f"Hello, {name}!"

## This will work
result = greet("Alice")
print(result)

## This will raise an error
try:
    result = greet()
    print(result)
except TypeError as e:
    print(f"Error: {e}")

ファイルを保存して実行します。

python3 function_args.py

出力:

Hello, Alice!
Error: greet() missing 1 required positional argument: 'name'

ご覧のように、必須引数を指定しないと、Python は TypeError を発生させます。

デフォルト値の追加

引数をオプションにするには、デフォルト値を指定できます。関数を更新してみましょう。

def greet(name="Guest"):
    """A function that greets a person by name, with a default value."""
    return f"Hello, {name}!"

## With an argument
result1 = greet("Alice")
print(result1)

## Without an argument - uses the default value
result2 = greet()
print(result2)

保存して実行します。

python3 function_args.py

出力:

Hello, Alice!
Hello, Guest!

これで、関数は引数の有無にかかわらず動作します。

デフォルト値を持つ複数の引数

複数の引数、一部はデフォルト値を持つように関数を拡張してみましょう。

def greet(name="Guest", message="Hello", punctuation="!"):
    """A function with multiple arguments and default values."""
    return f"{message}, {name}{punctuation}"

## Using all default values
print(greet())

## Providing only the name
print(greet("Alice"))

## Providing name and message
print(greet("Bob", "Hi"))

## Providing all arguments
print(greet("Charlie", "Welcome", "!!!"))

保存して実行します。

python3 function_args.py

出力:

Hello, Guest!
Hello, Alice!
Hi, Bob!
Welcome, Charlie!!!

キーワード引数の使用

引数の順序に関係なく、名前で引数を指定することもできます。

def greet(name="Guest", message="Hello", punctuation="!"):
    """A function with multiple arguments and default values."""
    return f"{message}, {name}{punctuation}"

## Using keyword arguments
print(greet(message="Hey", name="David"))
print(greet(punctuation="...", message="Welcome back", name="Emma"))

保存して実行します。

python3 function_args.py

出力:

Hey, David!
Welcome back, Emma...

これは、関数に多くの引数があり、そのうちのいくつかだけを指定したい場合に特に役立ちます。

これで、デフォルト引数を持つ関数の作成方法と、キーワード引数の使用方法を理解できました。次のステップでは、欠落または無効な関数引数を処理するためのより高度な方法を探ります。

*args と **kwargs を使用した引数の欠落の処理

Python では、可変個の引数を受け入れることができる柔軟な関数を作成する必要がある場合があります。これらのケースを処理するために、Python は 2 つの特別な構文要素を提供します:*args**kwargs

新しい Python ファイルの作成

これらの概念を扱うための新しいファイルを作成しましょう。

  1. WebIDE の「File」メニューをクリックします。
  2. 「New File」を選択します。
  3. ファイル名として flexible_args.py を入力します。
  4. 「OK」をクリックします。

*args の理解

*args 構文を使用すると、関数は任意の数の位置引数を受け入れることができ、それらはタプルに収集されます。

flexible_args.py に次のコードを追加します。

def sum_numbers(*args):
    """A function that sums up any number of arguments."""
    result = 0
    for num in args:
        result += num
    return result

## Test the function with different numbers of arguments
print(f"Sum of 1, 2: {sum_numbers(1, 2)}")
print(f"Sum of 1, 2, 3, 4, 5: {sum_numbers(1, 2, 3, 4, 5)}")
print(f"No arguments: {sum_numbers()}")

ファイルを保存して実行します。

python3 flexible_args.py

出力:

Sum of 1, 2: 3
Sum of 1, 2, 3, 4, 5: 15
No arguments: 0

これは、*args が、引数なしを含め、任意の数の引数を処理できることを示しています。関数内では、args は提供されたすべての引数を含むタプルです。

**kwargs の理解

**kwargs 構文を使用すると、関数は任意の数のキーワード引数を受け入れることができ、それらは辞書に収集されます。

別の関数をファイルに追加しましょう。

def build_profile(**kwargs):
    """A function that builds a user profile from keyword arguments."""
    profile = {}

    ## Add required fields with defaults
    profile["name"] = kwargs.get("name", "Anonymous")
    profile["age"] = kwargs.get("age", "Not specified")

    ## Add any additional fields
    for key, value in kwargs.items():
        if key not in ["name", "age"]:
            profile[key] = value

    return profile

## Test the function with different keyword arguments
print("Basic profile:", build_profile())
print("Full profile:", build_profile(name="Alice", age=30, occupation="Developer", location="New York"))
print("Custom fields:", build_profile(hobby="Reading", favorite_color="Blue"))

保存して実行します。

python3 flexible_args.py

出力:

Basic profile: {'name': 'Anonymous', 'age': 'Not specified'}
Full profile: {'name': 'Alice', 'age': 30, 'occupation': 'Developer', 'location': 'New York'}
Custom fields: {'name': 'Anonymous', 'age': 'Not specified', 'hobby': 'Reading', 'favorite_color': 'Blue'}

kwargs.get("key", default_value) が、存在しない場合にデフォルト値で値を取得できることに注意してください。

必須、デフォルト、*args、および **kwargs の組み合わせ

これらのすべてのタイプの引数を組み合わせた、より複雑な関数を作成しましょう。

def format_message(recipient, message="Hello", *args, **kwargs):
    """
    A function that formats a message with various customization options.
    - recipient: Required - who the message is for
    - message: Default greeting
    - *args: Additional message parts
    - **kwargs: Formatting options
    """
    ## Start with the basic message
    full_message = f"{message}, {recipient}!"

    ## Add any additional message parts
    if args:
        full_message += " " + " ".join(args)

    ## Apply formatting options
    if kwargs.get("upper", False):
        full_message = full_message.upper()

    if kwargs.get("wrap", False):
        full_message = f"[{full_message}]"

    return full_message

## Test with different combinations
print(format_message("Alice"))
print(format_message("Bob", "Hi"))
print(format_message("Charlie", "Welcome", "Hope", "you", "are", "well"))
print(format_message("David", "Greetings", upper=True))
print(format_message("Emma", wrap=True))
print(format_message("Frank", "Hey", "How's it going?", upper=True, wrap=True))

保存して実行します。

python3 flexible_args.py

出力:

Hello, Alice!
Hi, Bob!
Welcome, Charlie! Hope you are well
GREETINGS, DAVID!
[Hello, Emma!]
[HEY, FRANK! HOW'S IT GOING?]

この例は、すべてのタイプの関数引数を一緒に使用する方法を示しています。

  1. recipient は必須の位置引数です。
  2. message にはデフォルト値があり、オプションになっています。
  3. *args は追加の位置引数をすべてキャプチャします。
  4. **kwargs はキーワード引数をすべてキャプチャします。

これらのアプローチを組み合わせることで、欠落またはオプションの引数を適切に処理する、非常に柔軟な関数を作成できます。

関数引数の検証

Python で関数を作成する際、関数の主要なロジックに進む前に、関数に渡された引数が有効であることを確認することが重要です。このステップでは、関数引数を検証するためのいくつかのテクニックを学びます。

新しい Python ファイルの作成

検証の概念を扱うための新しいファイルを作成しましょう。

  1. WebIDE の「File」メニューをクリックします。
  2. 「New File」を選択します。
  3. ファイル名として validate_args.py を入力します。
  4. 「OK」をクリックします。

条件文による基本的な検証

引数を検証する最も簡単な方法は、条件文を使用することです。いくつかの基本的な検証から始めましょう。

def calculate_rectangle_area(length, width):
    """Calculate the area of a rectangle, validating inputs."""
    ## Validate that inputs are numbers
    if not isinstance(length, (int, float)):
        raise TypeError("Length must be a number")
    if not isinstance(width, (int, float)):
        raise TypeError("Width must be a number")

    ## Validate that inputs are positive
    if length <= 0:
        raise ValueError("Length must be positive")
    if width <= 0:
        raise ValueError("Width must be positive")

    ## Calculate the area
    return length * width

## Test with valid inputs
try:
    area = calculate_rectangle_area(5, 3)
    print(f"Area of rectangle: {area}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

## Test with invalid types
try:
    area = calculate_rectangle_area("5", 3)
    print(f"Area of rectangle: {area}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

## Test with invalid values
try:
    area = calculate_rectangle_area(5, -3)
    print(f"Area of rectangle: {area}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

保存して実行します。

python3 validate_args.py

出力:

Area of rectangle: 15
Error: Length must be a number
Error: Width must be positive

この関数は、計算を実行する前に、引数の型と値の両方を検証します。無効な引数が検出されると、適切なエラーメッセージが生成されます。

アサーションを使用した検証

引数を検証する別の方法は、アサーションを使用することです。アサーションは、条件が満たされない場合に AssertionError を発生させるステートメントです。

def calculate_discount(price, discount_percent):
    """Calculate the discounted price."""
    ## Assert that inputs are valid
    assert isinstance(price, (int, float)), "Price must be a number"
    assert isinstance(discount_percent, (int, float)), "Discount must be a number"
    assert price >= 0, "Price cannot be negative"
    assert 0 <= discount_percent <= 100, "Discount must be between 0 and 100"

    ## Calculate the discount
    discount_amount = price * (discount_percent / 100)
    return price - discount_amount

## Test with valid inputs
try:
    discounted_price = calculate_discount(100, 20)
    print(f"Discounted price: ${discounted_price}")
except AssertionError as e:
    print(f"Error: {e}")

## Test with invalid discount percentage
try:
    discounted_price = calculate_discount(100, 120)
    print(f"Discounted price: ${discounted_price}")
except AssertionError as e:
    print(f"Error: {e}")

保存して実行します。

python3 validate_args.py

出力:

Discounted price: $80.0
Error: Discount must be between 0 and 100

アサーションは、開発とデバッグに役立ちますが、本番コードでは無効にできるため、実際のアプリケーションでの検証に常に最適な選択肢とは限りません。

型ヒントを使用したドキュメント化

Python 3.5 以降では、型ヒントがサポートされており、関数引数と戻り値の期待される型をドキュメント化するのに役立ちます。型ヒント自体は実行時の検証を実行しませんが、役立つドキュメントを提供し、mypy などの外部ツールでチェックできます。

def calculate_average(numbers: list[float]) -> float:
    """Calculate the average of a list of numbers."""
    if not numbers:
        raise ValueError("Cannot calculate average of empty list")

    if not all(isinstance(n, (int, float)) for n in numbers):
        raise TypeError("All elements must be numbers")

    return sum(numbers) / len(numbers)

## Test with valid input
try:
    avg = calculate_average([1, 2, 3, 4, 5])
    print(f"Average: {avg}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

## Test with empty list
try:
    avg = calculate_average([])
    print(f"Average: {avg}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

## Test with non-numeric elements
try:
    avg = calculate_average([1, 2, "3", 4, 5])
    print(f"Average: {avg}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

保存して実行します。

python3 validate_args.py

出力:

Average: 3.0
Error: Cannot calculate average of empty list
Error: All elements must be numbers

型ヒント (list[float] および -> float) 自体は検証を実行しないことに注意してください。独自の検証コードを記述する必要があります。これらはドキュメントとして機能し、外部ツールでチェックできます。

検証を使用した堅牢な関数の作成

次に、これらのすべてのテクニックを適用して、割引付きの商品の合計コストを計算する堅牢な関数を構築しましょう。

def calculate_total_cost(items=None, tax_rate=0, discount=0):
    """
    Calculate the total cost of items with tax and discount.

    Args:
        items: List of (item_name, price) tuples
        tax_rate: Tax rate percentage (0-100)
        discount: Discount percentage (0-100)

    Returns:
        A dictionary with the total, subtotal, tax amount, and discount amount
    """
    ## Validate items
    if items is None:
        items = []

    if not isinstance(items, list):
        raise TypeError("Items must be a list")

    ## Validate each item in the list
    for i, item in enumerate(items):
        if not isinstance(item, tuple) or len(item) != 2:
            raise ValueError(f"Item {i} must be a tuple of (name, price)")

        name, price = item
        if not isinstance(name, str):
            raise TypeError(f"Name of item {i} must be a string")
        if not isinstance(price, (int, float)):
            raise TypeError(f"Price of item {i} must be a number")
        if price < 0:
            raise ValueError(f"Price of item {i} cannot be negative")

    ## Validate tax_rate and discount
    if not isinstance(tax_rate, (int, float)):
        raise TypeError("Tax rate must be a number")
    if not isinstance(discount, (int, float)):
        raise TypeError("Discount must be a number")

    if not (0 <= tax_rate <= 100):
        raise ValueError("Tax rate must be between 0 and 100")
    if not (0 <= discount <= 100):
        raise ValueError("Discount must be between 0 and 100")

    ## Calculate the total
    subtotal = sum(price for _, price in items)
    discount_amount = subtotal * (discount / 100)
    tax_amount = (subtotal - discount_amount) * (tax_rate / 100)
    total = subtotal - discount_amount + tax_amount

    return {
        "subtotal": subtotal,
        "discount_amount": discount_amount,
        "tax_amount": tax_amount,
        "total": total
    }

## Test with valid inputs
shopping_cart = [
    ("Laptop", 1000),
    ("Mouse", 25),
    ("Keyboard", 45)
]

try:
    result = calculate_total_cost(shopping_cart, tax_rate=8.5, discount=10)
    print("Shopping Cart Total:")
    for key, value in result.items():
        print(f"  {key.replace('_', ' ').title()}: ${value:.2f}")
except (TypeError, ValueError) as e:
    print(f"Error: {e}")

## Test with invalid item
try:
    invalid_cart = [
        ("Laptop", 1000),
        ("Mouse", "twenty-five"),  ## Invalid price
        ("Keyboard", 45)
    ]
    result = calculate_total_cost(invalid_cart)
    print(result)
except (TypeError, ValueError) as e:
    print(f"Error with invalid item: {e}")

保存して実行します。

python3 validate_args.py

出力:

Shopping Cart Total:
  Subtotal: $1070.00
  Discount Amount: $107.00
  Tax Amount: $81.86
  Total: $1044.86
Error with invalid item: Price of item 1 must be a number

この関数は、次のことによって堅牢な検証を示しています。

  1. すべての入力の型をチェックする
  2. 数値の範囲を検証する
  3. 詳細なエラーメッセージを提供する
  4. オプションのパラメータに適切なデフォルトを設定する
  5. ドキュメント文字列を使用して、期待される入力と戻り値をドキュメント化する

関数で徹底的な検証を実装することにより、エラーを防止し、ユーザーにより良いフィードバックを提供し、コードをより堅牢で保守しやすくすることができます。

完全なアプリケーションの構築

関数の引数を処理および検証するためのさまざまなテクニックを学習したので、これらのスキルを適用して、シンプルでありながら完全なアプリケーションを構築しましょう。関数引数の処理に関する優れたプラクティスを示す、基本的な経費追跡システムを作成します。

アプリケーションファイルの作成

経費トラッカー用の新しい Python ファイルを作成しましょう。

  1. WebIDE の「File」メニューをクリックします。
  2. 「New File」を選択します。
  3. ファイル名として expense_tracker.py を入力します。
  4. 「OK」をクリックします。

経費トラッカー関数の設計

経費トラッカーには、経費管理のさまざまな側面を処理するいくつかの関数があります。

def create_expense(description, amount, category=None, date=None):
    """
    Create a new expense entry.

    Args:
        description (str): Description of the expense
        amount (float): The amount spent
        category (str, optional): Category of the expense
        date (str, optional): The date in YYYY-MM-DD format

    Returns:
        dict: An expense entry
    """
    ## Validate description
    if not isinstance(description, str):
        raise TypeError("Description must be a string")
    if not description:
        raise ValueError("Description cannot be empty")

    ## Validate amount
    if not isinstance(amount, (int, float)):
        raise TypeError("Amount must be a number")
    if amount <= 0:
        raise ValueError("Amount must be positive")

    ## Create the expense dictionary
    expense = {
        "description": description,
        "amount": float(amount),
        "category": category or "Uncategorized",
        "date": date or "Not specified"
    }

    return expense


def add_expense_to_list(expenses, **kwargs):
    """
    Add a new expense to the expenses list.

    Args:
        expenses (list): The list of expenses
        **kwargs: The expense details to be passed to create_expense

    Returns:
        list: The updated list of expenses
    """
    ## Validate the expenses list
    if not isinstance(expenses, list):
        raise TypeError("Expenses must be a list")

    ## Extract required arguments
    if "description" not in kwargs:
        raise ValueError("Expense description is required")
    if "amount" not in kwargs:
        raise ValueError("Expense amount is required")

    ## Create the expense and add it to the list
    expense = create_expense(
        kwargs["description"],
        kwargs["amount"],
        kwargs.get("category"),
        kwargs.get("date")
    )

    expenses.append(expense)
    return expenses


def get_total_expenses(expenses, category=None):
    """
    Calculate the total amount of expenses, optionally filtered by category.

    Args:
        expenses (list): The list of expenses
        category (str, optional): Filter by this category if provided

    Returns:
        float: The total amount
    """
    ## Validate the expenses list
    if not isinstance(expenses, list):
        raise TypeError("Expenses must be a list")

    ## Calculate the total
    if category:
        return sum(e["amount"] for e in expenses if e["category"] == category)
    else:
        return sum(e["amount"] for e in expenses)


def get_expense_summary(expenses):
    """
    Get a summary of expenses by category.

    Args:
        expenses (list): The list of expenses

    Returns:
        dict: A dictionary with categories as keys and total amounts as values
    """
    ## Validate the expenses list
    if not isinstance(expenses, list):
        raise TypeError("Expenses must be a list")

    ## Create the summary
    summary = {}
    for expense in expenses:
        category = expense["category"]
        if category in summary:
            summary[category] += expense["amount"]
        else:
            summary[category] = expense["amount"]

    return summary

経費トラッカーの使用

次に、関数を使用していくつかの経費を追跡しましょう。

def print_expense_summary(summary):
    """Print a formatted summary of expenses by category."""
    print("\nExpense Summary by Category:")
    print("-" * 30)
    for category, amount in summary.items():
        print(f"{category}: ${amount:.2f}")
    print("-" * 30)
    print(f"Total: ${sum(summary.values()):.2f}")

## Initialize an empty expenses list
expenses = []

## Add some expenses
try:
    ## Add with required arguments only
    expenses = add_expense_to_list(
        expenses,
        description="Groceries",
        amount=45.75
    )

    ## Add with all arguments
    expenses = add_expense_to_list(
        expenses,
        description="Movie tickets",
        amount=25.00,
        category="Entertainment",
        date="2023-11-15"
    )

    ## Add another expense
    expenses = add_expense_to_list(
        expenses,
        description="Dinner",
        amount=65.40,
        category="Food",
        date="2023-11-14"
    )

    ## Add with default category
    expenses = add_expense_to_list(
        expenses,
        description="Gas",
        amount=35.80,
        date="2023-11-16"
    )

    ## Display all expenses
    print("All Expenses:")
    for i, expense in enumerate(expenses, 1):
        print(f"{i}. {expense['description']}: ${expense['amount']:.2f} " +
              f"({expense['category']}, {expense['date']})")

    ## Get and display the total
    total = get_total_expenses(expenses)
    print(f"\nTotal expenses: ${total:.2f}")

    ## Get and display expenses for a specific category
    food_total = get_total_expenses(expenses, "Food")
    print(f"Food expenses: ${food_total:.2f}")

    ## Get and display the summary
    summary = get_expense_summary(expenses)
    print_expense_summary(summary)

except (TypeError, ValueError) as e:
    print(f"Error: {e}")

エラー処理を示すために、いくつかのコードも追加しましょう。

## Try some invalid inputs
print("\nTesting error handling:")

try:
    ## Invalid expense description
    expenses = add_expense_to_list(expenses, description="", amount=10)
except ValueError as e:
    print(f"Caught error: {e}")

try:
    ## Invalid expense amount
    expenses = add_expense_to_list(expenses, description="Coffee", amount=-5)
except ValueError as e:
    print(f"Caught error: {e}")

try:
    ## Missing required argument
    expenses = add_expense_to_list(expenses, description="Coffee")
except ValueError as e:
    print(f"Caught error: {e}")

ファイルを保存して実行します。

python3 expense_tracker.py

期待される出力:

All Expenses:
1. Groceries: $45.75 (Uncategorized, Not specified)
2. Movie tickets: $25.00 (Entertainment, 2023-11-15)
3. Dinner: $65.40 (Food, 2023-11-14)
4. Gas: $35.80 (Uncategorized, 2023-11-16)

Total expenses: $171.95
Food expenses: $65.40

Expense Summary by Category:
------------------------------
Uncategorized: $81.55
Entertainment: $25.00
Food: $65.40
------------------------------
Total: $171.95

Testing error handling:
Caught error: Description cannot be empty
Caught error: Amount must be positive
Caught error: Expense amount is required

アプリケーションのレビュー

私たちの経費トラッカーは、いくつかの重要な概念を示しています。

  1. 引数の検証: 各関数は、引数が期待される型と制約を満たしていることを確認するために、引数を検証します。

  2. デフォルト値: categorydate のように、特定の引数をオプションにするためにデフォルト値を使用します。

  3. 必須引数: descriptionamount などの必須情報については、これらが提供され、有効であることを確認します。

  4. キーワード引数: add_expense_to_list 関数は、柔軟な方法で経費の詳細を受け入れるために **kwargs を使用します。

  5. エラー処理: デバッグを容易にするために、意味のあるエラーメッセージを含む適切な例外を使用します。

  6. ドキュメント文字列: 各関数には、その目的、引数、および戻り値を説明するドキュメント文字列が含まれています。

これらのテクニックを適用することにより、信頼性が高く、ユーザーフレンドリーな方法で関数引数を処理する堅牢なアプリケーションを作成しました。このアプローチは、バグを防ぎ、コードの保守性を向上させ、問題が発生した場合に明確なフィードバックを提供します。

まとめ

このチュートリアルでは、Python で欠落または無効な関数引数を処理するための重要なテクニックを学習しました。

  1. 基本的な関数引数とデフォルトの理解: 必須引数、デフォルト値を持つオプション引数、キーワード引数など、さまざまな種類の関数引数を調べました。この基礎は、柔軟性と使いやすさの両方を備えた関数を設計するのに役立ちます。

  2. 可変数の引数の処理: *args**kwargs を使用して、任意の数の引数を受け入れることができる関数を作成する方法を学びました。これにより、関数をさまざまなユースケースにより適応させることができます。

  3. 関数引数の検証: 引数が期待される型と制約を満たしていることを確認するために、さまざまな検証テクニックを実装しました。これにより、バグを防ぎ、明確なエラーメッセージを提供できます。

  4. 完全なアプリケーションの構築: これらの概念を実践的な経費追跡アプリケーションに適用し、適切な引数処理が堅牢で保守性の高いコードにつながることを示しました。

これらのスキルは、信頼性の高い Python コードを記述するための基本です。関数引数を適切に処理することにより、より柔軟で使いやすく、エラーが発生しにくい関数を作成できます。Python の学習を続けるにつれて、これらのテクニックは、予期しない入力とエッジケースを適切に処理できる、より洗練されたアプリケーションを構築するのに役立ちます。