Pythonの学習メモ

[Progate](https://prog-8.com/languages/python)や[Pythonチュートリアル](https://docs.python.org/ja/3/tutorial/index.html)で、あらかた勉強したのですが、[HackerRank](https://www.hackerrank.com/domains/python?filters%5Bstatus%5D%5B%5D=unsolved&badge_type=python)で解けない・理解できない問題がいくつかありました。
そのため、基礎を[この本](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-Jason-R-Briggs/dp/4274069443)で固めます。


#文字列・リスト・タプル・辞書
##文字列
###複数行の文字列を作る
クォート文字を3つ連続して書けば、複数行の文字を書けます。
エスケープもできて便利。

```python
>>> string = ''' He said, "I want to learn python very hard."
... However, he gave up studying it for only 2 months. '''
>>> print(string)
 He said, "I want to learn python very hard."
However, he gave up studying it for only 2 months. 
```

エスケープはこちらでも可能。

```python
>>> escape_string = "He said, \"I don\'t have time to study.\" "
>>> print(escape_string)
He said, "I don't have time to study." 
```

上の方が分かりやすいですかね。

###データを文字列に埋め込む
こうやって書くことが多いと思いますが、

```python
>>> myscore = 100
>>> message = "Your score is"
>>> print(message + str(myscore))
Your score is100
```

こんな風にも書けます。

```python
>>> myscore = 100
>>> message = "Your score is %i."
>>> print(message % myscore)
Your score is 100.

>>> spaces = ' ' * 25
>>> print("%s March 19th ,2019" % spaces)
                          March 19th ,2019
```

ここで、```i```はint,```s```はstringです。

引数が複数あったらこんな感じ。

```python
>>> m = "%s like %s."
>>> print(m % ("John", "Alis"))
John likes Alis.
```

##リスト
###リストをいじる

```python
>>> colors = ["red","green","blue"]

>>> colors.append("black")  #append：添える,付加する
>>> print(colors)
['red', 'green', 'blue', 'black']

>>> del colors[1]
>>> print(colors)
['red', 'blue', 'black']

>>> favorite_colors = ["emerald", "silver"]
>>> print(colors + favorite_colors)  #リスト同士しか繋げないので注意
['red', 'blue', 'black', 'emerald', 'silver']

>>> print(colors * 3)
['red', 'blue', 'black', 'red', 'blue', 'black', 'red', 'blue', 'black']
```

ちなみに、リストの割り算や引き算はエラーになります。
分割する場所によって、複数の解釈が生まれるからです。
プログラミングの世界では、命令はいつも同じように解釈なければいけないわけですね。

##タプル
タプルは、別名「定数リスト」と呼ばれており、基本的には要素を追加削除できません。
また、```()```でくくります。

```python
>>> numbers = (1,2,3)
>>> numbers[1] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

こんな風にエラーが出ます。
タプルは、
　要素の順番を変えられたくない時
　データ型が固定の場合
などに有効です。

##辞書
辞書は検索機能を持ったものではなく、「探しやすくデータをしまっておくもの」というイメージですかね。
**キー**と**値**のペアでデータを格納します。

```python

>>> club_activities = {"naruto" : "Baseball",
... "sasuke" : "Soccer",
... "sakura" : "karate",
... "itachi" : "tennis"}

>>> print(club_activities["sasuke"])
Soccer
```

キーから値を引っ張ってきます。
リストと同じく、書き換えや追加、削除は可能です。
しかし、辞書を足し合わせることはできません。

##まとめ
文字列は```""```,リストは```[]```,タプルは```()```,辞書は```{}```でくくります。

#関数とモジュールを使って月面体重計算プログラムを作る
自分で関数を定義する・モジュールをimportする・オブジェクトを使いこなす・うまく条件分岐させる...など、大事なことはたくさんです。
そんな大事なことを詰め込んだプログラムがこちら。
「年が経過するごとに、月面での体重はどうなるか」を計算します。

```python
import sys    #I want to use "sys.stdin.readline()"
>>>def moon_weight():
       print("Please your current weight.")
       weight = float(sys.stdin.readline())
       print("Please enter the amount your weight might increase each year.")
       increase = float(sys.stdin.readline())
       print("Please enter the number of years.")
       year = int(sys.stdin.readline())
       for y in range(0,year+1):
           mw = round(weight * 0.165, 3)
           print("Year %s is %s" % (y, mw))
           weight += increase

>>> moon_weight()
Please your current weight.
76
Please enter the amount your weight might increase each year.
1.1
Please enter the number of years.
9
Year 0 is 12.54
Year 1 is 12.721
Year 2 is 12.903
Year 3 is 13.084
Year 4 is 13.266
Year 5 is 13.447
Year 6 is 13.629
Year 7 is 13.81
Year 8 is 13.992
Year 9 is 14.173
```

#クラスとオブジェクトの概念
Python初心者で最初に難しいのはクラスとオブジェクト(インスタンスとも呼ぶ)ではないでしょうか。
なんとなーくで使っていると、まじで訳わからんくなります(自分もその1人)。

ここでは、「キリン」で例えて分かりやすくします。

まず、キリンは基をたどると「物体」です。
この「物体」がすべてのものの親クラスとなります。
そして、親クラスから子クラスにたどっていって、「キリン」クラスまでたどり着きます。
その「キリン」クラスの中に「jackson」という名前のキリンがいたとします。
ここに来て初めて、名前がついたので、jacksonは「オブジェクト」となるのです。

つまり、
・クラスは「もの(オブジェクト)」をまとめる分類
・オブジェクトは名前がついたもの
となります。

さらに、それぞれのクラス(分類)には、機能があります。

例えば、「動物」クラスなら、
・呼吸する
・食べる
といった機能があり、
「哺乳類」なら、
・赤ちゃんをお腹の中で育てる
といった機能があり、
「キリン」なら、
・長い首を使って木から葉っぱを食べる
といった機能があります。

この機能は「関数(Method)」で表します。

コード例はこんな感じ。

```python
>>> class Things:
...         pass    #今は関数を定義しない
...
>>> class Animate(Things):    #子クラス(親クラス)
...         pass
... 
>>> class Animals(Animate):
...         def breathe(self):    #selfには自分自身、つまり決めたキリンの名前(オブジェクト)が入る。
...                 print("bufooooo")  #キリンに呼吸させる
... 
>>> class Mammals(Animals):
...         def bring_up_babies(self):
...                 print("ogyaaaa")
... 
>>> class Giraffes(Mammals):
...         def eat_leaves(self):
...                 print("mosyamosyamosya")
... 
>>> jackson = Giraffes()    #キリンの名前を決める
>>> jackson.breathe()
bufooooo
>>> jackson.bring_up_babies()
ogyaaaa
>>> jackson.eat_leaves()
mosyamosyamosya
```

親クラスから子クラスに機能は継承されていくので、Giraffesクラスのjackson君はThings〜Goraffesクラスまでの機能をすべて持っています。

###便利な```__init__```関数
この関数にはこんなメリットがあります。
①オブジェクト(もの)を定義すると同時に関数を実行できる
②コードがシンプルになる

どういうことかと言うと、、、
動物園のキリンに名前をつける&体重を測る&体長を測る 例で見ていきます。

```python
#__init__無しの場合
giraffes1 = Giraffes()
giraffes.name = jackson
giraffes.weight = 350
giraffes.height = 6.8

giraffes2 = Giraffes()
giraffes.name = malia
giraffes.weight = 290
giraffes.height = 5.6
```

```python
#__init__ありの場合
#Giraffesクラスを編集
class Giraffes(Mammals):
    def __init__(self,name,weight,height):
        self.name = name
        self.weight = weight
        self.height = height
        def eat_leaves(self):
                print("mosyamosyamosya")


giraffes1 = Giraffes("jackson",350,6.8)
giraffes2 = Giraffes("malia",290,5.6)
```

1度定義してしまえばOKなので、楽チンですね。
キリンの数が増えるほど、効果を発揮します。

Giraffesクラスが呼び出されるごとに、オブジェクトを「初期化」して、新しいキリンの名前・体重・体長を決められます。