Python 学習ノート

# Python 学習ノート

今回はPythonの基礎について説明します。

## 値について
数値とは、数で表される値です。
(例) 123、0.32
一方、文章で扱われる値を文字列といい、" "を付けて書きます。
(例) "nemlog" "essan"
数値と文字列を合わせて値といいます。

## 変数について
変数とは、数値や文字列といった値を保管しておくための入れ物です。
また値を変数に保管する際、以下のように記述します。
**変数 = 値**
ここで、=(イコールと呼ぶ)の意味は右辺を左辺に代入するということです。
つまり、Aを変数、Bを値とすると、A=B は「BをAに代入する」という意味になります。
数学でのイコールとは意味が違いますので、注意してください。

```Python:例
x = 3
y = "symbol"
```

※ここで、C言語のように、intとか型をつける必要がありません。
※C言語等の他言語では　値=変数; と文末にセミコロンを付けていて、Python3でもセミコロンを付けて実行しても問題はありませんが、非推奨のようですので、注意してください。

## 値を画面に表示させる方法
値を単に書くだけでは画面に表示されることはありません。そこで以下のようにする事で、値を表示させることができます。
**print(値)**

```Python:例
print("Hello World")
```

例の場合、画面にはHello Worldと表示されます。

## 四則演算について
プログラミングは本来、計算するためにあるものです。なので、四則演算を行う事ができます。これは、数字同士だけでなく、文章と演算することもできます。

```Python:例
x = 3
y = 20+9
```

また、数字同士だけでなく、文章と演算することもできます。
　数値と文字列を演算するときは、以下のようにして数値を文字列に変換して演算をします。
**str(数値が入った変数もしくは数値)**


```Python:例
a = 3
b = 20+9
x=str(a)
y=str(b)
z = x + "月" + y + "日" 
print(z)
```

この例の場合、画面には3月29日と表示されます。

## 関数について
関数とは、**ある処理をひとまとめにして書いたもの**であり、入力した値(引数)と出力された値(戻り値)のパイプ役となるものであり、以下のようにして書きます。
　 **関数名(引数)**
また、以下のようにすれば関数で得られた値を変数に代入することもできます。
　 **変数 = 関数名 (引数)**

先ほど登場したprint(値)やstr(数値)もまた関数です。print()はprint関数といい、str()はstr関数といいます。
この関数はPythonとして予め用意している関数であり、どんな関数があるのかは各自調べてください。

一方でPythonで予め用意されたものではなく、自分で関数をつくることもでき、以下のようにして書きます。
**def 関数名(引数1,引数2,・・・)**
　　**処理内容**

このとき、自分で作った関数に関しては、**処理したい範囲において字下げ**(インデントと言います)をしてください。
またインデントをする時は、**半角英数**で行ってください。全角ではエラー判定されてプログラムを実行することはできません。
なので、以下のようなコードを書いた場合は、関数とは見なされません。

**def 関数名(引数1,引数2,・・・)**
**処理内容**

例は、nemlogと画面に表示させる関数になります。この時の関数名はmohikanです
このコードを実行すると、nemlogと表示されます。


```Python:例
def mohikan():
       x="nemlog"
       print(x)
mohikan()
```

　また自分で作った関数には、**戻り値**を設定することがあります。戻り値とは関数内で処理された結果として得られた値です。つまり、出力値です。
　戻り値を設定することで、処理内容に書かれた処理を終わらせ、そして呼び出し先の関数が出力値として値となります。
　ここでごはんに例えると、ごはんを炊く前の米が引数、炊飯器が関数、炊いた米が戻り値になります。
これはreturn文で書かれ、記述の仕方としては以下のようになります。
 return 値
すると、関数は以下のように記述することになります。
def 関数名(引数1,引数2,・・・):
        処理内容
        return 値
戻り値を設定すると、以下のようにすれば、戻り値を変数に代入することもできます。
 変数 = 関数名(引数1,引数2,・・・)


以下の例は、入力された2つの数値を足す関数となります。

```Python:例
def add(x, y):
       ans = x + y
       return ans

n = add(3, 5)
print(n)
```

これは、8と出力されます。

この理由を説明します。

自分で定義した関数であるadd関数で、2つの数値を足す機能を定義します。
次に、「n = add(3, 5);」として関数の引値xとyにそれぞれ3と5を代入した状態でadd関数を呼び出します。
それから、add関数内ではx=3、y=5として処理され、計算することでansには8が代入されます。その8を出力値(戻り値)にすることで、関数add(3,5)は全体として8という値を持つことになります。
　すると、nに8を代入し、print関数にnを表示することで、8と表示されるようになります。

## モジュールについて
　**モジュール**とは、機能単位、交換可能な構成部分という意味の英単語であり、Pythonの機能を拡張するためのファイルになります。
　このモジュールを使う事で、Pythonの機能を拡張することができます。そのためには、モジュールを読み込まなければなりません。読み込む事をimportといいます。
　読み込むためには、importを用いて以下のように記述します。

**import モジュール名**
モジュールの中には関数が含まれており、それを読み込む事で、気軽に関数を使うことができます。

ここで、乱数処理ができるrandomモジュールを使ってみます。

```Python:例
import random

num = random.random()
print(num)
```

この結果は、0<num<1の範囲の数字が表示されます。

　ここでは、randomモジュールに含まれる関数であるrandom()を読み込み、numへ代入をします。
それを表示させることで、数字が表示されています。
　つまり、random.random()は関数としてみなせます。

また、asを付けてモジュールに別名をつける事ができます。
 import モジュール名 as 別名
つまり、モジュール名を一時的に別名に変えることができます。
すると、モジュール名が長い場合、短くすることができます

```Python:例
import numpy as np
np.array([0,1,2]);
```

これは、numpyというモジュール名をnpという名前に変えています。
また、numpyに入っている関数であるarray()を使い、np.array([0,1,2])を関数として見なす事ができます。

 

fromを使うと、モジュール内にある関数のみ読み込むことができます
from モジュール名 import 関数名

```Python:例
from numpy import array
array([0,1,2])
```

これは、numpyというモジュールに含まれる関数array()に関して、numpy.array()とすることなく、array()と直接書けることを意味しています。

 

pythonで使われているエディタとしてはAnacondaがあります。そのAnacondaにはモジュールが内臓されており、Anacondaでpythonを使うと、Anacondaに内臓されているモジュールを使う事ができます。

## シーケンスについて
プログラミングでコードを書く際、変数をいくつも定義すると、コードが複雑になることがあります。そのときに役に立つのが**シーケンス**です。シーケンスとは、連続したもの、順序のあるものという意味を持つ英単語であり、複数の値を持ったものになります。ここでは4つ紹介します。

**1. リスト(配列)**
リストとは、複数の値をまとめて保管できる変数です。ここで定義した変数をリスト名といい、 [ ] (角括弧)を利用して以下のように記述します。

**リスト名 = [値1, 値2, …]**

また、リストには**インデックス番号**が割り振られていて、先頭より0、1、2と割り振られています。その定義したリストより値を表示したい場合は、以下のように記述します。
 **リスト名[インデックス番号]**

```Python:例
x = [1,2,3,4]
print(x[1])
```

この処理結果は2と表示されます。

 

**2. タプル**

タプルは、リストと同様に複数の値をまとめて保管できる変数ですが、リストと違うのは、あとから値を追加/変更/削除できない所にあります。タプルの場合は ( ) (括弧)を使用します。

```Python:例
a = (1,2,3,4)
```

**3. 辞書（ディクショナリ）**

辞書（ディレクショナリ）とは、値に見出しをつけて保管できる変数です。その時の変数名をディレクショナリ名、見出しをキーといい、{ } (中括弧)を利用して以下のようにして記述します。
**ディレクショナリ名 = {キー1:値1,キー2;値2,・・・}**
また、ディレクショナリから値を取り出すには、[ ]を用いて以下のようにして記述します。
**ディレクショナリ名[取り出したい値のキー]**

```Python:例
d = {'YUTO': 30, 'やそ': 40, 'やってみよう': 50}
e = d['YUTO']
print(e)
```

この処理結果は30となります。

**4. 集合（セット）**

集合（セット）とは、値をグループ分けすることができる変数で、その時の変数名をセット名といい、{ } (中括弧)を利用して以下のように記述します。

**セット名 = {値1,値2,・・・}**

このとき、すでにある値1や値2を加えることはできません。
また、重複する値がある場合は無視されて、一意な値のみが要素として残ります。

```Python:例
myset = set([1,2,3,3,2,1])
print(myset)
```

この表示結果は{1,2,3)になります。

## 制御文について
制御文とは、プログラムを実際に流すための文章を言います。ここでは、代表的なものであるif文とfor文について紹介します。


(1) if文
if文は条件分岐をする際の構文であり、条件に応じて実行する処理を変更します。
この文は、以下のように記述します。
**if 条件式:**
　　**条件式を満たしているとき、処理を実行する**

ここで、条件を満たしている時に実行する所では、必ずインデントをしてください。

```Python:例
x=2
y=int(x)
if x<10:
      print("xは10未満です")
```

この時、x is less than 10　と表示されます。
x=10とすれば、何も表示されません。

また、条件が不成立な場合に実行したいプログラムを使うとき、以下のようにしてelseを使います
**if 条件式:**
　　**条件式を満たしているときに、この処理を実行する**
**else:**
　　**条件式を満たしていないときに、この処理を実行する**

```Python:例
x=input("please enter number:")
y=int(x)
if y <10:
       print("xは10未満です")
else:
        print("xは10以上です")
```

ここで、input()関数を用いています。これを用いることで、文字の入力状態になり、値を入力すると、入力した値がxに代入されます。
　また、input()関数は値は文字列しか受け付けていないので、数値を代入した場合はint(変数)やfloat(数値)とする必要があります。
　入力した結果、10未満の場合は「xは10未満です」と表示され、10以上の場合は「xは10以上です」と表示されます。

ここで、条件式には比較演算子を用いて記述しますので、比較演算子について説明します。
ここではAとBを値として考えます。

条件式 | 意味
:-----|:-----
A==B	| AとBは等しい
A != B	| AとBは等しくない
A < B	| AはB未満である
A <= B	| AはB以下である
A > B	| AはBより大きい
A >= B	| AはB以上である

これらの比較演算子をif文の条件式に書きます。

 **(2) for文**
for文は繰り返し処理をする際に用いられる構文であり、以下のようにして記述されます。
また、実行したい処理は必ずインデントをしてください。
**for 変数 in シーケンス:**
　　**実行したい処理**

```Python:例
num_list = [97, 78, 88, 76, 100, 85, 72, 85, 92, 75];

for x in num_list:
        print(x)
```

　説明すると、まず97がxに代入され、その状態でprint関数によって表示を実行します。次に78がxに代入され、その状態でprint関数によって表示を実行します。次に88がxに代入され、その状態でprint関数によって表示を実行します。
　これを繰り返していき、75を代入して実行し終えると、実行終了となります。

これが実行結果になります。

```Python
num_list = [97, 78, 88, 76, 100, 85, 72, 85, 92, 75];

for x in num_list:
    print(x)
```
```
97
78
88
76
100
85
72
85
92
75
```

　また、決まった回数を繰り返したいとき、range()関数を用います。range()関数は、入力値(引値)として数値を扱い、その数値の回数分、繰り返し処理を実行します。例えば、range(10)とすると、10回の繰り返し処理を実行します。
**for 変数 in range(繰り返したい回数):**
　　**実行したい処理**

また、実行したい処理はインデントをしてください。

```Python:例1
for x in range(10):
       print(x)
```

実行結果は以下のようになります。

```Python
for x in range(10):
    print(x)
```
```
0
1
2
3
4
5
6
7
8
9
```

```Python:例2
saving = 100;

for x in range(260):
        saving = saving + saving*0.0001
print(saving)
```

　これは、複利計算をするプログラムになっています。
ここでは、コインチェックに100LiSKを預けた場合、5年後にもらえるステーキング報酬はどうなるのかを計算してみたプログラムを作りました。なので、初期値として100を設定しました。なので、一番初めに「saving = 100;」と書きました。
　ステーキング報酬は1週間に一度配られ、1回にあたり金利は約0.01%ですので、「saving = saving + saving*0.0001」としました。
　また5年間は260週間と等しいので、range(260)としました。つまり、「saving = saving + saving*0.0001」の処理を260回繰り返すというものになります。
　この結果は、102.63396143200183LiSKとなりました。つまり、5年間で約2.6LiSKもらえるという計算です。
これをみると、みなさんはステーキング報酬のために、コインチェックでLiSKを買おうと思いますか?
どう判断するのかは、各自に任せます。

## オブジェクトについて
　Pythonにおいて**オブジェクト**とは、「**数値や文章といったデータや処理機能のまとまり**」です。なので、**変数、リストやディレクショショナリ等のシーケンス、関数もまたオブジェクトの一種**です。
ここで**データ**とは数値や文字列といった属性や所属等を表すものであり、関数等の処理機能を**メソッド**といいます。
そのオブジェクトをレゴブロックのようにして部品ごとにプログラムを作る考え方を**オブジェクト指向**といい、その設計図を**クラス**といいます。以下では、主にクラスについて考えます。

## クラスとは何か
　プログラミングコードを書く際、変数や関数などのオブジェクトをいくつも定義すると、コードが複雑になることがあります。なので、それらをまとめたいと考えるときに使うのが**クラス**になります。
　データとメソッドをまとめたオブジェクトを**クラス**といい、以下のようにして定義をします。
**class クラス名(引数):**
　　**データ**
　　**メソッド**
このとき、データとメソッドは必ずインデントをしてください。
ここで、クラス内のデータやメソッドを呼び出すときは、以下のように書きます。
**クラス名.データ名(もしくはメソッド名)**

```Python:例1
class MyClass: #クラスの定義
       PI = 3.14

print(MyClass.PI) #クラス内のデータやメソッドを呼び出す
```

この例では3.14と出力されます。
クラス名はMyClassで、データ名はPIです。なのでMyClassクラス内のPIを呼び出す時は、MyClass.PIと書く事になります。ここで呼び出したものを表示させるために、print関数を用います。

## インスタンスについて
オブジェクトは、コードで定義しても直接利用はできません。そのかわり、コードで定義されたオブジェクトを複製してオブジェクトを利用します。複製することをインスタンス化といい、そうしてできたオブジェクトを**インスタンス**といいます。そのインスタンスを作るには、以下のようにします。

**変数 = クラス名(引数)**

この時の変数名は**インスタンス名**といいます。このようにすることで、クラスを呼び出すことができます。
また引数を定義すると、引数に値を入れたクラスで処理されます。これは、関数を呼び出すことに近いといえるでしょう。

```Python:例
class MyClass:

           def setName(self, name): 
                    self.name = name

a = MyClass()　#Myname()というインスタンスが作られ、そのインスタンス名はaである
a.setName("Tanaka")  #インスタンスaの中にあるsetName関数内の引値nameにTanakaを代入する
print(a.name) #aの中のsetName関数内の変数「self.name」の値を表示させる
```

この例ではtanakaと出力されます。

ここで、メソッドで用いられる関数は以下のようにしてください。
**def 関数名(self , 引数1,引数2,・・・):**
　　**self.データ=値**

ここで、selfとは自分自身のインスタンスを表し、「self.データ」とすることでインスタンス内の変数として表されることになります。

## コンストラクタについて
**コンストラクタ**とは、インスタンス(オブジェクト)を生成する時に、オブジェクトを初期化する処理を書いたメソッド(関数)を言います。コンストラクタ関数は基本として以下のように記述します。

**def __init__(self,引数1,引数2,・・・)**
　　**self.データ = 値**

```Python:例
class MyClass:
           def __init__(self, name):
                  self.name = name
           def getName(self):
                  return self.name

a = MyClass("Tanaka")
print(a.getName())
```

これはTanakaと表示されます。

MyClassインスタンスの引数としてTanakaを与えられることで
self.name = Tanaka
となります。
次にgetName関数で、変数self.nameが戻り値として与えられます。
そうすることで、a.getName()を持つ値はTanakaとなります。

## クラスの継承について
　クラスには、データやメソッドを他のクラスへ引き継ぐことができます。これをクラスの**継承**といいます。
ここで、継承したクラスを**スーパークラス**、継承されたクラスを**サブクラス**といいます。

　クラスを継承する際、基本的な機能はスーパークラスで定義されたものを使い、サブクラスでは必要な分だけ書き換えたり追加するだけで十分です。
クラスを継承するためには、以下のように記述します。
**class サブクラス名(スーパークラス名)**

```Python:例
class animal():  #スーパークラス
       def __init__(self, name):
                self.name = name

class cat(animal):  #サブクラス
      def cry(self):
                print (self.name + ": mew")

sora = cat("sora") #saraをcatクラスへ代入し、それからanimalクラスにあるnameに代入する
sora.cry()
```

この処理結果は、sora:mew となります。

ここでは、animalがスーパークラス、catがサブクラスですので、以下のような感じに捉えることができます、

```Python:例
class cat(): 
         def __init__(self, name):
                  self.name = name
        def cry(self):
                print (self.name + ": mew")
```

sora = cat("sora")でnameへ文字列soraを代入し、それをcry関数で表示させるようにします。
そして、sora.cry() で画面に表示をされるのです。

## オーバーライドについて
クラスを継承する際、スーパークラスを上書きした状態でサブクラスへ継承することができます。これを**オーバーライド**といいます。

```Python:例
class animal():
       def __init__(self, name):
                self.name = name
        def message(self):
                 print("I am a " + self.name + ".")

class cat(animal):
       def message(self):
                 print ("I am a " + self.name + ": mew")

koko = cat("koko")
koko.message()
```

この処理結果は、I am a koko:mew となります。

ここでは、スーパークラスのmessage関数を上書きして、新しい処理にしたというプログラムになります。このようにすることで、以下のようなプログラムのような感じになります。
```Python
class cat():
        def __init__(self, name):
                self.name = name
       def message(self):
                 print ("I'm a " + self.name + ": mew")
```

つまり、
```Python
def message(self):
      print("I'm a " + self.name + ".")
```
は 
```Python
def message(self):
        print ("I'm a " + self.name + ": mew")
```
に上書きされた事を意味します。


またサブクラスでは、スーパークラスを呼び出し、その処理をサブクラス内で実行できます。その際は以下のようにして記述してください。
**super(サブクラス名,self).スーパークラス内のメソッド名**

```Python:例
class animal():
         def __init__(self, name):
                 self.name = name

class cat(animal):
         def __init__(self, name):
                  super(cat, self).__init__(name) #ここで、スーパークラスを呼び出す。

         def cry(self):
                   print (self.name + ": mew")

sora = cat("sora")
sora.cry()
```
この処理結果は、sora:mew になります。

## プロパティについて
オブジェクト内ではは、外部からデータを読み込んだり、外部へ取り出したりすることができます。
データをオブジェクトの外部から読み込むメソッドを**セッター(setter)**といい、外部へ取り出すメソッドを**ゲッター(getter)**といいます。
このセッターやゲッターを手軽に定義する機能を**プロパティ**といいます。それは以下のようにして定義します。
**property(ゲッター,セッター)**

ここで例を使って説明します。
まずクラスを定義をします。

```Python:例
class Person():

       def __init__(self, input_name): 
              self.hidden_name = input_name

       def get_name(self): # ゲッター
              return self.hidden_name

       def set_name(self, input_name):　# セッター
               self.hidden_name = input_name

       name = property(get_name, set_name)　# プロパティ
```

まず、ゲッターを使ってみます。
```Python
Human = Person('taro') # インスタンスを作る。
Human.name # 表示結果はtaro
```
ここでは、taroはインスタンス内部で定義されている値なので、それを外に取り出すことで、taroと表示させることができます。

次にセッターを使ってみます。
```Python
Person.name = 'jiro'
Person.name # 表示結果はjiro
```
ここでは、joroをpropertyに代入することで、外部から値を読み込むことになります。そうすることでセッターを使うことになります。そうすることで、jiroと表示させることができます。

## 参考図書
みんなのPython 第4版
Pythonの絵本 Pythonを楽しく学ぶ9つの扉