Pythonノート: 基本系

# 概要
Pythonノート基本系　(自分用メモ)

# 基本

## 文・式
基本的にインタープリタなので１文ずつ解釈して動作

改行が文の区切りになる
```py
print("Hello")
print("Goodbye")
```

コロンで区切っても良い
```py
>>> print("Hello"); print("Goodbye")
Hello
Goodbye
```

## コメント

`#`で始まる行はコメントとして扱われる
```py
# comment xxxx
```

# 制御構文

## インデント

制御構文のブロックは一般的に括弧{ ...... }で表すことが多いが、pythonはインデントによってブロックを表現する

## if文

```py
if a is b:
    print("a is equal to b")
else:
    print("a is not equal to b")
```

## while文

`while condition:` でブロックを始める。
`else:`節を記載した場合ブロックは一度だけ実行される

```py
while a < b:
    print(f"a = {a}")
    a += 1
else:
    print(f"a = {a} (end)")
```

## for文

forはシーケンス型(list, tuple...)の各要素に対して処理を繰り返す
`for 変数 in リスト：`のように記載
`else:`節がある場合は最後に一度だけブロックを実行
```py
>>> for i in [1,2,3,4]:
...     print(f"i={i}")
... else:
...     print("end")
i=1
i=2
i=3
i=4
end
```

## range関数

range関数は整数などのシーケンスを作成するのに便利
書式は `range(start, stop [, step])`
start省略時はstart=0, step省略時はstep=1

```py
>>> for num in range(0, 4):
...   print(num)
...
0
1
2
3
```

戻り値はrange型のオブジェクト (class 'range')

```py
>>> r = range(3)
>>> r
range(0, 3)
>>> type(r)
```
```zsh
<class 'range'>
```

## break / continue

break/continueは他言語同様
breakはループを脱出、continueは処理をスキップし次のインデックスの処理から再開する。

```py
for i in range(10):
    if i != 3:
        print(f"i=={i}")
    else:
        print("i==3 => break")
        break
```

```py
for i in range(10):
    if i != 3:
        print(f"i=={i}")
    else:
        print("i==3 => skip")
        continue
```


# 演算子
## 算術演算子

|種類|記法|例|
|:-|:-|:-|
|加算|`+`|`a = 1 + 2`|
|減算|`-`|`a = 3 - 2`|
|乗算|`*`|`a = 2 * 2`|
|累乗|`*`|`a = 2 ** 3` |
|除算(結果はfloat)|`/`|`a = 125 / 23 (a = 5.434782608695652 )`|
|除算(余りは切り捨て)|`//`|`a = 125 // 23 (a = 5)`|
|剰余|`%`|`a = 125 % 23 (a = 10)`|

## ビット演算子
|種類|記法|
|:-|:-|
|AND|`a & b`|
|OR|`a \| b`|
|XOR|`a ^ b`|
|左シフト(算術)|`a >> n`|
|右シフト(算術)|`a << n`|

## 論理(bool)演算子

|種類|記法|
|:-|:-|
|and|`a and b`|
|or|`a or b`|
|not|`not b`|

## 比較演算子

|種類|記法|
|:-|:-|
|等しい|`a == b`|
|異なる|`a != b`|
|～より小さい|`a < b`|
|～より大きい|`a > b`|
|～以下|`a <= b`|
|～以上|`a >= b`|
|等しい|`a is b`|
|異なる|`a is not b`|
|に含まれる(bはシーケンス型)|`a in b`|
|に含まない(bはシーケンス型)|`a not in b`|



# 組み込み型

[公式 docs.python.org : 組み込み型](https://docs.python.org/ja/3/library/stdtypes.html)


## 型を調べる


- `type()`関数を使う
- 整数(int)型の場合

```py
>>> num = 10
>>> type(num)
<class 'int'>
```


## 数値型 int / float / complex

[公式 docs.python.org: 数値型 int, float, complex](https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-float-complex)

### int(整数)

```py
>>> num = 3
```

`0x` `0o` `0b`で始まる値は16進数、８進数、２進数で記載した数値として扱われる

```py
>>> 0x20
32
```

```py
>>> 0o20
16
```

```py
>>> 0b10
2
```

### float(浮動小数点型)

```py
>>> type(0.02)
<class'float'>
```

`e'n(整数)'`で10のn乗を表す
```py
>>> 0.24e-3
0.00024
```


### complex(複素数型)

虚数を`j`で記載して複素数を表す

```py
>>> cmp = 1 + 2j
>>> type(cmp)
<class'complex'>
```

### str 文字列型

シングル;/ダブルクォートで囲んだ値は文字列リテラル(=定数)となる。

```py
>>> s = 'abc'
>>> type(s)
<class'str'>
```

### bool ブール型

`True`,`False`で記載
```py
>>> B = True
>>> C = False
>>> A and B
False
```

### list リスト型

`[ ]` で囲んだ値がリスト（いわゆる配列）

```py
>>> list_1 = [ 3, 7, 'abc', 2+3j]
>>> list_1
[3, 7, 'abc', (2+3j)]
>>> type(list_1)
<class'list'>
```

### tuple タプル型

`( )` で囲んだ値がタプル（書き換え不可なリスト）

```py
>>> tpl = (5,6,'tuple')
>>> tpl
(5, 6, 'tuple')
>>> type(tpl)
<class'tuple'>
```

### dict ディクショナリ型

`{ }` で囲んだ値がディクショナリ（辞書型＝ハッシュ型）

```py
>>> dct = {'age':10, 'name':'Bob', 'job':'null'}
>>> dct
{'age': 10, 'name': 'Bob', 'job': 'null'}
>>> dct['name']
'Bob'
>>> type(dct)
<class'dict'>
```

### 内包表記　[式 for 変数名 in シーケンス型オブジェクト]

リストなどシーケンス型の各要素に対して演算した結果をリスト(など)に格納できる

```py
>>> a = [2,5,6]
```

リストの各要素の2倍の値のリスト
```py
>>> [i * 2 for i in a]
[4, 10, 12]
```

### bytes型

文字列リテラルにプレフィックスbをつけたものはbytes型となる

```py
>>> b = b'abc'
>>> type(b)
<class'bytes'>
```

また文字列型オブジェクトに対しencode(),decode()メソッドを使用してbyte型に変換できる
```py
>>> s = 'abc'
>>> s.encode()
b'abc'
```

# 型変換
## 数値↔文字列変換

### int(文字列, base)

- 16進数 base=16
```py
>>> int('20', 16)
32
```

- 10進数 base=10
```py
>>> int('20', 10)
20
```

- base=2
```py
>>> int('100', 2)
4
```

### str(整数)

- 整数(10進) →文字列
```py
>>> str(20)
'20'
```

- 整数(16進) →文字列
```py
>>> str(0x20)
'32'
```

# 文字列format

### formatメソッド

- `format()` メソッドでの表示
- 記載方法 : `"本文 {:フォーマット}".format(変数)`
```py
>>> name = 'bob'
>>> age = 33
```

```py
>>> print("Name is {:s}. Age is {:d}".format(name, age))
Name is bob. Age is 33
```

### f文字列

- f文字列でもformatメソッド同様の出力ができる
- 記載方法 : `f"本文 {変数:フォーマット}"`
```py
>>> print(f"Name is {name:s}. Age is {age:d}")
Name is bob. Age is 33
```

### 字下げ、桁揃えのフォーマット指定

- 右揃えは`>`, 左揃えは`<`で指定。
```py
>>> print(f"Age: {age:>3d}")
Age:  33
     ^^^ 3文字で右寄せ (空白埋め)

>>> print(f"Age: {age:<3d}")
Age: 33
     ^^^ 3文字で左寄せ

```

- 0埋めの指定
```py
>>> print(f"Age: {age:>03d}")
Age: 033
     ^^^ 3文字で右寄せ (0埋め)
```

### `%`を使った書式化

```py
>>> print("Age: %03d" % age)
Age: 033
```