Python3エンジニア認定基礎試験（1章～4章）

現在Python3エンジニア認定基礎試験の勉強中です。
学習したことを以下に整理していきます。
（個人のメモ用でもあるので、説明を少し省いている箇所もあります。）

# 1章 食欲をそそってみようか

**出題数 1/ 40問(2.5%)**


### 1.1 Pythonの特徴

- インタープリタ言語
    - コンパイル・リンクが不要
    - 対話モード

- Pythonは高水準言語
    - 高水準言語：人間が理解しやすい言語
    - 低水準言語：機械語など

- グルーピングにインデントを使用
    - インデント：字下げのこと

- 動的型付け
    - 変数や引数の宣言が不要
    - C言語やJavaなどは静的型付け

- モジュールとして再利用が可能
    - モジュール：Pythonのファイル（.py）のこと

- 拡張可能
    - ビルトインの関数やモジュールなど

- 主要OSで利用
    - Windows, Mac OS X, UNIXなど






# 2章 Pythonインタープリタの使い方

**出題数 1/ 40問(2.5%)**


### 2.1 インタープリタの起動・終了

##### 起動
`python`

`python -c コマンド`
　　　　例：`python -c "print('hello')"`

`python -m モジュール名`
　　　　例：`python -m test`
　　　　　（`python test.py`と同じ操作）

`python -i スクリプトファイル名`
　　　　例：`python -i script.py`
※スクリプト実行後に対話モードへ


##### 終了
Unixの場合：`Ctrl+d`
Windowsの場合：`Ctrl+z`
共通：`quit()`


### 2.2 引数を渡す
- スクリプト起動時の引数
    - sysモジュールのargvに割り当てられる（`sys.argv`）
    - `import sys`を実行して参照

- コマンドライン引数
    - コマンド入力画面(コマンドライン)からプログラムを起動する際に指定する文字列のこと

### 2.3 対話モード
プライマリプロンプト：コマンド入力を促す（`>>>`）
セカンダリプロンプト：継続行の入力を促す（`...`）

### 2.4 エンコーディング
デフォルトは**UTF-8**
それ以外を使う場合は`# coding: (エンコーディング方式)`を1行目に記載
※shebangを書く場合は2行目

**例**
```Python
#!/usr/bin/env python3.9
# coding: shift_jis
```



# 3章 気楽な入門編
**出題数 6/ 40問(15%)**

### 3.1 コメントアウト

- ハッシュ記号 `#` でコメントアウト

- 文字列リテラル (引用符で囲まれた文字列) 内部はコメントアウトできない


### 3.2 数値計算

- 四則演算
`>>> 1 + 3 * 4 / 2` -> 7.0

- 剰余
`>>> 5 % 2` -> 1

- 小数点以下切り捨て
`>>> 7 // 3` -> 2

- 累乗
`>>> 2 ** 3` -> 8

- 変数
`>>> a = 1`
`>>> b = 2`
`>>> a + b`
-> 3

- 四捨五入
`>>> round(5.4)` -> 5
`>>> round(5.5)` -> 6
`>>> round(5.43, 1)` -> 5.4

- その他
complex(複素数)、decimal(10進数)、fraction(分数)などもサポート



### 3.3 文字列

- シングルクォーテーション、ダブルクォーテーション
`>>> 'hello'` -> 'hello'
`>>> "hello"` -> 'hello'
`>>> 'dosen\'t'` -> "dosen't"
`>>> "dosen't"` -> "dosen't"

- エスケープシーケンス
`\n`：改行
`\t`：タブ

- print()関数とraw文字列
print()関数：全体を囲む引用符を除去、特殊文字として解釈
raw文字列：特殊文字として解釈しない

`>>> 'a\nb'` -> 'a\nb'
`>>> print(r'a\nb')` -> a\nb
`>>> print('a\nb')` -> a
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b

- トリプルクォーテーション
```Python
>>> '''
... a
... b
... c
... '''
'\na\nb\nc\n'
```

- 長い文字列
```Python
>>> ('あいうえお'
... 'かきくけこさしすせそ')
'あいうえおかきくけこさしすせそ'
```



- 長さ
`>>> word = 'abc'`
`>>> len(word)`
-> 3

- 連結、繰り返し
`>>> 'a' 'b'` -> 'ab'
`>>> 'a' + 'b'` -> 'ab'
`>>> 'a' * 3` -> 'aaa'

- インデックス指定・スライス
`>>> word = 'hello'`
`>>> word[1]`
-> 'e'
`>>> word[-1]`
-> 'o'
※インデックス指定は範囲外を指定するとエラー

`>>> word[0:2]`
-> 'he'
※スライスは範囲外をしてもエラーにならない


### 3.4 リスト

- `[]`で宣言
`>>> a = [1,2,3]`
`>>> a`
-> [1, 2, 3]
※数字、文字列、辞書型のデータなどを並べられる

- 文字列と同様に**長さ**の取得が可能

- ・文字列と同様に**連結、繰り返し**が可能

- 文字列と同様に**インデックス指定・スライス**が可能

- 改変可能（**ミュータブル**）
※文字列は改変不可（**イミュータブル**）

- 要素の追加
`>>> a = [1,2,3]`
`>>> a.append(4)`
`>>> a`
-> [1, 2, 3, 4]



### 3.5 多重代入

- 1行で記述可能
- 複数の変数に値を代入する場合、代入によって変数の値が更新される影響を受けない

`>>> a = 10`
`>>> a, b = 3, a + 1`
`>>> print(a, b)`
-> 3 11


### 3.6 条件分岐

- bool型（True、False）で判定
数値：0 → False、1 → True
シーケンス（リストや文字列）：長さが0 → False、長さが0以外 → True
比較演算子：`>`、`<`、`>=`、`<=`、`==`、`!=`



### 3.7 print()関数

- 引用符なしで表示
- アイテムとアイテムの間はスペース
- キーワード引数endで出力末尾の調整が可能

```Python
>>> print("abc", "def")
abc def

>>> for i in range(5):
...     print(i, end=",")
...
0,1,2,3,4,
```


# 4章 制御構造ツール
**出題数 9/ 40問(22.5%)**

### 4.1 if文

- 記載方法
`if 条件:`
`elif 条件:`
`else:`

```Python
>>> a = 1
>>> if a < 0:
...     print("負の数")
... elif a == 0:
...     print("0")
... else:
...     print("正の数")
...
正の数
```


### 4.2 for文

- 記載方法
`for 変数 in 要素の集まり:`
※入れ子構造により多重ループも可能


```Python
>>> wordlist = ["abc", "defg"]
>>> for word in wordlist:
...     print(word, len(word))
...
abc 3
defg 4
```

### 4.3 while文

- 記載方法
`while 条件:`
※条件が真（True）であれば実行
※入れ子構造により多重ループも可能

```Python
>>> i = 0
>>> while i < 5:
...     print(i)
...     i = i + 1
...
0
1
2
3
4
```


### 4.4 各種関数（range、list、enumerate）

- range()関数
`range (終了値):`
`range (開始値, 終了値):`
`range (開始値, 終了値, ステップ数):`

`>>> range(3)` -> range(0, 3)
`>>> range(0, 3)` -> range(0, 3)
`>>> range(0, 20, 5)` -> range(0, 20, 5)



- list()関数
要素の集まりをリスト形式に変換
`>>> list('abc')` -> ['a', 'b', 'c']
`>>> list(range(3))` -> [0, 1, 2]
`>>> list(range(0, 20, 5))` -> [0, 5, 10, 15]



- enumerate()関数
`for (変数),(変数) in enumerate(要素の集まり):`

```Python
>>> wordlist = ["abcde", "fjh"]
>>> for i, item in enumerate(wordlist):
...     print(i, item)
...
0 abcde
1 fjh
```


以下のように`range`と`len`を組み合わせた場合も同様の結果になる

```Python
>>> wordlist = ["abcde", "fjh"]
>>> for i in range(len(wordlist)):
...     print(i, wordlist[i])
...
0 abcde
1 fjh
```

### 4.5 繰り返し処理

- continue、break、else

`continue`：繰り返し処理をスキップ
`break`：繰り返し処理を中断
`else`：繰り返し処理終了後に実行


```Python
>>> for i in range(5):
...     if i == 3:
...         continue
...     print(i)
... else:
...     print("終了")
...
0
1
2
4
終了
```

```Python
>>> for i in range(5):
...     if i == 3:
...         break
...     print(i)
... else:
...     print("終了")
...
0
1
2
```


- イテラブル、イテレータ
イテラブル：繰り返し可能なオブジェクト
イテレータ：イテレーションした状態を記憶するオブジェクト
※`iter()`でイテレータ化したものを`next()`で取り出せる


### 4.6 pass文

- 後で実装する場合などの仮置き場として使用
※実行しても何も起きない

- `while True:`内で実行すると無限ループになる

```
>>> def abc():
...     pass
...
```


### 4.7 関数・引数

- 関数は`def`を使用

- スコープ（変数の有効範囲）
シンボル表を読み取る順はローカル → グローバル →  ビルトイン
※他のスコープに代入する場合はglobal文やlocal文を使用

- オブジェクトへの参照渡し　**※追記：Pythonでは参照渡しは存在せず、値渡しのみ**
**（以下は部分的には正しいが、参照渡しを勘違いして理解していることによる誤りとのこと）**
引数がミュータブルの場合
　　関数内で値が変更されると呼び出し元の変数も影響を受ける
引数がイミュータブルの場合
　　関数内で値が変更されても呼び出し元の変数は影響を受けない

- return文
関数の外で値を使用できる（return文がないとNoneになる）
関数の実行を終了させたいときにも使用可能

- 引数のデフォルト値
デフォルト値は、関数が定義された時点で関数を定義している側のスコープで評価
　　例：関数が定義されている時点で定義されている変数の値を使用
デフォルト値は1回のみ評価

- 位置引数、キーワード引数
位置引数：値の指定なし
キーワード引数：`=`で値を指定
※位置引数、キーワード引数の順番
※キーワード引数の順序は問われない

- 可変長引数
`*args`：タプルで受け取る
`**kwargs`：辞書で受け取る
※`*args`、`**kwargs`の順番

- 特殊引数
位置専用引数：`/`より前
　　※使用例：APIの引数名変更により呼び出せなくなるのを防ぐ
　　　　　　　位置引数と任意個数を表すキーワード引数の衝突を防ぐ
キーワード専用引数：`*`より後ろ

- アンパック
複数の要素を各変数に代入
`*`：リストやタプルをアンパック
`**`：辞書をアンパック

- lambda(ラムダ)式
名前を付ける程でもない小規模な関数に使用
他の関数と組み合わせて使用する事が前提とされた定義式
　　　（sort、max、 map、 filterなど）

- docstring（ドキュメンテーション文字列）
定義の先頭にその関数の使い方を記述
`"""`で囲んで記載
help()で呼び出し可能


- 関数アノテーション
引数アノテーションと返り値アノテーション
　　　　`def abc(x:str, y:int) -> str:`
挙動に変化はない
`.__annotations__`で型の確認が可能


### 4.8 コーディング規約
* PEP8：Pythonのスタイルガイド
  * インデントはスペース4つ
  * 79文字以下で折り返す
  * 他の行にコメントを書く
  * カンマの後ろはスペース
  * クラス名は頭文字を大文字に
  * 関数やメソッドは小文字の単語を_で繋ぐ
  * エンコーディングはUTF-8(Pythonのデフォルト)かASCIIを使用


※5章以降は別途記載予定・・・

エンジニアファーストの会社　[株式会社CRE-COエンジニアリングサービス](https://www.cre-co.jp/)