Python 3 エンジニア認定基礎試験(6章・7章)学習内容と対策法

Python 3 エンジニア認定基礎試験(6章・7章)学習内容と対策法 Python
Python 3 エンジニア認定基礎試験(6章・7章)学習内容と対策法
※本サイトは、プロモーションが含まれます

Python 3 エンジニア認定基礎試験(6章・7章)は、Pythonの基礎から実践的なスキルまで幅広くカバーする重要な試験範囲です。特に、モジュールやパッケージ、標準モジュール、文字列のフォーマット技法、ファイル操作などが重点的に出題されます。本記事では、モジュールをスクリプトとして実行する方法や、モジュール検索パス、コンパイルされた Python ファイルの取り扱いについて解説します。また、dir() 関数やパッケージから 全て(*) を import する際の注意点、複数ディレクトリ中のパッケージについても詳しく触れます。

さらに、出力を見やすくするためのフォーマット済み文字列リテラルや文字列の format() メソッドを使った方法、文字列の手作業でのフォーマット方法、古い文字列書式設定方法についても説明します。加えて、ファイル操作における基本的なファイルオブジェクトのメソッドや、json による構造化されたデータの保存方法についても触れていきます。これらの知識を押さえておくことで、試験の合格に向けて確かな準備ができます。

他にもBe Free Techではエンジニアの人が知らないと損する情報を紹介してますのでご覧ください!

  • モジュールのスクリプトとしての実行方法とモジュール検索パスについて理解できる
  • 標準モジュールやパッケージの使い方を理解できる
  • 文字列のフォーマット方法や出力の整形方法を理解できる
  • ファイル操作やjsonを使用したデータ保存方法について理解できる

Python 3 エンジニア認定基礎試験(6章):モジュール

Python 3 エンジニア認定基礎試験(6章):モジュール
  • モジュールをスクリプトとして実行する
  • モジュール検索パス
  • “コンパイル” された Python ファイル
  • 標準モジュール
  • dir() 関数
  • パッケージ
  • パッケージから * を import する
  • パッケージ内参照
  • 複数ディレクトリ中のパッケージ

モジュールをスクリプトとして実行する

モジュールをスクリプトとして実行する方法は、Pythonプログラム開発で重要な知識です。通常、Pythonモジュールは他のプログラムからインポートして利用するために作成しますが、特定の処理だけを単体でテストするためにモジュールそのものをスクリプトとして実行する場面もあります。この場合、Pythonは特殊な属性 __name__ を利用して、モジュールの実行方法を判断します。

モジュールをスクリプトとして実行するには、ファイルの末尾に以下のような条件分岐を記述します。

if __name__ == "__main__":
    print("このモジュールはスクリプトとして実行されています")

__name__ == "__main__" の条件が真になるのは、モジュールが直接実行されたときのみです。これに対し、他のモジュールからインポートされた場合には __name__ はモジュール名が代入されるため、上記のコードブロックは実行されません。

関数のテスト

def greet(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    print(greet("Alice"))

このように書くことで、他のプログラムから greet() をインポートしても余計な出力がされず、単体テストの際には意図した結果を得ることができます。

デバッグ用コードの記述

def add(a, b):
    return a + b

if __name__ == "__main__":
    # デバッグ用の出力
    print("デバッグ中: 5 + 3 =", add(5, 3))

スクリプトとして実行することで、予期せぬ動作が発生しないかを簡単に確認できます。

モジュール検索パス

Pythonがモジュールをインポートする際、どのディレクトリからモジュールを検索するかは「モジュール検索パス」によって決まります。モジュール検索パスは、システム環境変数 PYTHONPATH や標準の検索パスリスト sys.path に基づいています。

Pythonの検索順序

  1. 現在のスクリプトのディレクトリ
  2. PYTHONPATH で指定されたディレクトリ
  3. 標準ライブラリのディレクトリ
  4. サードパーティモジュールがインストールされるディレクトリ

検索パスの確認方法

以下のコードを実行することで、現在のモジュール検索パスを確認できます。

import sys
print(sys.path)

また、環境変数 PYTHONPATH にディレクトリを追加することで、モジュール検索パスをカスタマイズすることもできます。

一時的なパス追加

import sys
sys.path.append('/path/to/custom/module')

import my_module
my_module.run()

永続的な環境変数設定(Linuxの場合)

ターミナルで以下のコマンドを実行します。

export PYTHONPATH="/path/to/custom/module:$PYTHONPATH"

これにより、Python実行時にカスタムディレクトリが検索パスに含まれるようになります。

“コンパイル” された Python ファイル

Pythonはソースコードを実行する際、内部的にバイトコードへコンパイルします。このバイトコードは、拡張子 .pyc のファイルとして保存され、通常は __pycache__ ディレクトリに格納されます。この仕組みにより、次回以降のプログラム実行時にコンパイルの手間が省かれるため、実行速度が向上します。

バイトコードの生成

Pythonが .py ファイルを読み込む際、自動的に .pyc ファイルが生成されます。以下は手動でコンパイルする方法です。

python -m compileall .

このコマンドを実行することで、現在のディレクトリ内にあるすべてのPythonスクリプトがコンパイルされます。

バイトコードの直接実行

python __pycache__/my_script.cpython-39.pyc

Pythonバージョンに応じたバイトコードファイルを実行することで、ソースコードなしでもプログラムを実行可能です。

コンパイルされたファイルの手動削除

find . -name "*.pyc" -delete

不要なバイトコードを削除することでディスク容量を確保できます。コンパイル済みファイルが不整合を起こした場合も、この方法で問題を解消できます。

このように、Pythonのコンパイルファイルは効率的なプログラム実行に欠かせない重要な役割を担っていますが、適切に管理することが求められます。

標準モジュール

Pythonには「標準モジュール」と呼ばれる、あらかじめ組み込まれた便利な機能を提供するモジュール群が用意されています。標準モジュールを活用することで、自作コードの記述量を大幅に削減し、効率的なプログラム開発が可能となります。これらのモジュールはPythonのインストール時に同時に導入されるため、追加インストールの必要はありません。

標準モジュールの例として、ファイル操作を簡単に行う os モジュールや、数学的な計算をサポートする math モジュールがあります。

osモジュールを使ったファイル操作

import os

# 現在の作業ディレクトリを取得
print("現在の作業ディレクトリ:", os.getcwd())

# ディレクトリを作成する
os.makedirs("new_folder", exist_ok=True)
print("new_folderを作成しました")

上記のように os モジュールを使用することで、ファイルシステム操作が簡単になります。

mathモジュールでの数学的計算

import math

# 数学定数πの取得
print("円周率:", math.pi)

# 平方根の計算
print("16の平方根:", math.sqrt(16))

math モジュールは特に科学計算やゲーム開発などでよく利用されます。

標準モジュールは公式ドキュメントで詳細な情報を確認できます。目的に応じて活用することで、より高性能なアプリケーションの開発につなげられます。

dir() 関数

Pythonの dir() 関数は、引数として与えたオブジェクトが持つ属性やメソッドの一覧を返します。この関数を使用することで、モジュールやクラス、インスタンスの詳細な情報を簡単に確認できます。特に新しいモジュールをインポートした際やカスタムクラスを作成した後に便利です。

モジュールの属性を確認する

import math

# mathモジュールの属性を列挙
print(dir(math))

このコードは、math モジュールに含まれる関数や変数の一覧を出力します。

カスタムクラスのメソッドを確認する

class MyClass:
    def greet(self):
        print("Hello!")

    def farewell(self):
        print("Goodbye!")

# MyClassのメソッド一覧を確認
print(dir(MyClass))

dir() を使うことで、自作クラスがどのメソッドを持っているのか確認できます。

なお、dir() で出力される結果には特殊な属性(アンダースコアで囲まれた名前)も含まれます。必要な情報だけをフィルタリングして利用するのが一般的です。エラーを防ぎ、モジュールやクラスの構造を効率的に把握するために積極的に活用しましょう。

パッケージ

Pythonにおける「パッケージ」とは、複数のモジュールをまとめたディレクトリ構成のことです。大規模なプロジェクトでは、コードを機能ごとに分割することで管理が容易になります。パッケージは単なるディレクトリではなく、内部に __init__.py ファイルが含まれている点が特徴です(Python 3.3以降では省略可能ですが、明示的に置くことが推奨される場面もあります)。

パッケージの構成例

my_package/
  ├── __init__.py
  ├── module1.py
  └── module2.py

上記のようなディレクトリ構成がある場合、my_package をインポートすることで各モジュールにアクセスできます。

基本的なパッケージのインポート

# パッケージのモジュールから関数をインポートする
from my_package import module1

module1.some_function()

複数モジュールの一括インポート

from my_package import module1, module2

module1.function1()
module2.function2()

大規模なプロジェクトでは、モジュールを細かく分けることで保守性が向上します。さらに、サードパーティ製パッケージ(requestsnumpy など)を活用することで、プロジェクトにさまざまな機能を簡単に追加できます。

このようにパッケージを効果的に活用すれば、Python開発はより柔軟で拡張性のあるものになります。

パッケージから * を import する

Pythonでは、パッケージやモジュールからすべての要素をインポートするために from module_name import * という構文が利用できます。この方法を使うと、個別に関数やクラスを指定する必要がなくなります。ただし、乱用するとコードの可読性やメンテナンス性が低下するため、慎重に使用することが推奨されます。

モジュール内のすべての要素をインポートする

# sample_module.py
def func1():
    print("Function 1")

def func2():
    print("Function 2")

# main.py
from sample_module import *

func1()  # 出力: Function 1
func2()  # 出力: Function 2

上記のように * を使うと、func1func2 を明示的に指定せずに利用できます。

ネームスペース汚染の注意点

# mathモジュールと自作モジュールが同名関数を持つ場合
from math import *
from custom_math_module import *

print(sqrt(16))  # どちらの sqrt 関数が呼ばれるか不明瞭になる

この例では、どちらの sqrt() が呼ばれるか不明瞭なため、バグの原因となります。そのため、複雑なプロジェクトでは * を避け、必要な要素だけを明示的にインポートする方が安全です。

パッケージ内参照

Pythonでは、パッケージ内のモジュール同士で参照し合う際に「パッケージ内参照」を使用します。これにより、モジュール間の依存関係を簡潔に定義できます。特に大規模なプロジェクトではモジュール間の依存関係を整理するために重要な技術です。

絶対インポートと相対インポート

パッケージ内参照には「絶対インポート」と「相対インポート」があります。絶対インポートではパッケージのルートからモジュールを指定しますが、相対インポートでは .(ドット)を使って現在のパッケージ階層を基準にインポートします。

絶対インポートの方法

# パッケージ構成
# my_package/
# ├── __init__.py
# ├── module1.py
# └── module2.py

# module1.py
def greet():
    return "Hello from module1"

# module2.py
import my_package.module1

print(my_package.module1.greet())  # 出力: Hello from module1

相対インポートの方法

# module2.py 内で相対インポートを使用
from .module1 import greet

print(greet())  # 出力: Hello from module1

相対インポートはファイル構成が変動する可能性がある場合に便利です。ただし、複雑なディレクトリ構造では絶対インポートの方が理解しやすいこともあります。プロジェクトの規模や構成に応じて適切な方法を選択しましょう。

複数ディレクトリ中のパッケージ

大規模なプロジェクトでは、パッケージが複数のディレクトリに分散する場合があります。この場合、Pythonはモジュール検索パス(sys.path)を使ってパッケージを探索します。デフォルトでは、Pythonのインストールディレクトリやカレントディレクトリが検索対象になりますが、開発者がカスタムディレクトリを指定することも可能です。

検索パスの確認

import sys

# モジュール検索パスを表示
for path in sys.path:
    print(path)

出力には標準ライブラリのディレクトリやカレントディレクトリが含まれています。

カスタムディレクトリの追加

import sys

# モジュール検索パスに新しいディレクトリを追加
sys.path.append("/path/to/my_package")

import custom_module
custom_module.my_function()

sys.path.append() を使うことで任意のディレクトリからモジュールをインポートできます。ただし、設定ミスによる依存性の問題を防ぐため、仮想環境や環境変数(PYTHONPATH)を活用する方が望ましいです。

複数ディレクトリにまたがるパッケージ構成は柔軟性を高める一方で、管理が複雑になる可能性もあります。そのため、適切なディレクトリ構成と環境設定を心掛けることが大切です。

Python 3 エンジニア認定基礎試験(7章):入出力

Python 3 エンジニア認定基礎試験(7章):入出力
  • 出力を見やすくフォーマットする
  • フォーマット済み文字列リテラル
  • 文字列の format() メソッド
  • 文字列の手作業でのフォーマット
  • 古い文字列書式設定方法
  • ファイルを読み書きする
  • ファイルオブジェクトのメソッド
  • json による構造化されたデータの保存

出力を見やすくフォーマットする

プログラムから得られる出力は単なる文字列として表示されることが多いですが、データが複雑な場合や情報が多い場合にはそのままでは視認性が低くなります。そのため、出力を見やすくフォーマットすることが重要です。Pythonでは文字列フォーマット機能を使って効率的に情報を整理して表示できます。特に、インデント、行揃え、桁数制限などを駆使することで、読みやすさが格段に向上します。

数値の桁揃えや小数点の制御

value1 = 123
value2 = 45.6789

# 桁揃えして出力
print(f"Value 1: {value1:05d}")  # 出力: Value 1: 00123
print(f"Value 2: {value2:.2f}")  # 出力: Value 2: 45.68

この例では、整数を5桁に揃えたり、小数点以下を2桁に制限しています。これにより整然とした出力が可能です。

複数列のデータを揃えて表示する

data = [
    ["Alice", 24, "Engineer"],
    ["Bob", 30, "Designer"],
    ["Charlie", 29, "Product Manager"]
]

# ヘッダー付きでフォーマット
print(f"{'Name':<10} {'Age':<5} {'Occupation':<15}")
print("=" * 30)
for row in data:
    print(f"{row[0]:<10} {row[1]:<5} {row[2]:<15}")

このコードでは名前、年齢、職業の各列を揃えて表示しています。視認性が高まり、データ一覧を簡単に把握できます。

フォーマット済み文字列リテラル

Python 3.6以降では「f文字列(フォーマット済み文字列リテラル)」が導入されました。f"{変数}"の形式で変数を埋め込めるため、より簡潔で直感的な文字列フォーマットが可能です。従来の方法に比べてコードがシンプルになるため、現在では非常に一般的な手法です。

変数埋め込み

name = "John"
age = 25

# f文字列を使ったフォーマット
print(f"My name is {name} and I am {age} years old.")

従来の方法に比べて波括弧を使うだけで変数を埋め込めるため、コードの見た目がすっきりします。

計算や関数の直接利用

x = 10
y = 3

# 計算結果をそのまま埋め込み
print(f"{x} divided by {y} is {x/y:.2f}")

この例では、計算結果の小数点以下を2桁までフォーマットしています。f文字列を使うことで動的な処理結果を簡単に組み込める点が大きな利点です。

文字列の format() メソッド

Pythonの format() メソッドは、f文字列が導入される前から使われている強力な文字列フォーマット手法です。プレースホルダー {} に引数を埋め込む形で動作します。複雑なフォーマットにも対応できるため、古いコードや複雑なケースでよく使用されます。

基本的な使用方法

name = "Alice"
age = 28

message = "My name is {} and I am {} years old.".format(name, age)
print(message)

このコードでは {} にそれぞれ nameage の値が挿入され、指定された順番で出力されます。

名前付き引数によるフォーマット

message = "Hello, {user_name}! You have {unread} unread messages.".format(
    user_name="Bob", unread=5
)
print(message)

名前付き引数を使うと、どのデータがどの位置に埋め込まれるかが明確になります。この方法は引数が多い場合に特に便利です。


f文字列と format() メソッドはいずれも用途に応じて使い分けるべきです。シンプルなケースではf文字列、複雑なフォーマットが必要な場合には format() メソッドが適しています。これらの手法を活用すれば、出力フォーマットがより効率的かつ見やすくなります。

文字列の手作業でのフォーマット

文字列を手作業でフォーマットする方法は、単純なプログラムでは頻繁に使われる手法です。特に簡単な文字列の結合や整形など、特殊なフォーマット処理が不要な場合に役立ちます。しかし、手作業でのフォーマットは可読性が低下し、エラーが発生しやすくなるため、注意が必要です。

文字列の単純な結合

以下はプラス記号(+)を使った文字列の結合例です。

name = "Alice"
age = 25

# 手作業で文字列を結合
result = "My name is " + name + " and I am " + str(age) + " years old."
print(result)

この方法では、異なるデータ型(例: 数値型)の値を文字列に変換するために str() が必要となります。変換を忘れるとエラーになるため、注意が必要です。

文字列の繰り返し処理

文字列を複数回繰り返す際も手作業フォーマットが利用できます。

symbol = "*"
# 同じ記号を10回繰り返す
formatted_output = symbol * 10
print(formatted_output)  # 出力: **********

この方法は単純なケースでは便利ですが、複雑なフォーマットには向いていません。現在では f文字列や format() メソッドの使用が一般的です。

古い文字列書式設定方法

Pythonでは以前から文字列フォーマットに % 演算子が使われてきました。この方法はPython 2の時代から存在するため、古いコードベースでは今も頻繁に見られます。しかし、現在はより強力で簡潔なf文字列が導入されたため、新しいプロジェクトでは推奨されません。

基本的な % 演算子の使用方法

name = "Bob"
age = 30

# % 演算子を使ったフォーマット
message = "My name is %s and I am %d years old." % (name, age)
print(message)

このコードでは %s が文字列、%d が整数を意味します。指定する順番を間違えるとフォーマットエラーが発生します。

複数のデータ型フォーマット

price = 12.99
quantity = 3

# 小数点の制御を含む出力
message = "Total cost is %.2f for %d items." % (price * quantity, quantity)
print(message)

この方法では小数点以下の桁数も簡単に制御できます。ただし、引数の順番や型指定に注意が必要なため、エラーの原因となりやすいです。現代のPythonコードではf文字列に移行することを検討しましょう。

ファイルを読み書きする

Pythonではファイル操作が容易に行えます。特にデータの保存やログの記録など、ファイルの読み書きは多くのプログラムで重要な役割を担います。基本的なファイル操作としては「読み取り」「書き込み」「追記」などがあります。

テキストファイルへの書き込み

# ファイルを開いて書き込み
with open("example.txt", "w") as file:
    file.write("Hello, world!\nThis is a sample text.")
print("ファイルへの書き込みが完了しました")

with open() 構文はファイルを開いた後、処理が終われば自動的に閉じるため、リソースリークを防ぎます。書き込みモード “w” を指定することで新しい内容で上書きできます。

ファイルの読み取り

# ファイルを開いて読み取り
with open("example.txt", "r") as file:
    content = file.read()
print("ファイルの内容:")
print(content)

この例ではファイル内容を一括して読み取っています。大きなファイルでは readlines() を使うことで行単位の読み込みも可能です。


文字列フォーマットやファイル操作はPythonプログラミングの基本スキルです。古い方法も依然として使われることがあるため、現代的な方法との違いを理解しておくことが重要です。ファイル操作ではリソース管理を意識し、 with open() の使用を心がけましょう。

ファイルオブジェクトのメソッド

ファイルオブジェクトのメソッドは、Pythonでファイルを操作する際に便利な機能です。基本的な操作には読み取り、書き込み、カーソル位置の制御などがあります。これらのメソッドを理解しておくことで、より効率的なファイル操作が可能になります。

ファイルへのデータの書き込みと読み取り

write()メソッドを使うとファイルに文字列を書き込むことができます。read()はファイルからすべての内容を一度に読み取ります。

# ファイルへの書き込み
with open("sample.txt", "w") as file:
    file.write("Hello, world!")
print("ファイルへの書き込みが完了しました")

# ファイルの読み取り
with open("sample.txt", "r") as file:
    content = file.read()
print("ファイルの内容:", content)

カーソル位置の制御

seek()メソッドを使うことでファイルの読み書きカーソルの位置を制御できます。また、tell()を使えば現在のカーソル位置を確認できます。

with open("sample.txt", "r") as file:
    file.seek(7)  # カーソルを7文字目に移動
    content = file.read()
    print("カーソル移動後の内容:", content)
    print("現在のカーソル位置:", file.tell())

これらのメソッドはファイル操作を柔軟に行うために役立ちます。特に大量のデータを扱う際には効率的な操作が可能です。

json による構造化されたデータの保存

JSON(JavaScript Object Notation)は、構造化されたデータの保存や通信に広く使われるデータフォーマットです。Pythonには標準ライブラリとして json モジュールが用意されており、簡単にJSONデータの保存や読み込みができます。

データをJSONファイルに保存する

辞書データなどをJSON形式で保存する方法です。

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_active": True
}

# JSONファイルに書き込み
with open("data.json", "w") as file:
    json.dump(data, file)
print("データをJSON形式で保存しました")

json.dump() メソッドはPythonのデータ構造をそのままJSON形式に変換してファイルに書き込むことができます。

JSONファイルからデータを読み込む

保存されたJSONファイルからデータを取得する方法です。

import json

# JSONファイルを読み取り
with open("data.json", "r") as file:
    data = json.load(file)
print("読み取ったデータ:", data)

JSONは軽量でプラットフォームに依存しないため、API通信や設定ファイルの保存など幅広い場面で活用されています。効率的に扱うためにはPythonの json モジュールを活用しましょう。

Python3 エンジニア認定基礎試験(6章・7章)に関する要点まとめ

  • イテレーション処理ではfor文とwhile文を使い分ける
  • range()関数は数値の範囲を生成しループに用いる
  • リスト内包表記は簡潔なリスト生成に役立つ
  • タプルは変更不可で要素数が固定されたデータ型
  • セットは重複を許さず集合演算が可能
  • 辞書型はキーと値のペアを管理するデータ構造
  • 辞書内包表記を用いると効率的に辞書を生成できる
  • zip()関数は複数のリストを結合しタプルのリストを作成する
  • enumerate()関数はループ内でインデックスと要素を同時取得する
  • データ構造にはスタックとキューが存在し用途が異なる
  • スタックはLIFO方式、キューはFIFO方式を採用する
  • リストはappend(), pop()などのメソッドを持つ可変データ型
  • 文字列は不変のデータ型でjoin(), split()など多様なメソッドを提供する
  • エスケープシーケンスを使うことで特定の文字を表現可能
  • 複数の条件式を用いたリスト内包表記も実装可能
タイトルとURLをコピーしました