Pythonのインストールと基本文法

# 概要
PythonのインストールとPythonの公式チュートリアルで学習したことをまとめました。

# 開発環境
- OS：MacOS Mojave 10.14.6
- Python 3.8.5

# インストール
## 1.pyenvのインストール

```
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

## 2.pyenvの利用方法とpythonのインストール
pyenvでインストール可能なPythonのバージョンを確認します。

```
pyenv install --list
```

インストール可能なバージョンのPythonをインストールします。

```
pyenv install 3.8.5
```

使いたいPythonのバージョンに切り替えます。

```
pyenv local 3.8.5
pyenv global 3.8.5
```


## 問題(下記のリンク参照)
1. zshでpyenvが起動しない<br>
https://qiita.com/hidekingerz/items/e2b662dfbeeb691999de

2. MacOSのpyenvでpyexpatのエラーが出る対処<br>
https://www.nozograph.com/2019/11/29/macos%E3%81%AEpyenv%E3%81%A7pyexpat%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B%E5%AF%BE%E5%87%A6/

# 文法
## 数値
```py
print(1 + 1)
print(2 - 0.1)
print(4 * 2)
print(5 / 2)

# 出力
# 2
# 1.9
# 8
# 2.5
```

## 文字列
文字列は インデックス (添字) を指定して文字を取得できます。最初の文字のインデックスは 0 になります。インデックスには負の値も指定できます。また部分文字列も取得できます。

```py
word = 'Python'
print(word[0])
print(word[5])
print(word[-1])　# インデックスに負の値
print(word[0:2]) # 部分文字列

# 出力
# 'P'
# 'n'
# 'n'
# 'Py'
```

Python の文字列は変更できません。従って文字列でインデックスを指定して代入するとエラーが発生します。

```py
word = 'Python'
word[2] = 'T'

# 出力
# TypeError: 'str' object does not support item assignment
```
### 埋め込み文字列

```py
a = "aaa"
print(f"私は{aaa}です"
```

## リスト
リストには異なる型の要素を入れることができます。

```py
list = [1, 'test', {"1":"test"}]
```

リストは連結などもサポートしています。

```py
squares = [1, 4, 9, 16, 25]
print(squares + [36, 49, 64, 81, 100])

# 出力
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```

## if文
```py
list = [1,2,3,4,5,6]
key1 = 10
key2 = 4

if key1 in list:
    print(key1)
elif key2 in list:
    print(key2)
else:
    print('見つかりませんでした。')

# 出力
# 4
```

## for文
Listや文字列を順番に繰り返し処理をします。

```py
word = 'Python'
for num in word:
    print(num)

# 出力
# P
# y
# t
# h
# o
# n
```

### range関数
```py
for i in range(5):
    print(i)

# 出力
# 0
# 1
# 2
# 3
# 4
```

## 関数

```py
def test(a,b):
    return a+b
    
print(test(1,3))

# 出力
# 4
```
### 無名関数
一度しか使わない関数のことです。キーワードlambdaをつけることで使うことができます。

```py
print((lambda a,b: a+b)(1,3))

# 出力
# 4
```

## 内包表記
for文を用いてListの全要素に処理をすることができます。
またif文を用いて抽出するリストを絞ることができます。

```py
nums = [1,2,3,4,5]
nums_after = [i * 3 for i in nums if i != 2]
for num in nums_after:
    print(num)

# 出力
# 3
# 9
# 12
# 15

# ちなみにC#のLINQだと以下のようになります。
# var nums = new List<int>(){1,2,3,4,5};
# var nums_after = nums.Where(x => x != 3).Select(x => x * 3);
```

## その他のデータ構造
### 辞書

```py
dic = {'one':'test1','two':'test2'}

## keyメソッドを用いたfor文
for key in dic.keys():
    # dicのキーを取り出す
    print(key)

# 出力
# one
# two


## valueメソッドを用いたfor文
for value in dic.values():
    # dicの価を取り出す
    print(value)

# 出力
# test1
# test2


## itemメソッドを用いたfor文
for key,value in dic.items():
    # dicの値を取り出す
    print(key,value)

# 出力
# one test1
# two test2
```

### タプル
Listに似ていますが一度代入したら変更できないこととListより要素のアクセスが早い点が特徴です。

```py
str_tuple = (1, 2, 3, 4)
```

### 集合
Listに似ていますがListと違い順番がないことと重複は無視されるのが特徴です。また和集合や積集合ができます。

```py
str_set = {'red', 'red', 'blue', 'green', 'yellow', 'green'}

str_set2 = set('abcdefg')
str_set3 = set('acg')
print(str_set)
print(str_set2 | str_set3)
print(str_set2 & str_set3)
print(str_set2 - str_set3)

# 出力
# {'blue', 'red', 'yellow', 'green'}
# {'g', 'b', 'e', 'f', 'a', 'd', 'c'}
# {'a', 'g', 'c'}
# {'d', 'b', 'e', 'f'}
```