Python3エンジニア認定基礎試験　個人的につまづいたところ集

ここでは筆者がPython3エンジニア認定基礎試験（以下Python認定試験）の勉強をするにあたって、難しいと感じた点、つまづいた点に関して簡単にまとめています。




||出題数|優先度||出題数|優先度|
|:----|:-:|:-:|:-|:--:|:--:|
|1章 やる気を高めよう|1|中|8章 エラーと例外|4|高|
|2章 Python インタプリンタを使う|1|中|9章 クラス|2|中|
|3章 形式ばらないPythonの紹介|6|高|10章 標準ライブラリミニツアー|4|高|
|4章 そのほかの制御フローツール|9|高|11章 標準ライブラリミニツアー2|1|低|
|5章 データ構造|7|高|12章 仮想環境とパッケージ |1|低|
|6章 モジュール|2|中|13章 さぁ何を？|0|低|
|7章 入力と出力|1|低|14章 対話入力編集と履歴置換|1|中|



### １章：食欲をそそってみようか
#####Pythonの特徴
・インタプリンタ言語である。
・可変長変数や辞書などの高級な型を持つ、超高級言語である。
・標準ライブラリには、ファイル I/O、システムコール、ソケットなどの機能をもつ。
・変数や引数の宣言が不要。


### 2章：Pythonのインタプリンタの使い方
・インタプリンタの起動方法として、**python -c command [arg]...** のような方法もある。
・インタプリンタ使用の際、**1番初めにバージョン番号と著作権表示**から始まるメッセージが表示される。
・一次プロンプトは **「>>>」**
・二次プロンプトは **「...」**
 ※プロンプト：コマンドを入力する場所表すところ
・インタープロンタを終了するコマンド：**quit()**
・**「-m」はmodule**を意味し、**「-c」はcommand**を意味する。
・**デフォルトで「UTF-8」**でエンコードされているものとして扱う。
　→ デフォルト以外を使用する場合は、ファイルの先頭に以下のコメントを追加することが必要となる。

``` Python
#-*- coding: （encoding）-*-

# ↓使用例
#-*- coding: utf_8-*-
```

### 3章：気楽な入門編
・定義されていない変数を使用するとエラーが発生する。
・Pythonでは**複素数もサポートしており、「j（J）」**の接尾辞を使って虚部を表す。
・**エスケープは「\」**ですることが可能。
・文字列のリテラルを**「"""」で囲むことで複数行で書くことができる**。
・対話モードにおいて、**最後に表示された結果を「_」として利用することが可能**。
・引用符の前に**'r'をつけることでエスケープシーケンスを無視する**ことができる。
・**文字列はimmutable**である。

```Python
# 除算は常にfloat型（不動小数点）で値を返す。
4/2
>>> 2.0

# 余り切り捨て
17/5
>>>5.66666666~
17//5
>>>5  

1.12+2.32
>>>3.44
round(_,1)
>>>3.4

a,b = 0,1
a,b = b,a+b  #代入の処理は同時に行われる。
print(a,b)
>>>1 1

# 文字列の足し算
"py" "thon"
>>> python　# +を省略可能(変数がない場合のみ)

text = "thon"
"py" text
>>> SyntaxError: invalid syntax #エラー
"py" + text
>>> python  # +を書けばOK

# 文字列はimmutableである
word = "python"
word[0]
>>> p
word[0]="t"
>>> 'str' object does not support item assignment  # エラー
```
#### indexの指定

``` python
word = "Python"
word[1:3]
>>>yt
word[:2] + word[2:]
>>>Python
word[3:100]
>>>hon
word[50:]
>>>

text = "python_txt"
print(text[1:7:3])
>>>yot
```

#### リスト型
・リスト型は「可変型」である。

#### 辞書型
・ディクショナリは変更可能（mutable）であるが、キーの型は変更不能（immutable）であり、その値は一意でなければならない。

### 4章：制御構造ツール
##### ・range()関数・
range()：イテラブル（くり返し可能なオブジェクト）

```python
range(0,5)
>>> 0,1,2,3,4

range(0,10,2)
>>> 0,2,4,6,8
```

**〜ドキュメンテーション（docstring）〜**
**・1行目は短く簡潔にまとめる必要があり、対象の名前・型を明記する必要はない。
・1行目の１文字目は大文字、最後は"."で終わらせる。
・1行目以外に追記があれば、2行目は空行にし、1行目のまとめと追記分を視覚的に分ける。**

**〜アノテーション〜**
**・関数注釈（アノテーション）は関数の__annotations__属性にリストとして格納され、注釈の内容によっては関数のほかの部分に影響を与えることはない**

**〜コーディングについて〜**
**・インデントは空白4つで、タブは使わない
・コードの幅は７９文字以内で折り返すこと
・可能な限りコメントは行に独立で記述する**


### 5章：データ構造
・キュー（from collections import deque）

比較演算子
・比較演算子は全て同じ優先順位を持つ。
ブール演算子**and及びorは短絡演算子**という。


```python:list比較
[1,4,5] < [2,1,1]  # True
[2,4,6] < [5]  # False
"Python" < "python"  # True　大文字 < 小文字
```





### 6章：モジュール
##### モジュールの検索パスについて
特定のモジュールをインポートする際にインタープリンタが検索する順番は、
**ビルトインモジュール、sys.path変数で得られるディレクトリ**である。
**※シンボリックリンクを置いてあるディレクトリはモジュール検索パスに入らない。**

**〜sys.pathの初期化場所〜**
・入力スクリプトのあるディレクトリ
・PYTHONPATH
・インストールごとのデフォルト

**〜コンパイルされたpythonファイルについて〜**
コンパイルが済んでいるモジュールは、**"__pycache__"**ディレクトリ内の**"module.version.pyc"**ファイルとしてキャッシュする

**〜パッケージについて〜**
パッケージを扱わせるためには、**"__init__"**ファイルが必要となる。

### 7章：入出力
### 8章：エラーと例外
エラーには大きく分けて構文エラー（syntax error,parsing error）・例外(exception)の２種類ががある。

#### 例外について
・例外は必ずしも致命的なものとは限らない。
・except節は複数記述することが可能（実行される処理は一つだけ）。
・try-except文では、オプションとしてelse節をつけることができる。（else節を記述する際は、except文より後に書かなくてはならない）
　※try節で例外が出なかった際に実行する処理を書くことに役立つ。


### 9章：クラス

### 10章：標準ライブラリめぐり
##### よく使うモジュールについて
OSモジュール：オペレーティングシステムと対話に利用できる関数をもつ。
shuilモジュール：ファイル・ディレクトリの管理作業に利用できる高水準のインターフェイスをもつ。
　例：ファイルのコピー、フォルダの移動など
globモジュール：ディレクトリの検索からファイルのリストを生成する関数をもつ。
getoptモジュール：より柔軟性のあるコマンドライン処理機能を提供する関数をもつ
smtplibモジュール：任意のインターネット上のホストにメールを送ることができる。
mathモジュール
　・choice([list])：リストからランダムな要素を選択する。(文字列でも可)
　・sample(対象, 個数)：ランダムに複数要素を選択する。



##### コマンドライン引数
コマンドライン引数は、sysモジュールのargvにリストで保存される。

```python:main.py
# コマンドラインで入力 → 「python main.py tokyo chiba saitama」
import sys
print(sys.argv)
>>> ['main.py', 'tokyo', 'chiba', 'saitama']
```

・sys.exit()は直接的にスクリプトを終了させることができる。


### 11章：標準ライブラリ巡り-Part2
・loggingモジュールのメッセージ優先度
　->CRITICAL、ERROR、WARNING、INFO、DEBUG

### 12章：仮想環境とパッケージ
仮想環境の作成について、仮想環境の作成と管理を行うためのモジュールが「venv」

#####pipを使ったパッケージ管理
pipのでよく使うコマンド
pip install(==xxx or --upgrade)：パッケージをインストールする（Versionの指定や、upgradeも可能）
pip uninstall：コマンドに削除するパッケージを一つ以上指定し、アンインストールする。
pip show：指定されたパッケージの上表を表示する。
pip list：仮想環境にインストールされた全てのパッケージを表示する。

### 13章：次はなに？
出題数が0のため割愛

### 14章：対話環境での入力行編集とヒストリ置換
・**変数とモジュール名**の補完は**インタプリンタ起動時**に自動で有効化される
・対話環境での履歴は**「.python_history」**ファイルに保存される


#### 雑まとめ
関数をコールするときは、必ず位置引数が先でキーワード引数を後にしなければならない。
リスト：mutable、タプル：imutable
dir()：モジュールが定義している名前を確認することができる。
logging：ログを取得するためのモジュール
re：正規表現ツールを提供するモジュール
remove()：要素の中から最初に見つけた指定値を削除
deactivate：アクティベート状態から抜けるコマンド（”()”いらない）
パッケージ：「ドット区切りモジュール名」を使ってPythonのモジュールを構築する方法。
pyvenv：仮想環境を生成、管理するのにつかわれているスクリプト
pythonのコーディングスタイル：可能であればコメント行を独立させる。
struct：バイナリデータレコードの処理を行うモジュール

```python:sample.py
selected_name = '' or 'suzuki' or 'tanaka' or 'sato'　# 左から評価し、Trueの値を返す。
print(selected_name)
>>> suzuki  
```


#### 後日談
難易度も高くないということで、一度目の受験で合格することができました。
所感としては、特に時間が足りないということも、問題を解いていて焦り等もなく、試験終了後も「ああ、大丈夫そうだな」といった感じです。自分が優秀等ではなく、pythonの基礎公文がある程度理解できていて、かつ、過去問を合格点+15点くらいでできていれば大体の人は問題なく突破できるだろうと思います。

最後に自分のテストに臨むにあたっての勉強方法や知識等を簡単にまとめます。

**勉強方法**
期間：１ヶ月ほど
勉強方法：土日に過去問を何回か解く程度

**pythonスキル**
・Progateでpython編を一通り修了
・技術書で基礎的な公文について理解している程度
　参考書：スッキリわかるPython入門
・実務経験なし（他言語含む）