【Python入門】関数の定義からマスターする業務効率化の第一歩

こんにちは!今日は多くの非エンジニアの方が「なんとなく難しそう」と感じてしまうPythonの関数について、分かりやすく解説していきます。

なぜ関数を学ぶ必要があるの?

データ分析や業務自動化を進める中で、こんな悩みはありませんか?

  • 同じコードを何度も書いて時間がもったいない
  • 長いコードが読みにくくて、後から見直すとどこに何を書いたか分からない
  • エラーが出ても、どこが原因なのか特定できない

これらの問題を一気に解決できるのが「関数」です。関数を使いこなせるようになると、コードの再利用性が高まり、作業効率が格段にアップします。

[toc]

関数とは何か?シンプルに理解する

関数とは、特定の処理をひとまとめにして、名前を付けたものです。料理のレシピやマニュアルのようなものと考えると分かりやすいでしょう。

関数の基本的な定義方法

Python
def 関数名(引数1, 引数2, ...):
    # 処理内容
    return 戻り値  # 必要な場合

例えば、毎日の売上を計算する関数を作ってみましょう。

Python
def calculate_daily_sales(unit_price, quantity):
    """
    日次売上を計算する関数
    単価と数量を掛け合わせて売上を計算します
    """
    sales = unit_price * quantity
    return sales

# 関数を使ってみる
today_sales = calculate_daily_sales(1200, 5)
print(f"本日の売上: {today_sales}円")  # 本日の売上: 6000円

この例では、calculate_daily_salesという名前の関数を定義しています。この関数はunit_pricequantityという2つの引数を受け取り、それらを掛け合わせた結果を返します。

「なぜ関数を使うの?」と思うかもしれませんが、この計算を10回、100回と繰り返す場合、毎回計算式を書く必要がなくなります。さらに、計算ロジックが変わった場合(例えば消費税を加えるなど)も、関数の中身だけを修正すれば全ての箇所に反映されます。

引数の種類と使い方

引数は関数に渡す情報です。例えるなら、料理のレシピに渡す材料のようなものです。

必須引数

上記の例でのunit_pricequantityは必須引数です。これらは必ず指定する必要があります。

デフォルト引数

値が指定されなかった場合のデフォルト値を設定できます。例えば、消費税率のように通常は10%だけど、場合によって変わる可能性があるような値に使います。

Python
def calculate_sales_with_tax(unit_price, quantity, tax_rate=0.10):
    """
    税込売上を計算する関数
    デフォルトの税率は10%です
    """
    subtotal = unit_price * quantity
    total = subtotal * (1 + tax_rate)
    return int(total)  # 整数に変換して返す

# デフォルト税率(10%)で計算
normal_sales = calculate_sales_with_tax(1200, 5)
print(f"通常税率での売上: {normal_sales}円")  # 通常税率での売上: 6600円

# 軽減税率(8%)で計算
reduced_sales = calculate_sales_with_tax(1200, 5, 0.08)
print(f"軽減税率での売上: {reduced_sales}円")  # 軽減税率での売上: 6480円

この例では、tax_rateにデフォルト値として0.10(10%)を設定しています。引数を省略すると自動的にこの値が使われます。

キーワード引数

引数の順番を気にせず、名前を指定して値を渡す方法もあります。特に引数が多い場合に便利です。

Python
# 引数の順番を入れ替えてもキーワードで指定すれば問題ない
sales_result = calculate_sales_with_tax(quantity=5, unit_price=1200)
print(f"キーワード引数での売上: {sales_result}円")  # キーワード引数での売上: 6600円

戻り値(関数の結果)の取得方法

関数は処理結果をreturn文で返すことができます。これを「戻り値」と呼びます。

単一の値を返す

これまでの例では単一の数値を返していました。

複数の値を返す

Pythonでは複数の値を一度に返すこともできます。例えば、売上と税額を別々に知りたい場合:

Python
def calculate_sales_details(unit_price, quantity, tax_rate=0.10):
    """
    売上の詳細(税抜金額、税額、税込金額)を計算する関数
    """
    subtotal = unit_price * quantity
    tax = subtotal * tax_rate
    total = subtotal + tax
    
    # 複数の値をタプルとして返す
    return subtotal, tax, total

# 関数から複数の値を受け取る
price_without_tax, tax_amount, price_with_tax = calculate_sales_details(1200, 5)

print(f"税抜金額: {price_without_tax}円")  # 税抜金額: 6000円
print(f"消費税: {tax_amount}円")  # 消費税: 600.0円
print(f"税込金額: {price_with_tax}円")  # 税込金額: 6600.0円

この例では、関数から3つの値を一度に返し、それぞれの変数に代入しています。これは実際のビジネスシーンで税抜・税込の両方を記録する必要がある場合などに便利です。

変数のスコープ – 関数の中と外での変数の扱い

関数内で定義された変数は、基本的にその関数内でしか使えません。これを「ローカルスコープ」と呼びます。一方、関数の外で定義された変数は「グローバルスコープ」となります。

Python
# グローバル変数
company_name = "テックビジネス株式会社"

def print_receipt(customer_name, amount):
    """
    領収書情報を表示する関数
    """
    # ローカル変数
    receipt_date = "2025年3月4日"
    
    print(f"{receipt_date}")
    print(f"領収書")
    print(f"宛名: {customer_name} 様")
    print(f"金額: {amount}円")
    print(f"発行: {company_name}")  # グローバル変数にアクセス可能

# 関数を呼び出す
print_receipt("鈴木一郎", 6600)

# 関数内のローカル変数にはアクセスできない
# print(receipt_date)  # これはエラーになる

この例では、company_nameはグローバル変数なので関数内からアクセスできますが、関数内で定義されたreceipt_dateは関数外からはアクセスできません。

これは重要な概念で、大規模なプログラムになるほど変数の管理が重要になります。関数を使うことで変数の影響範囲を限定し、バグの発生を防ぐことができます。

実際のデータ分析業務での活用例

データ分析担当者なら、CSVファイルから特定の条件でデータを抽出する作業はよくあるでしょう。関数を使って効率化してみましょう。

Python
def filter_sales_data(csv_path, min_amount=0, department=None):
    """
    売上データから条件に合うものを抽出する関数
    
    引数:
    csv_path -- CSVファイルのパス
    min_amount -- 最低売上金額(これ以上の売上を抽出)
    department -- 部署名(指定があれば特定部署のみ抽出)
    
    戻り値:
    条件に合う売上データのリスト
    """
    import csv
    
    filtered_data = []
    
    with open(csv_path, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 金額を数値に変換
            amount = int(row['売上金額'])
            
            # 最低金額条件をチェック
            if amount < min_amount:
                continue
            
            # 部署の条件をチェック(部署指定がある場合のみ)
            if department and row['部署'] != department:
                continue
            
            # 条件を満たすデータをリストに追加
            filtered_data.append(row)
    
    return filtered_data

# 関数の使用例
# 10万円以上の営業部の売上データを抽出
sales_data = filter_sales_data('monthly_sales.csv', min_amount=100000, department='営業部')

# 結果を処理
for data in sales_data:
    print(f"{data['日付']} {data['部署']} {data['担当者']}: {data['売上金額']}円")

この関数は、売上データのCSVファイルから条件に合うデータを抽出します。最低金額や部署を指定することで、様々な条件での抽出が可能です。

このように関数を使うと、データ分析の作業フローを整理し、効率化することができます。例えば、「先月の営業部のデータだけを見る」「100万円以上の大口案件だけを集計する」などの作業が、関数の引数を変えるだけで簡単に実行できるようになります。

初心者がよく陥る落とし穴と解決方法

1. 関数を定義したのに実行されない

関数はただ定義するだけでは実行されません。必ず関数を呼び出す必要があります。

Python
def greet():
    print("こんにちは")  # この行は関数を呼び出すまで実行されない

# 関数の呼び出し
greet()  # これで初めて"こんにちは"と表示される

2. returnを忘れる

処理結果を利用したいのにreturnを忘れると、None(何もない値)が返ってきてしまいます。

Python
def add_tax_wrong(price):
    # returnがない!
    price * 1.1

def add_tax_correct(price):
    # ちゃんとreturnを書く
    return price * 1.1

result1 = add_tax_wrong(1000)
result2 = add_tax_correct(1000)

print(result1)  # None
print(result2)  # 1100.0

3. グローバル変数の変更に注意

関数内からグローバル変数を変更するにはglobalキーワードが必要です。

Python
total_count = 0

def add_count_wrong(value):
    # グローバル宣言がないのでローカル変数として扱われる
    total_count = total_count + value  # エラーになる

def add_count_correct(value):
    # グローバル変数を変更する意図を明示
    global total_count
    total_count = total_count + value

# add_count_wrong(5)  # エラー
add_count_correct(5)
print(total_count)  # 5

まとめ – 関数を使いこなして業務効率化を実現しよう

Pythonの関数は、コードの再利用性を高め、業務を効率化するための強力な武器です。特にデータ分析や業務自動化を行いたい方にとって、関数は必須のスキルです。

今回学んだポイントをおさらいしましょう:

  • 関数は特定の処理をまとめて名前を付けたもの
  • 引数を使って関数に情報を渡す(必須引数、デフォルト引数、キーワード引数)
  • 関数はreturnを使って結果を返す(複数の値も返せる)
  • 関数内の変数はそのスコープ内でのみ有効
  • 実際の業務では、データ抽出や計算処理などを関数化すると効率的

関数を作る際は「この処理は何度も使いそうか?」「パラメータを変えて応用できそうか?」と考えてみてください。その答えがYESなら、関数化する良い候補です。

今日学んだ内容を実践して、あなたの業務をより効率的に、より整理されたものにしていきましょう!

次回は「Pythonでのファイル操作基礎」についてお話しする予定です。お楽しみに!

Leave a Comment

Your email address will not be published. Required fields are marked *