Pythonで卵焼き作ってみた。【Python】【入門】【資料】

## 0.はじめに
以前自社のコーポレートブログに[「Pythonで卵焼き作ってみた。」](https://fotome.jp/blog/python%E3%81%A7%E5%8D%B5%E7%84%BC%E3%81%8D%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)という記事を書きました。
100%全力の釣りタイトルです。

毎月プログラミング初心者向けにPython勉強会を開催しているのですが、プログラミングという行為や出てくる概念を説明するのは非常に難しい。。。
何かなるべく多くの人が共通認識を持つお題でイメージしやすい資料を作りたいなぁと思っていたところ、こういう発想になりました。

絶賛Python勉強中という方は、「こういう風に使えるんだー」とか、「まだここらへんよくわからん。。」みたいな読み物感覚でご覧いただければと思います。
絶賛Python指導中という方は、「ここもっとこうしたら面白い」とか、「こう説明したら理解してもらえたー」みたいな共有いただけたら嬉しいです。

※注意
対象レベルは一応[「Pythonチュートリアル」](https://docs.python.org/ja/3/tutorial/index.html)を終えている方としています。
オブジェクト指向を理解する手助けになればいいなぁぐらいの気持ちで書いていますので、細かい点や不可解なところも多少はご了承ください。
バージョンはPython3系で確認しています。

## 1.材料
* 卵
* 良い卵
* サラダ油

```python
class Tamago(object):
    """
    卵class
    """
    inside = ['白身', '黄身']
    mixed_count  = 0
    is_divided   = False
    is_mixed     = False
    is_scrambled = False
    umami_level  = 50

    def dividing(self):
        # 卵を割るメソッド
        self.is_divided = True
        return self.inside

class GoodTamago(Tamago):
    """
    良い卵class
    """
    umami_level = 100

class BadTamago(Tamago):
    """
    良い卵class
    """
    umami_level = 0

class Oil(object):
    """
    油class
    """
    TYPES = {
        'salad': 0,
        'olive': 1,
        'goma' : 2
    }
    def __init__(self, type=None):
        self.type = type
```
良い卵と悪い卵の違いは `umami_level` の値だけで表現しています。
ここら辺オブジェクト指向ならもっといろいろ考えられるところかと思いますが、今回はなるべく簡略化していきます。

## 2.道具
* ボウル
* フライパン

```python
class Bowl(object):
    """
    ボウルclass
    """
    def mix(self, tamago, count=100):
        if not tamago.is_divided:
             raise ValueError("割らなきゃ混ぜれない！")
        print('{count}回混ぜましょう。'.format(count=count))
        for i in range(count):
            tamago.mixed_count = tamago.mixed_count + 1
            print('{}回目'.format(tamago.mixed_count))
        tamago.is_mixed = True
        return tamago

class Pan(object):
    """
    フライパンclass
    """
    oil = None
    def __init__(self, oil):
        if oil.type is not Oil.TYPES['salad']:
            raise ValueError("サラダ油じゃなきゃダメ！")
        self.oil = oil

    def scramble(self, tamago):
        if not tamago.is_mixed:
            raise ValueError("卵を溶いてからじゃなきゃダメ！")
        tamago.is_scrambled = True
        return mixed_tamago
```
道具には動作メソッドを組み込んでおきました。
制御フローの復習も兼ねています。

## 3.手順
① 卵とボウルを用意します。

```python
tamago = Tamago()
bowl   = Bowl()
```

② 卵を割ってボウルに入れ、10回混ぜます。

```python
inside = tamago.dividing()
mixed_tamago = bowl.mix(tamago, count=10)
```

③ フライパンにサラダ油を敷きます。

```python
oil = Oil(type=Oil.TYPES['salad'])
pan = Pan(oil)
```

④ フライパンに卵を入れてい炒ります。

```python
scrambled_tamago = pan.scramble(tamago)
```
オブジェクトを生成し、それらを利用して処理を実行していきます。

## 4.味見してみましょう

```python
def tasting(dish):
    """
    味見メソッド
    """
    if 80 < dish.umami_level:
        print('美味い！')
    elif 40 < dish.umami_level and dish.umami_level <= 80:
        print('普通。')
    else:
        print('まずい…')
```
ここはメソッドだけ書くパターンにしたかったので無理やり外出してみました。

## 5.最後に
という訳で、多少強引ではありますが、見事にPythonで卵焼きを作りました！
ここまでの流れが何となく理解できていれば、Pythonレベルは自分で調べながら作りたいものを作っていけるぐらいあるのではないかなぁと思います。

プログラミングという行為は普段の生活には現れないので、なるべく具体的でイメージしやすいお題があると勉強するにも教えるにもハードルが下がるかなと思って今回の記事を書いてみました。
少しでも多くの方がPythonの魅力を感じていただければ嬉しいです！！


## おまけ
これまでに出てきたソースコードをまとめたものです。
いろいろ試しながら遊んでみて下さい！

```python:cooking.py
class Tamago(object):
    """
    卵class
    """
    inside = ['白身', '黄身']
    mixed_count  = 0
    is_divided   = False
    is_mixed     = False
    is_scrambled = False
    umami_level  = 50

    def dividing(self):
        self.is_divided = True
        return self.inside

class GoodTamago(Tamago):
    """
    良い卵class
    """
    umami_level = 100


class BadTamago(Tamago):
    """
    悪い卵class
    """
    umami_level = 0

class Oil(object):
    """
    油class
    """
    TYPES = {
        'salad': 0,
        'olive': 1,
        'goma' : 2
    }
    def __init__(self, type=None):
        self.type = type

class Bowl(object):
    """
    ボウルclass
    """
    def mix(self, tamago, count=100):
        if not tamago.is_divided:
             raise ValueError("割らなきゃ混ぜれない！")
        print('{count}回混ぜましょう。'.format(count=count))
        for i in range(count):
            tamago.mixed_count = tamago.mixed_count + 1
            print('{}回目'.format(tamago.mixed_count))
        tamago.is_mixed = True
        return tamago

class Pan(object):
    """
    フライパンclass
    """
    oil = None
    def __init__(self, oil):
        if oil.type is not Oil.TYPES['salad']:
            raise ValueError("サラダ油じゃなきゃダメ！")
        self.oil = oil

    def scramble(self, tamago):
        if not tamago.is_mixed:
            raise ValueError("卵を溶いてからじゃなきゃダメ！")
        tamago.is_scrambled = True
        return mixed_tamago

def tasting(dish):
    """
    味見メソッド
    """
    if 80 < dish.umami_level:
        print('美味い！')
    elif 40 < dish.umami_level and dish.umami_level <= 80:
        print('普通。')
    else:
        print('まずい…')


if __name__ == '__main__':
    try:
        print('卵を用意します。')
        tamago = Tamago()

        print('ボウルを用意します。')
        bowl = Bowl()

        print('卵を割ります。')
        inside = tamago.dividing()
        print('{inside}が出て来ました。'.format(inside=inside))

        print('ボウルに卵を入れて混ぜます。')
        mixed_tamago = bowl.mix(tamago, count=10)

        print('フライパンに油を敷きます。')
        oil = Oil(type=Oil.TYPES['salad'])
        pan = Pan(oil)

        print('フライパンに卵を入れて炒ります。')
        scrambled_tamago = pan.scramble(tamago)

        if not scrambled_tamago.is_scrambled:
            raise ValueError("卵に火が通ってなきゃダメ！") 
   
        tasting(scrambled_tamago)       
    except ValueError as e:
        print(e)
        print('失敗！')
```