0.はじめに
以前自社のコーポレートブログに「Pythonで卵焼き作ってみた。」という記事を書きました。
100%全力の釣りタイトルです。
毎月プログラミング初心者向けにPython勉強会を開催しているのですが、プログラミングという行為や出てくる概念を説明するのは非常に難しい。。。
何かなるべく多くの人が共通認識を持つお題でイメージしやすい資料を作りたいなぁと思っていたところ、こういう発想になりました。
絶賛Python勉強中という方は、「こういう風に使えるんだー」とか、「まだここらへんよくわからん。。」みたいな読み物感覚でご覧いただければと思います。
絶賛Python指導中という方は、「ここもっとこうしたら面白い」とか、「こう説明したら理解してもらえたー」みたいな共有いただけたら嬉しいです。
※注意
対象レベルは一応「Pythonチュートリアル」を終えている方としています。
オブジェクト指向を理解する手助けになればいいなぁぐらいの気持ちで書いていますので、細かい点や不可解なところも多少はご了承ください。
バージョンはPython3系で確認しています。
1.材料
- 卵
- 良い卵
- サラダ油
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.道具
- ボウル
- フライパン
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.手順
① 卵とボウルを用意します。
tamago = Tamago()
bowl = Bowl()
② 卵を割ってボウルに入れ、10回混ぜます。
inside = tamago.dividing()
mixed_tamago = bowl.mix(tamago, count=10)
③ フライパンにサラダ油を敷きます。
oil = Oil(type=Oil.TYPES['salad'])
pan = Pan(oil)
④ フライパンに卵を入れてい炒ります。
scrambled_tamago = pan.scramble(tamago)
オブジェクトを生成し、それらを利用して処理を実行していきます。
4.味見してみましょう
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の魅力を感じていただければ嬉しいです!!
おまけ
これまでに出てきたソースコードをまとめたものです。
いろいろ試しながら遊んでみて下さい!
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('失敗!')