Pythonエンジニア認定基礎試験合格したので勉強法とかポイントとか残しておく

# はじめに

業務でPythonを扱うようになり、何かしら資格として持っておこうと思い立ち、一先ず手軽に取得できそうなPythonエンジニア認定基礎試験を受験してみました。
ちなみに私のケースとしては、7月から業務でPythonを使用するまでに2年程`Java`, `JavaScript(Vue.js)`を用いたプロジェクトに従事していました。
上記のような他言語の知識を持っている場合はどれくらい勉強すればいいかの指標になれば幸いです。


# Python 3 エンジニア認定基礎試験

初めに簡単な試験概要を公式サイトより引用します。

https://www.pythonic-exam.com/exam/basic

>試験名：Python3 エンジニア認定基礎試験
（英名：Python 3 Certified Engineer Basic Examination）
資格名：Python3 エンジニア認定基礎試験合格者
（英名：Python 3 Basic Grammar Certification）
概要：文法基礎を問う試験
問題数：40問（すべて選択問題）
試験時間：60分
合格ライン：正答率70％

試験はCBT方式です。
試験時間は60分ありますが、実際のところ20分掛からない程度で終わりました。
といっても早く解いたから何かボーナスがあるわけじゃないので、見直し等じっくり時間をかけても良いと思います。

合格ラインは正答率70%です。
問題数は40問なので、28問正解すれば合格です。
言い換えれば12問は間違っていても大丈夫なのです。


# 勉強について

## 参考にした書籍

一応試験の公式サイトによると、主教材として以下の書籍が紹介されています。


- オライリー・ジャパン「Pythonチュートリアル」

https://www.oreilly.co.jp/books/9784873119359/

模擬や実際の問題の中には上記の書籍に記載されている文章ベースの問が幾つか出題されます。
例）「〇〇について以下の選択肢の中から正しいもの/誤っているものを選べ」など。

ただ、Amazonレビューの記載の通り、正直な所、教科書としては微妙な内容だったりします。

私の場合は受験を決める前に予めPythonの独学用に拝読していた以下の書籍を参考書として使用していました。

- Python実践入門

https://gihyo.jp/book/2020/978-4-297-11111-3

こちらはプログラミング初めてという方にはもしかしたら少々難しいかもしれませんが、他言語の経験がある方にとっては非常におすすめです。
試験範囲を超えた内容ですが、ユニットテストや実際に簡単なアプリケーションをハンズオンするなど、実践的な内容に踏み込めます。

## 試験対策

では実際に試験対策した内容について紹介します。
とはいっても、元々業務のために、上記書籍のPython実践入門を読了しており、ある程度Pythonの知識が身についた状態でした。
そのため、「試験対策用にPythonの言語知識をどれだけ勉強したか」という事には残念ながらお答え難しいです。

受験を決めてから実際に受験するまでは2週間程度になります。
その間やった事としてはただひたすら

1. **模擬試験を解く**
1. **間違った問題を見直す**

という事でした。
間違った問題を重点的に見直すことで、効率的に得点を取ることができます。


何回か模擬試験を解いてみて、これはイケるなと思ってからテストセンターの予約を行いました。

## 模擬試験

Pythonエンジニア認定基礎試験の模擬試験としては2021/9現在、私の知る限り以下2サイトで公開されています。
私は併用して使用していました。

- PRIME STUDY
 - 模擬試験が3試験分用意されています。
 - 最初にメールアドレスを入力します。この入力したメールアドレスに結果が送信されます。
 - もう一方の`DIVE INTO EXAM`よりも問題の内容が難しめな印象。（問題のコードとかが複雑だった気がする。)

https://study.prime-strategy.co.jp/


- DIVE INTO EXAM
 - 会員登録が必要です。
 - 模擬試験を受けるだけであれば無料会員で十分です。有料会員だと講座？が受けれるのかな？
 - 回答結果の履歴が保存される機能があります。
 - 試験を受ける度にランダムで出題される点がおすすめ。
 - 問題内容は`PRIME STUDY`よりも簡単め。

https://diver.diveintocode.jp/dive_into_exam


## 勉強しておくと良いポイント

模擬試験および本試験の内容からここら辺を勉強しておくと良いポイントとして、
私自身知識が曖昧で解答中に迷った問題とかを触りだけ紹介します。

### インタプリタ関連

インタプリタに関しての問題が模擬試験でもよく出題されて本試験でも出題された覚えがあります。
選択肢の中から正しい文章もしくは誤っている文章を選べ系の問題ですね。
補完機能が有効になるタイミングとか知らなかった。

### モジュール読み込み

モジュール読み込み時の優先順位などは問題として作りやすいのか模擬でもよく見ました。
https://docs.python.org/ja/3/tutorial/modules.html

### Pythonっぽい記法

もともと`Java`を扱っていたので、JavaにはなくてPythonにある書き方に迷うことがありました。

#### スライス

スライス操作は今では慣れましたが当初は、「`:`の後は終点のインデックスだっけ？取得する要素数だっけ？」等のように曖昧に覚えてしまっていたことがありました。

```python
s = 'abcdefg'
s[0:5]
```

また、スライス操作の場合は範囲外のインデックスを指定してもエラーにならないと言うのも出題されそうなポイントですね。

```python
s[0:100] # エラーにはならない
```

#### 内包表記

内包表記は試験にも出ますが、普通に実用する上でも超絶便利なので覚えておきたいです。

```python
numbers = [str(v) for v in range(10)] 
# -> ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

evens = [v for v in range(10) if v%2 == 0]
# -> [0, 2, 4, 6, 8]


# 囲み方を変えるとセットや辞書になる。
numbers = {str(v) for v in range(10)}
#-> {'7', '1', '5', '0', '6', '4', '3', '2', '9', '8'}

dic = {str(x) : x for x in range(10)}
#-> {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
```

二重の内包表記も出題範囲ですのでチェックしておくと良いかと思います。

```python
arr = [x * y for x in range(1, 4) for y in range(1, 4)]
#-> [1, 2, 3, 2, 4, 6, 3, 6, 9]
```

#### デフォルト引数

デフォルト引数の特殊なケースについても、模擬を解いていて初めて知ったケースが幾つかありました。

例えば、デフォルト引数に変数を指定してしまったケース。

```python
i = 1
i = 2
def function(arg = i): # ここでargの初期値がi=2で定義されてしまう。
    i = 3
    print(arg) # なので出力は 2
i = 4
i = 5 
function()
```

また、デフォルト引数にリストを指定してしまったケース。

```python
def function(x, a = []):
    a.append(x)
    return a

print(function(1)) # [1]
print(function(2)) # [1,2]
```

[Pythonドキュメント 関数定義](https://docs.python.org/ja/3/reference/compound_stmts.html#function-definitions)より

> デフォルト引数値は関数定義が実行されるときに左から右へ評価されます。 これは、デフォルト引数の式は関数が定義されるときにただ一度だけ評価され、同じ "計算済みの" 値が呼び出しのたびに使用されることを意味します。この仕様を理解しておくことは特に、デフォルト引数値がリストや辞書のようなミュータブルなオブジェクトであるときに重要です: 関数がこのオブジェクトを変更 (例えばリストに要素を追加) すると、このデフォルト値が変更の影響を受けてしまします。一般には、これは意図しない動作です。このような動作を避けるには、デフォルト値として None を使い、この値を関数本体の中で明示的にテストします。例えば以下のようにします:

ここら辺は実際の業務では注意したい所ですね。


### 標準モジュール周り

よく使用されるとされる以下のライブラリの使用方法について問われる事がありました。
問題で見た覚えがあるのは以下となります。

- random
    - 乱数値周り
- re
    - 正規表現の操作
- reprlib
    - 文字列を制限付きで表現する処理を提供しているらしい。
- struct
    - バイナリデータ
- urllib
    - URL関連の操作
- json
    - json形式のデータの操作


# 終わりに

上でも書いた通り10問くらいは間違ってても合格できますので、
普段から業務でPython使用されている方でしたら、あまり力を入れずとも合格できるのではないかなぁと思いました。
Python未経験でも他言語の経験がある方でしたら、基本的な文法をインプットして何回か模試やってみたら受かりそうです。


私としては本試験と同様にPythonエンジニア育成推進協会が認定しているPythonデータ分析試験を受験してみる予定です。


お得なお話として、2021/9現在、Pythonエンジニア育成推進協会にて、データ分析試験の主教材である「Pythonによるあたらしいデータ分析の教科書」がもらえるキャンペーンをやっています。

1. TwitterなどのSNSで受験宣言を投稿する。
    1. Pythonエンジニア認定基礎試験/データ分析試験 のどちらでも可。
1. 投稿のURLや住所などをフォームに入力して応募する。
1. 本が届く！

実際に私も応募して、先日書籍を頂きました。
2021年11月末日までとの事なので、受験する予定のある方はご利用してみてはいかがでしょうか。

https://www.pythonic-exam.com/archives/news/555camp