「自作Python100本ノック」7日目（1週間の感想：31本〜40本目）

「自作Python100本ノック」7日目です。

もう、今日でPython100ノック始めて１週間ですか。
毎日コンスタントにこんなにPythonを書くことは今までなく、体感的にはめちゃめちゃ早いです。
『入門　Python3』を一通り読み終えたのですが、全然問題をゲットすることができず、やべえ後どこから問題持って来れば良いんだ状態となっております。


さて、
「自作Python100本ノック」とはそもそも何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など気になる方は詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます！（ちなみに今日は、10問です。）

今回の問題は全て[『入門　Python3』](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-3-Bill-Lubanovic/dp/4873117380)の内容を参考に作られていますので、気になった方は本書を確認して見てください。

##Q31 :集合内包表記を使って、range(10)の奇数の集合を作れ
　　　　

```q31.py
odd = {number for number in range(10) if number % 2 != 0}
odd
```
##Q32 :rage(10)の数値に対しては、"Got"と数値を返すジェネレータ関数を作れ。
条件：・ ジェネレータ内包表記を使うこと
　　　・ for文を使って反復処理すること
出力例：Got 0, Got 1, Got 2 ・・・・・
　　　　

```q32.py
for thing in ("Got %s" % number for number in range(10)):
    print(thing)
```
##Q33 :range(10)から奇数を返すジェネレータ関数を定義し、for文を使って、返された3番目の値を見つけて表示せよ。
　　　　

```q33.py
def get_odds():
    for number in range(1, 10, 2):
        yield number
    

    
for count, number in enumerate(get_odds(), 1):
    if count == 3:
        print(number)
        break
```

##Q34 :デコレータの定義
問題：関数が呼び出された時に"start"、終了した時に"end"を表示するtestというデコレータを定義せよ
　　　　

```q34.py
def test(func):
    def new_func(*args, **kwargs):
        print("start")
        result = func(*args, **kwargs)
        print("end")
        return result
    return new_func

@test
def greeting():
    print("Hello")

greeting()
```

##Q35 :例外のキャッチ
問題：以下のコードには例外が含まれる。例外に対するエラー処理を2つ追加せよ。　 　　
　　　　

```q35.py
#問題のコード

short_list = [1,2,3]
while True:
    value = input("Position [q to qui]? ")
    if value == "q":
        break
    positon = int(value)
    print(short_list[position])





#エラー処理を加えたもの

short_list = [1,2,3]
while True:
    value = input("Position [q to qui]? ")
    if value == "q":
        breakt
    try:
        positon = int(value)
        print(short_list[position])
    except IndexError as err:
        print("Bad index:", position)
    except Exception as other:
        print("something else broke:", other)
```
##Q36 :zip()を使ってmoviesという辞書を作れ
条件：
辞書は、titles = ["Creature of Habit", "Crewel Fate"]というリストと
plots = ["A nun turns into a monster", "A haunted yarn shop"]というリストを組み合わせて作るものとする。
　　　　

```q36.py
titles = ["Creature of Habit", "Crewel Fate"]
plots = ["A nun turns into a monster", "A haunted yarn shop"]

movies = dict(zip(titles, plots))
movies
```
##Q37 :クラスのオブジェクト辞書から直接初期化しよう
条件：以下のクラスと辞書を使用。

引数の特別な形式に注意ですね・
*args: 任意の固定引数が入ったタプル
**kwargs: 任意のキーワード引数が入った辞書
　　　　

```q37.py
#クラス
class Elements:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
#辞書
el_dict = {"name": "Hydrogem", "symbol": "H", "number": 1 }






#解答
#辞書から初期化
hydrogem = Elements(**el_dict) # 辞書を引数に渡すときは「**」 をつける
hydrogem.name
```
##Q38 :クラスを編集しprint(hydrogem)だけでオブジェクト属性の値が表示されるようにせよ
`str()`のメソッドが使えているかの練習ですね。
以下`str()`の使い方の説明です。

>str()は、Pythonの特殊メソッドの１つ。
print関数は、オブジェクトに、str() メソッドがなければ、親であるObjectクラスのデフォルトメソッドを使う。
（その場合、"< main.Element object at Ox1006f5310 >" のような文字列を返す）
　　　

```q38.py
#問題のクラス
class Elements:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number





#解答
class Elements:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
    def __str__(self):
        return ("name: %s, symbol: %s, number: %s" % (self.name, self.symbol, self.number))
    
el_dict = {"name": "Hydrogem", "symbol": "H", "number": 1 }

hydrogem = Elements(**el_dict)
print(hydrogem)
```
##Q39 :クラスを編集し、name,symbol,number属性を非公開にし、そしてそれぞれいついて値を返すゲッターを定義せよ。
　　　　

```q39.py
#問題
class Elements:
    def __init__(self, name, symbol, number):
        self.__name = name
        self.__symbol = symbol
        self.__number = number

#解答
class Elements:
    def __init__(self, name, symbol, number):
        self.__name = name
        self.__symbol = symbol
        self.__number = number

    @property#属性を非公開にする
    def name(self):
        return self.__name
    
    def symbol(self):
        return self.__symbol
    
    def number(self):
        return self.__number
    
el_dict = {"name": "Hydrogem", "symbol": "H", "number": 1 }

hydrogem = Elements(**el_dict)

hydrogem.name
hydrogem.__name
```
##Q40 :Bear, Rabbit, Octothorpeの3つのクラスを定義せよ。
条件：
それぞれについて唯一のメソッド、`eats()`を定義する。
`eats()`は、"berries"(Bear)、"clover"(Rabbit)、"campers"(Octothorpe)を返すものとする。
それぞれのクラスからオブジェクトを作り、何を食べるのかを表示せよ。

簡単なクラスの定義ですね。
　　　

```q40.py
class Bear:
    def eats(self):
        return "berries"
    
class Rabbit:        
    def eats(self):
        return "clover"
        
class Octothorpe:        
    def eats(self):
        return "campers"


b = Bear()
r = Rabbit()
o = Octothorpe()

print(b.eats())
print(r.eats())
print(o.eats())
```
##感想
ストックが増えすぎてきたので、今回は10問にしました。
昔インターンでPython書いていたのですが、
ジェネレータ関数や、デコレータなど案外使ったことがなく実は今回が初めての勉強でした。

例外のキャッチは先輩がよく使ってたのを見てたのですが、自分自身では結局全然使い方を勉強することがなかったので、今回きちんと勉強できてよかったです。

それでは！

→ [8日目](https://qiita.com/ahpjop/items/170c7450604c00f37230)