Python 初級入門　基本とデータ

## 前提
- python初学者、触ったことない人が投稿しています
- 個人的にあまり馴染みのない書き方について記載しています


## 変数宣言
- `const`みたいな宣言方法ではない
- ~~型定義をしなくても勝手に型推論してくれる~~
- 変数が保持してるオブジェクトIDを取り出してtype関数に渡し、type関数はオブジェクトが持ってる型情報を返すだけです
なので、型推論してるというわけではなさそうです。(コメントにてご教授いただいただきました)
- 型が気になったら`type(num)`みたいな感じで確認可能
- 上書きも簡単にできる（値、型にかかわず）
→ 上書き（再代入）は、型変換しているのではなく、違うオブジェクトIDが代入されて参照先が変わるだけのことです。(コメントにてご教授いただいただきました)
```.py
num = 1 # int
name = 'Taro' #　string
is_ok = true # bool

# 後から入れた変数に簡単に型変換、上書きが可能
num = name
print(num) # 'Taro'

# python3.6から型宣言してあげることも可能になった
num: int = 1

# 頭文字に数字を入れるとSyntax Errorになる
1num = 1
```

- 出力方法
なんかふーんと思ったので記載
```.py
print('hoge') # hoge

# カンマとかで区切って出力できる "sep=''"
print('Hi','hoge',sep=',') # Hi,hoge

# 末尾に関しても指定して出力できる(デフォルトは "\n" になっている)
print('Hi','hoge',sep=',',end='.\n') # Hi,hoge.
```

## 数値
- 大半の数学関数は作成されているので`math`をインポートすることで使えるようになる
```.py
# 商
17 / 3 # 5.666667

# 商を切り下げたものを取得できる
17 // 3 # 5

# べき乗
5 * 5　* 5 * 5 * 5 # 3125

# 上のべき乗と同じ動きになる
5 ** 5 # 3125
```

## 文字列
```.py
#　バックスラッシュを文字列として出力したい
print(r'\name\name') #\name\name

# ダブルクォートを3つ繋げると改行込みで出力してくれる
# バックスラッシュを使うと次の行からという命令になる
print("""\
改行
改行\
""") 
>>> 
改行
改行

# ＊が使える
print('Hi.' * 3) # Hi.Hi.Hi.

# 文字の代入(.format)
'a is {0} {1} {2}'.format(1,2,3) # a is 1 2 3

# 指定代入
'My name is {name} {family}. Watashi ha {family} {name}'.format(name='Taro', family='Tanaka');

# Python3.6からformatでなく、f-stringになったみたい。
# f-stringの方が処理が早いようです
a='a'
print(f'a is {a}') # a is a

x, y, z = 1, 2, 3
print(f'a is {x}, {y}, {z}') # a is 1, 2, 3
print(f'a is {z}, {y}, {x}') # a is 3, 2, 1

name = 'Taro'
family = 'Tanaka'
print(f'My name is {name} {family}. Watashi ha {family} {name}')
# My name is Taro Tanaka. Watashi ha Tanaka Taro

```

## リスト
```.py
array =[1,2,3,4]

# 全体を指定
array[:]　# [1,2,3,4]

# 一つ飛ばしになる
array[::2] # [1,3]

# 順番が逆になる
array[::-1] # [4,3,2,1]

# 配列のデータを削除
del array # 何も表示されない

# リストのコピー
arr = [1,2,3]
arr2 = arr # [1,2,3]

# メモリが同じ場所を参照しているためarr2も更新される
arr[0] = 100
print(arr) # [100,2,3]
print(arr2) # [100,2,3]

# copyを使う
arr2 = arr.copy() # arr[:]でも同じことができる
arr[0] = 100
print(arr) # [100,2,3]
print(arr2) # [1,2,3]
```

## タプル型
- （1,2,3,4,5）と囲って使う型
- 読み込み専用？みたいなイメージ、追加等はできない
- カンマを使うとタプルになるので、忘れてしまうとstrやintになる
- typeはtuple
```.py
t=(1,2,3,4,5)
t[0] = 100 # errorになる

# tupleに配列を挿入することはできる
t = ([1,2],[3,4])
t[0][0] = 5 # このようなタプルの中の配列の書き換えは可能

# カンマを使うとタプルと認識される
t = 1,2
print(type(t)) # tuple

# タプルのアンパッキング
new_one = (10,20);
x,y = num_tuple
# 要するに展開している
print(x,y) # 10,20
```

## 辞書型
- オブジェクトみたいな感じ
- delとかpopはkeyを指定して、使うことが可能
- コピーする際は参照渡しになるので、`copy()`を使うと参照渡しにならない
- typeはdict
```.py
d = {'x':1, 'y':2}
>>>　d['x'] # 1

# 上書き
d['x'] = 10
>>>　d # {'x':10, 'y':2}

# 追加
d[1] = 'hoge'
>>>　d #{'x':10, 'y':2, 1:'hoge'}

# 以下のような生成方法もある
dict([('a':1),('b':2)]) #{'a':1, 'b':2}
```

## 集合
- {}で囲って定義すると重複がなくなる
- typeはset
- 集合には並びはないので`a[0]`のような指定はできない
```.py
a = {1,2,3,4,3,2,4}
>>>　a # {1, 2, 3, 4}

# a,bを比較し、重複していな値を抽出
b={4,3,5,6}
# aを基準にbと重複していない値
>>> a-b　　#{1, 2}
# bを基準にaと重複していない値
>>> b-a #{5, 6}

# 重複した値を取得
>>> a & b # {3,4}

# どちらかにある値
>>> a || b # {1,2,3,4,5,6}

# どちらかにしかない値
>>> a ^ b # {1,2,5,6}
```


## どんなmethodsがあるかわからなくて困った際
- help関数を使って中身等を確認できる（printとかしてあげれば出力可能）
```.py
import math
help(math)
```

## 学習してみて
実際にコードを書いてみないとなんとも言えないが、以下学習を通して感じたこと
- これまで触った言語とはことなる書き方が多々あった
- 型を意識しない書き方、上書き等は書きやすい反面、バグを生むリスクが高くなると感じた
- 基本的に他の言語の基礎を学んでいれば、とっつきにくい等は感じなさそう

## 最後に
次はもう少し深ぼって実際のコードに触れてみようと思う