Python入門 Pythonの基礎

#index
- [Python入門 Pythonの基礎](https://qiita.com/RitaChan/private/6d12adfaf84fd805e226)
- [Python入門 Pythonによる科学計算](https://qiita.com/RitaChan/private/e754f3cd03d6ed4babc1)
- [Python入門 機械学習の基礎(教師なし学習/ 主成分分析)](https://qiita.com/RitaChan/items/45f435f14d2e785316cb)

#Jupyter Notebook使い方
以下を読んでインストールし、使い方を学ぶ。
[データ分析で欠かせない！Jupyter Notebookの使い方【初心者向け】](https://techacademy.jp/magazine/17430)

#Pythonの基礎
##変数
文字列を作成するときは、シングルクォーテーションまたはダブルクォーテーションで囲む。
また**Pythonには変数の型宣言が基本的に必要ない。**値を代入するだけで使える。

```python

msg = 'test'
print(msg) # 出力:test
```
##演算
```python

data = 1
print(data) # 出力: 1

data = data + 10
print(data) # 出力: 11
```
##リスト
**リスト**とは複数の値を一纏めにして扱うためのもの。他の言語の**配列と同じ。**

```python

data_list = [1,2,3,4,5,6,7,8,9,10]
print(data_list) # 出力: [1,2,3,4,5,6,7,8,9,10]
print('2番目の数:', data_list[1]) # 出力: ２番目の数:2
print('要素数:', len(data_list)) # 出力: 要素数:10

# リストに２を掛けても、リスト全体がもう一度繰り返されるだけ。２倍したい場合はfor文やNumpyを使う
print(data_list * 2) # 出力: [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]
```
リストの要素を追加したい場合は`append`、削除したい場合は`remove`や`pop`、`del`などを使う。

```python
data_list2 = [1,2,3,4,5]
print(data_list2) # 出力: [1,2,3,4,5]

# 括弧で指定した値と同じ要素を検索し、最初の要素を削除
data_list2.remove(1) 
print(data_list2) # 出力: [2,3,4,5]
```
```python
data_list3 = [1,2,3]
data_list3.append(10)
print(data_list3) # 出力: [1, 2, 3, 10]
```
##辞書型
辞書型では、**キーと値をペアにして複数の要素を管理する**ことができる。
Pythonで辞書を表現するには、`{キー:値}`のようにコンロ区切りで表記する。
次の例のように、「appleが100」「bananaが200」などのように、何か指定したキーに対して値を保持させたい時に使う。

```python
dic_data = {'apple':100, 'banana':200}
print(dic_data['banana']) # 出力: 200
dic_data["banana"] # 出力: 200
```
辞書の要素を追加したいときは`対象の辞書[キー] = 要素`

```python
dic_data ["orange"] = 300
print(dic_data) # 出力: {'apple': 100, 'banana': 200, 'orange': 300}
```
辞書の要素を削除したいときは`del 対象の辞書[キー]`

```python
del dic_data["apple"]
print(dic_data) # 出力: {'banana': 200, 'orange': 300}
```
--- 
【追記】
キーや、値だけを**リスト**として取り出したいときは、`.keys()`や`.values()`を使う。
それぞれ、取得した一覧は、`dict_keys`、`dict_values`として取得される。

```py
dic_data = {'apple':100, 'banana':200}
dic_data.keys() # 出力: dict_keys(['apple', 'banana'])
dic_data.values() # 出力: dict_values([100, 200])
```
以下の`for文`のところでも同じようにkeys()やvalues()を用いて取り出しているが、for文を使うとリストではなく、すべてのキーや値を順に取り出すことができる。
##タプル
リストと同く複数の値を格納できる型であるが、**変更できない**点と**実行速度が少し早い**点が異なる。
[タプルの使い方やリストとの違いについて解説](https://www.sejuku.net/blog/23964)

```python
list_sample = [1, 2, 3, 4, 5]
tuple_sample = (1, 2, 3, 4, 5)
#括弧がなくても良い
tuple_sample2 = 1, 2, 3, 4, 5

print(list_sample) # 出力: [1, 2, 3, 4, 5]
print(tuple_sample) # 出力: (1, 2, 3, 4, 5)
print(tuple_sample2) # 出力: (1, 2, 3, 4, 5)
```
##集合
集合もリストと同く複数の値を格納できる型であるが、**重複した要素は無視される**点と**要素に順番がない**点が異なる。
[【Python入門】すぐわかる！set型（集合型）の基本まとめ](https://www.sejuku.net/blog/21923)

```python
set_data1 = set([1,2,3])
set_data2 = set([1,2,3,3,2,1])
print(set_data1) # 出力: {1, 2, 3}
print(set_data2) # 出力: {1, 2, 3}
```
##if文
```
if [条件式]:
    [条件式がTrueのときに行う処理]
else:
    [条件式がFalseのときに行う処理]
```
`elif`は他の言語で言うと`else if`

```
if [条件式1]:
    [条件式がTrueのときに行う処理]
elif [条件式2]:
    [elifの条件式2がTrueのときに行う処理]
else:
    [if文の条件式1もelifの条件式2もどちらもFalseのときに行う処理]
```
```python

data_list4 = [1,2,3,4,5,6]
findvalue = 10

if findvalue in data_list4:
    print('{0} は見つかりました。' .format(findvalue))
else:
    print('{0}は見つかりませんでした。' .format(findvalue))

# 出力: 10は見つかりませんでした。
```
結果を表示するのに用いた`'文字列'.format(値,...)`は文字列フォーマットと言い、上で指定している{0}は、formatの括弧の最初に指定した値を埋め込むための指定である。

```python

print('{0}と{1}を足すと{2}です。' .format(2,3,5))
# 出力: 2と3を足すと5です。
```

##for文
他の言語と同様な動きをする。書き方は以下を参考。

```python

data_list5 = [1,2,3,4,5]
total = 0

for num in data_list5:
    total += num
    
print('合計:',total) # 出力: 合計: 15
```
辞書型でfor文を使って要素を取り出す際には、
`key()メソッド：キーを取り出す`
`values()メソッド：値を取り出す。`
`items()メソッド：両方を取り出す。` の3つがある。

```python

dic_data2 = {'apple':100, 'banana':200, 'orange':300}

for all_data in dic_data2:
    print(all_data) 

# 出力: apple
#      banana
#      orange

for all_data in dic_data2.keys():
    print(all_data)

# 出力: apple
#      banana
#      orange

for all_data in dic_data2.values():
    print(all_data)

# 出力: 100
#      200
#      300

for all_data in dic_data2.items():
    print(all_data)

# 出力: ('apple', 100)
#      ('banana', 200)
#      ('orange', 300)

for all_data1,all_data2 in dic_data2.items():
    print(all_data1,all_data2)

# 出力: apple 100
#      banana 200
#      orange 300
```
##range関数
連続した整数のリストを作りたい時に利用する関数。
`range(N)`とした時、0〜N-1までの整数が出力されることに注意する。

```python

for i in range(10):
    print(i)
```
```:出力
0
1
2
3
4
5
6
7
8
9
```
さらにrange関数では括弧の中に`最初の値`,`最後の値-1`,`飛ばす値`を指定できる。

```python
#1から9までの2個飛ばし
for i in range(1,10,2):
    print(i)
```
```:出力
1
3
5
7
9
```
##内包表記
for文を使って取り出したデータを、さらに別のリストとして結果を作成する方法。

```python
#dataから値を取り出して変数iに格納。これを2倍にしてdata1へ
data = [1,2,3,4,5]
data1 = []

data1 = [i * 2 for i in data]
print(data1) # 出力: [2, 4, 6, 8, 10]
```
条件を指定し、条件に合致するものだけを新しいリストの対象にすることも出来る。
先に条件に合う`i`だけを取り出して2倍していることがわかる。

```py
data = [1,2,3,4,5]
[i * 2 for i in data if i % 2 ==0] # 出力: [4, 8]
```
##zip関数
それぞれ異なるリストを同時に取り出していく処理を実行する。
たとえば、[1,2,3]というリストと、[11,12,13]という2つのリストがあるとき、それぞれ同じインデックスで値を取って表示される。

```py
for x , y in zip([1,2,3], [11,12,13]):
    print(x, 'と', y)
```
```:出力
1 と 11
2 と 12
3 と 13
```
##while文
```py
num = 1 #初期値
while num <= 10:
    print(num)
    num = num + 1
```
```:出力
1
2
3
4
5
6
7
8
9
10
```
##関数
一連の処理をひとまとめにする仕組み。
書き方としては、defの後に関数名、引数があれば、()の中に、引数名を記述。この引数が入力となって、returnで結果を返し（返り値）、これが出力となる。

```py
def calc_multi(a,b):
    return a*b

calc_multi(3,10) # 出力: 30
```
##無名関数
関数には無名関数と呼ばれるものがあり、これを使うと、コードを簡素化出来る。
無名関数を書くには、`lambda(ラムダ)`というキーワードを使用する。
無名関数は、リストなどの要素に対して何か関数を実行したいときに、よく使う。

```py
(lambda a,b: a*b)(3,10) # 出力: 30
```
ここで`lambda a, b:`というのが、関数名(a, b)に相当する部分。
そして`:`で区切って、その関数の処理（ここでは`return a * b`）を記述するというのが、無名関数の基本的な書き方となる。
##map
要素に対して、何か処理したいときは、map関数を使う。
関数を引数や戻り値として使う関数で、各要素に対して、何か処理や操作したいときに使う。

```py
def calc_double(x):
    return x * 2

#forを使う場合
for num in [1,2,3,4]:
    print(calc_double(num)) # 出力: ①
    
#map関数を使う場合
list(map(calc_double, [1,2,3,4])) # 出力: ②
```
```:出力
①の出力
2
4
6
8

②の出力 [2, 4, 6, 8]
```
無名関数を使えば、別に関数を用意しなくても直接関数の処理を記述出来る。

```py
list(map(lambda x : x * 2, [1,2,3,4])) # 出力: [2, 4, 6, 8]
```