🖊

Python3エンジニア認定実践試験の勉強をするよ その1

2024/11/19に公開

はじめに

資格取得に向けた勉強会をすることになったため、
どうせやるなら、各項目の自分の理解を棚卸しておこうかなと。

主教材の内容に沿って、「試験合格に必要な情報」と「実務を見据えた情報」の2本立てで、
整理します。

  • 試験対策
    • 各章の「覚えておくこと」を参照
    • 本の内容をほぼ並べるだけって時は省略します(意味がないので)
  • 実務に向けた情報
    • 各章の「役に立つこと」を参照

使用する主教材/実行環境

主教材

  • Python実践レシピ
    Pythonエンジニア認定実践試験の公式サイトに記載されている書籍

  • ExamApp
    問題演習サイト(無料)

実行環境

  • Python3.12.2

試験概要

公式サイトより

項目 内容
問題数 40問
合格ライン 正答率70% (700点)
試験時間 75分
受験料金 12,000

1: Pythonの環境

タイトル 問題数 問題割合 備考
1 Pythonの環境 1 2.5%

覚えておくこと

pip 基本操作

pip install {パッケージ名}                # パッケージインストール
pip install {パッケージ名}==1.1.0         # パッケージインストール(バージョン指定)
pip install {パッケージ名}>=1.1.0, <2.0   # パッケージインストール(バージョン範囲指定)

pip install --upgrade {パッケージ名}        # パッケージアップグレード(最新版へ)
pip install --upgrade {パッケージ名}==1.0.0 # パッケージダウングレード

pip list    # インストールされているパッケージとバージョンの確認
pip show {パッケージ名}     # 指定したパッケージの詳細情報

pip uninstall {パッケージ名}    # パッケージのアンインストール

requirements.txtの利用

インストールするパッケージバージョンの統一が可能。
(開発/評価/本番環境でのPythonパッケージバージョンを揃えるなど)

pip freezeで書き出す場合は、依存関係でインストールしたものを含むすべてのパッケージが
書き出される。

pip freeze > requirements.txt   # インストールされているパッケージ/バージョンの書き出し
pip install -r requirements.txt # 記載されているパッケージ/バージョンのインストール

# 特定パッケージのインストール可能バージョンに制限をかける
pip install -r requirements.txt -c constraints.txt

freezeで書き出さなくても、以下のように最低限パッケージ名さえ記載されていれば
pip install -r requirements.txtでインストールすることもできる。

# requirements.txt
pandas
matplotlib

venvによる仮想環境

仮想環境 → Pythonの実行環境を独立した領域に切り分ける

  • Pythonパッケージのインストール先を分けることができる
    • 異なるバージョンのパッケージを使うことができる
    • プロジェクトごとに必要なパッケージのみインストールできる
# 仮想環境作成コマンド
# - カレントディレクトリに{仮想環境名}のフォルダが作成される(Python実行環境)
# - 作成されるPythonのバージョンは、実行時のPythonバージョンと同じになる
#   Python3.12.2で実行すれば、Python3.12.2で仮想環境が作成される
$ python -m venv {仮想環境名}
$ python -m venv env

# 仮想環境の有効化(UNIX系 bash/zsh)
$ source env/bin/activate
(env) xxxx      # プロンプトに(env)という仮想環境名が表示されるようになる

# 仮想環境の有効化(Windows コマンドプロンプト)
C: .\env\Script\activate.bat
(env) xxxx      # プロンプトに(env)という仮想環境名が表示されるようになる

# 仮想環境の有効化(Windows Powershell)
PS C: .\env\Script\Activate.ps1
(env) xxxx      # プロンプトに(env)という仮想環境名が表示されるようになる

# 仮想環境無効化(どのOSでも共通)
(env) deactivate
$

# 仮想環境削除
# 作成した仮想環境のディレクトリを削除すればOK
$ rm -rf env

役に立つこと

パッケージング

パッケージマネージャー

  • Poetryをサクッと使い始めてみる

  • uv (pythonパッケージマネージャー)の使い方 詳細版
    2024/11現在、よく使われているのはPoetryだと思いますが、
    今後はuvが台頭してくるのではないかと見ています。


    これらのツールでパッケージインストールを行うと、仮想環境も自動で作成されます。


    pip/venv/requirements.txtでも管理はできるが、パッケージ追加したときに
    requirements.txtの更新が漏れたりとか往々にしてあるので、この辺のツール使ったほうが便利。

2: コーディング規約

タイトル 問題数 問題割合 備考
2 コーディング規約 2 5.0%

覚えておくこと

Pythonでのコーディングスタイルには、PEP8という公式のガイドラインが
あります。

  • Flake8
    ソースコードがPEP8に準拠しているか、静的解析するツール(リンター)
  • Black
    ソースコードがPEP8に準拠していない箇所を自動整形するツール(フォーマッター)

役に立つこと

5: 型ヒント

タイトル 問題数 問題割合 備考
5 タイプヒント 2 5.0% 5.2 mypy は除く

覚えておくこと

Pythonは動的型付き言語であり、型を指定せずともプログラム実行時に動的に推論します。
しかし、実際にコーディングしている人間的には、「あれ、この変数の型ってなんだっけ?」
となることは往々にして起こります。

「型ヒント」を用いると、変数に型情報を付与することができます。
これにより、コードの可読性向上につながったり、IDEによる入力補完が効くようになり、
書きやすさの向上、バグの作りこみ防止にもつながります。

型ヒントの書き方

# 変数の宣言に型ヒントをつける
name: str = "太郎"
age: int = 20
student: bool = True


# 関数の引数/戻り値
def print_person_info(
    name: str,
    age: int,
) -> None: # 戻り値がないときはNone
    print(f"{name}さんは、{age}歳です。")


print_person_info("次郎", 18)
# -> 次郎さんは、18歳です。
# リスト型(要素は文字列型)
names: list = ["太郎", "次郎"]
names: list[str] = ["太郎", "次郎"]

# 辞書型(key-> 文字列, value-> int)
person: dict = {"太郎": 20, "次郎": 18}
person: dict[str, int] = {
    "太郎": 20,
    "次郎": 18,
}

# タプルの場合、要素の型ヒントはすべての要素に対して行う必要がある
# OK
person: tuple = ("太郎", 20)
person: tuple[str, int] = ("太郎", 20)

# NG
person: tuple[str] = ("太郎", "次郎")
# dataclass の型ヒント利用
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    student: bool

# Personという自作したクラスを引数として受け取るという型ヒント
def hello(person: Person):
    print(f"{person.name}さん、こんにちわ")

taro = Person("太郎", 20, True)
hello(person=taro)

typingモジュールを使用した型ヒント

typingは標準ライブラリになります。
これを用いると、いろいろな型をつけることができます。

  • Union
    一つの変数/引数に複数の型ヒントをつけられる
from typing import Union


# str, intどちらの場合も考えられる
def code(index: Union[int, str]) -> None:
    print(f"{index}")


# Python3.10以降はこの書き方もOK
def code_new(index: int | str) -> None:
    print(f"{index}")


code("A00-11")
code(11)
  • Optional
    変数/引数にNoneが渡されることを許容する
from typing import Optional


def sum(num1: int, num2: int, num3: Optional[int] = None) -> int:
    # 3番目の数字はNoneでも可能
    if num3 is None:
        return num1 + num2
    else:
        return num1 + num2 + num3


print(sum(10, 40, 50))
print(sum(10, 40))
  • Literal
    特定の値のみ許可
from typing import Literal
import pandas as pd

FILETYPE = Literal["csv", "xlsx"]


def read_file(filename: str, ext: FILETYPE):
    if ext == "csv":
        df = pd.read_csv(filename)
    elif ext == "xlsx":
        df = pd.read_excel(filename)
    else:
        raise ValueError(f"拡張子は{FILETYPE}のみ")

    return df


read_file("test.json", "json")
  • Any
    任意の型を許可
from typing import Any
user_input: Any = common_process()
  • TypedDict
    辞書のキーと値の型を指定
    辞書型に名前を付けられる
from typing import TypedDict


class Config(TypedDict):
    input_file: str
    setting_value1: int
    threshold: float


# 以下のように型ヒントをつけることができる
def use_config(config: Config):
    print(config)


cfg = Config(
    input_file="test.csv",
    setting_value1=10,
    threshold=0.8,
)
use_config(config=cfg)
# {'input_file': 'test.csv', 'setting_value1': 10, 'threshold': 0.8}

役に立つこと

次回

【執筆中】 Python3エンジニア認定実践試験の勉強をするよ その2

Discussion