戻り値とは？お菓子屋さんに学ぶ関数の仕組み！

プログラミングにおいて「関数」は、特定の処理をまとめて実行するための便利な仕組みです。その中で、関数の **「戻り値（return value）」** は非常に重要な概念です。関数は単に処理を実行するだけでなく、結果を受け取り、それをプログラムの他の部分で活用することができます。

例えば、カフェでお菓子を注文する場面を考えてみましょう。

- あなた：「チョコレートクッキーを5個ください！」 **（← これは「引数」）**
- 店員：「はい、こちらチョコレートクッキー5個になります。」**（← これが「戻り値」）**

この例のように、関数も入力（引数）を受け取り、処理を行った後、結果（戻り値）を返すことで、プログラムの他の部分に活用できるデータを提供します。

引数については以下の記事を参考にしてください。

https://qiita.com/masaya8028/items/dcc7bad250e5a7fbb5f7

## 🍩 Pythonにおける戻り値の基本

Pythonでは、関数内で`return`文を使用することで戻り値を返すことができます。次の例を見てみましょう。

```python
def make_snack(quantity, snack):
    return f"{quantity}個の{snack}をお渡しします！"

order = make_snack(3, "ドーナツ") 
print(order)
```

**出力:**
```
3個のドーナツをお渡しします！
```
このコードの流れ

1. お客さん（プログラム）が「ドーナツ3個」と注文。
2. 関数（店員）が注文内容を受け取り、結果を作成。
3. 出来上がったお菓子（戻り値）が返される。
4. そして、満足したお客さんが出力を見る！

:::note warn
このコードの流れを詳しく説明すると：

1. 関数`make_snack`が呼び出されると、引数として「3」と「ドーナツ」が渡される。
2. 関数内の`return`文が処理され、フォーマットされた文字列（"3個のドーナツをお渡しします！"）が返される。
3. 関数の戻り値が変数`order`に代入され、`print()`を使って出力される。
:::


## 戻り値の活用方法

戻り値を使えば、ただ「お菓子をもらう」だけでなく、より賢くプログラムを動かせます。
例えば、以下のようなシーンで活躍します！

### 1. 計算結果を受け取る

例えば、お菓子の合計金額を計算する場合：

```python
def calculate_total(price, quantity):
    return price * quantity

total = calculate_total(200, 3)
print(f"合計金額: {total}円")
```

**出力:**
```
合計金額: 600円
```
「お菓子をたくさん買ったら、財布の中身が心配…」
→ 関数が計算してくれるので、買いすぎを防げます！

:::note info
この例では、価格と数量を引数として関数に渡し、計算された合計金額（戻り値）を変数`total`に格納し、出力しています。
:::


### 2. 条件に応じた応答

例えば、在庫状況を確認し、適切なメッセージを返す例：

```python
def check_availability(snack):
    stock = {"チョコレート": 10, "クッキー": 0}
    if snack in stock and stock[snack] > 0:
        return f"{snack}は在庫があります"
    else:
        return f"申し訳ありません、{snack}は売り切れです"

status = check_availability("クッキー")
print(status)
```

**出力:**
```
申し訳ありません、クッキーは売り切れです
```
→ 在庫確認関数があれば、売り切れに気づいて悲しむ前に対策できます。

:::note info
この関数では、指定されたお菓子の在庫があるかどうかをチェックし、適切なメッセージを戻り値として返しています。
:::


### 3. データの蓄積・加工

例えば、注文リストを作成する場合：

```python
def add_to_cart(cart, item, quantity):
    cart.append(f"{item} x {quantity}")
    return cart

shopping_cart = []
shopping_cart = add_to_cart(shopping_cart, "マカロン", 2)
shopping_cart = add_to_cart(shopping_cart, "ケーキ", 1)
print(shopping_cart)
```

**出力:**
```０ー｀￥￥￥￥￥￥￥
['マカロン x 2', 'ケーキ x 1']
```
🛒「ついついカートに入れすぎてしまう…」
→ 関数がうまくカートを管理してくれるので、お菓子の爆買いを防げるかも！？

:::note info
関数の戻り値を使って、リストを更新し、データを蓄積して処理を続けることが可能です。
:::

### 4. 他の関数との連携
:::note info
関数の戻り値を別の関数の入力（引数）として使用することで、処理を組み合わせられます。
:::

```python
def discount_price(price):
    return price * 0.9  # 10%割引

def final_total(price, quantity):
    discounted = discount_price(price)
    return discounted * quantity

total = final_total(200, 3)
print(f"割引後の合計金額: {total}円")
```

**出力:**
```
割引後の合計金額: 540円
```
✨「割引って嬉しい！…いや、買いすぎる理由が増えた！😆」

:::note warn
この例では、最初に`discount_price`関数で割引を適用し、その戻り値を`final_total`関数で受け取って最終的な合計金額を算出しています。
:::


## 戻り値に関する注意点

関数の戻り値を扱う際には、以下の点に注意が必要です。

### 1. 戻り値がない場合  
:::note warn
関数に`return`がない場合、デフォルトで`None`が返される。
:::
例えば：

```python
def greet(name):
    print(f"こんにちは、{name}さん！")
    result = greet("太郎")
print(result)  # 出力: None
```
**None** が出力されり。


### 2. 複数の戻り値を返す  
:::note info
Pythonではタプルを使って複数の値を返せる。
:::

```python
def get_snack_info():
    return "チョコレート", 5
snack, quantity = get_snack_info()
print(f"{snack}が{quantity}個あります")
```

### 3. 戻り値のデータ型の確認  
期待したデータ型が返ってくるかどうかを考慮し、適切に処理する必要がある。

:::note warn
例えば、数値を期待していたのに文字列が返ってくるとエラーの原因に。
:::



## まとめ

- **引数とは？**  
  関数に情報を渡すための「注文票」のようなもの。
  
- **戻り値とは？**  
  関数の処理結果を受け取る「お菓子」のようなもの。

- **戻り値を活用することで：**  
計算結果の取得や、データの加工・蓄積ができる。
他の関数と連携し、プログラムの柔軟性を高める。
条件による分岐処理など、より高度な制御が可能。


引数については以下の記事を参考にしてください。

https://qiita.com/masaya8028/items/dcc7bad250e5a7fbb5f7