Pythonはここ数年で日本語の書籍も増え、開発現場での利用実績も着実に増えてきています。ご自身の第二、第三の言語の選択肢としてPythonが気になっているという方も多いのではないでしょうか。また、「Pythonを始めてみたけど、実際に業務で利用するには不安が残る」「コードレビューに怯えながらPythonを書いている」という方も多いのではないでしょうか。
本書は、そういった方を対象に、Pythonという言語が持つ機能の実践的な使い方を紹介します。Pythonは、日常的なツールからWeb開発、データ分析、機械学習など分野を問わず利用できる汎用性の高い言語です。本書も同じく、Pythonという言語の仕様やその特徴的な機能、標準ライブラリでできることを中心に扱うため、分野を問わず活用していただけます。
□第1章 Pythonはどのような言語か
1.1 プログラミング言語としての特徴
シンプルで読みやすい動的型付き言語
インデントによるブロックの表現
教育用プログラミング言語ABCの影響
後方互換性の重視
豊富な標準ライブラリ
さまざまな用途での利用
1.2 Pythonの歴史と現況
Python自体の進化
Pythonの誕生
Python 2系でメジャーな言語に
Python 3系への移行
現在のPythonの状況
Pythonを取り巻く環境の変化
1.3 Pythonコミュニティの特徴
コミュニティ主体のOSS
PyCon ── Pythonユーザーが集まるカンファレンス
PEPの存在
PEP 8:Style Guide for Python Code ── Python標準のスタイルガイド
PEP 20:The Zen of Python ── Pythonの設計ガイドライン
PEP 257:Docstring Conventions ── ドキュメントの書き方
1.4 本章のまとめ
□第2章 Pythonのインストールと開発者向けの便利な機能
2.1 Pythonのインストール
OSにプリインストールされているPython
macOSでの利用
公式インストーラを利用したインストール
Windowsでの利用
公式インストーラを利用したインストール
Ubuntuでの利用
APTを利用したインストール
そのほかのLinuxでの利用
Dockerの利用
公式イメージを利用したPythonの実行
スクリプトファイルの実行
2.2 Pythonの実行
本書で利用するpythonコマンド
Pythonインタプリタの2つのモード
対話モードのインタプリタ
対話モードの基本的な使い方
対話モードでよく使う組み込み関数
type() ── オブジェクトの型を調べる
dir() ── オブジェクトの属性を調べる
help() ── ヘルプページを表示する
Docstringを使ったヘルプページの作成
スクリプトの実行
モジュールをスクリプトとして実行
pythonコマンドとpython3コマンドの違い
2.3 本章のまとめ
□第3章 制御フロー
3.1 基本となる文法
インデントによるブロックの表現
インデントの幅
pass文 ── 何もしないことの宣言
変数の利用
型の宣言がいらない理由
コメント
コメントとDocstringの違い
3.2 条件分岐
if文 ── 条件を指定した処理の分岐
真となる値、偽となる値
シンプルな条件式
if文でよく使う数値の比較
if文でよく使うオブジェクトの比較
3.3 ループ ── 処理の繰り返し
for文 ── 要素の数だけ処理を繰り返す
for文でよく使う組み込み関数
for文のelse節の挙動
for文での変数のスコープ
while文 ── 条件を指定した処理の繰り返し
while文のelse節の挙動
break文 ── ループを抜ける
continue文 ── 次のループに移る
3.4 例外処理
try文 ── 例外の捕捉
except節 ── 例外が発生したときのみ実行する
else節 ── 例外が発生しなかったときのみ実行する
finally節 ── 例外の有無にかかわらず必ず実行する
raise文 ── 意図的に例外を発生させる
独自の例外を定義する
with文 ── 定義済みのクリーンアップ処理を必ず実行する
3.5 本章のまとめ
□第4章 データ構造
4.1 None ── 値が存在しないことを表現する
条件式でのNoneの利用
4.2 真理値 ── 真/偽を扱う
bool型 ── 真理値を扱う型
ブール演算
x or y ── xが真ならx、そうでなければyを返す
x and y ── xが真ならy、そうでなければxを返す
not x ── xが真ならFalse、そうでなければTrueを返す
4.3 数値
数値どうしの演算
数値を扱う組み込み型
int型 ── 整数を扱う型
float型 ── 浮動小数点数を扱う型
complex型 ── 複素数を扱う型
条件式での数値の利用
4.4 文字列
str型 ── 文字列を扱う型
文字列の演算
for文での文字列の挙動
条件式での文字列の利用
文字列内での変数の利用
f-string ── 式を埋め込める文字列リテラル
format() ── 引数に渡した変数で文字列を置換するメソッド
%演算子 ── 一番古い文字列フォーマット
str型とよく似たbytes型
str.encode()とbytes.decode()を利用した相互変換
Python 2系とPython 3系の文字列の違い
4.5 配列 ── 要素を1列に並べて扱う
list型 ── 可変な配列を扱う型
要素の追加と削除
インデックスによる要素へのアクセス
スライスによるリストの切り出し
tuple型 ── 不変な配列を扱う型
タプル作成時の注意点
インデックスによる要素へのアクセス
スライスによるタプルの切り出し
for文での配列の挙動
条件式で使える配列の性質
タプルとリストの使い分け
4.6 辞書 ── キーと値のセットを扱う
dict型 ── 辞書を扱う型
要素の追加と削除
キーによる要素へのアクセス
キーに使えるオブジェクトの条件
for文での辞書の挙動
条件式で使える辞書の性質
4.7 集合 ── 一意な要素の集合を扱う
set型 ── 可変な集合を扱う型
要素の追加と削除
frozenset型 ── 不変な集合を扱う型
集合の演算 ── 和、積、差、対称差
for文での集合の挙動
条件式で使える集合の性質
4.8 内包表記 ── 効率的なシーケンスの生成
リスト内包表記 ── 効率的なリストの生成
ネストしたリストの内包表記
if文のある内包表記
そのほかの内包表記
4.9 そのほかの型を表す概念
可変オブジェクト ── 定義後に値を変更できるオブジェクト
不変オブジェクト ── 定義後に値を変更できないオブジェクト
コンテナオブジェクト ── ほかのオブジェクトへの参照を持つオブジェクト
イテラブルなオブジェクト ── for文で使えるオブジェクト
呼び出し可能オブジェクト ── ()を付けて呼び出せるオブジェクト
4.10 本章のまとめ
□第5章 関数
5.1 関数 ── 関連する処理をまとめる
関数の定義と実行
引数を取る関数
関数はオブジェクト
関数の戻り値
returnがない場合の戻り値
関数のさまざまな引数
位置引数 ── 仮引数名を指定しない実引数の受け渡し
キーワード引数 ── 仮引数名を指定した実引数の受け渡し
デフォルト値のある引数 ── 実引数を省略できる仮引数
可変長の位置引数
可変長のキーワード引数
キーワードのみ引数 ── 呼び出し時に仮引数名が必須になる引数
位置のみ引数 ── 呼び出し時に仮引数名を指定できない引数
引数リストのアンパック ── リストや辞書に格納された値を引数に渡す
関数のDocstring
5.2 lambda式 ── 無名関数の作成
lambda式の定義と実行
lambda式の使いどころ
5.3 型ヒント ── アノテーションで関数に型情報を付与する
型情報を付与するのメリット
型情報の付与
変数への型情報の付与
型ヒントの活用例 ── 静的解析ツールの利用
5.4 本章のまとめ
□第6章 クラスとインスタンス
6.1 Pythonのクラス機構
classキーワードによるクラスの定義
インスタンスの作成
6.2 インスタンス ── クラスをもとに生成されるオブジェクト
インスタンスメソッド ── インスタンスに紐付くメソッド
インスタンス変数 ── インスタンスが保持する変数
インスタンスの初期化
__init__() ── インスタンスの初期化を行う特殊メソッド
引数を渡してインスタンス化する
__init__()と__new__()の違い ── イニシャライザとコンストラクタ
__new__()の注意点
プロパティ ── インスタンスメソッドをインスタンス変数のように扱う
property ── 値の取得時に呼び出されるメソッド
setter ── 値の設定時に呼び出されるメソッド
クラスやインスタンスのプライベートな属性
アンダースコアから始まる属性
アンダースコア2つから始まる属性
プライベートな属性に対するPythonコミュニティの考え方
6.3 クラス ── インスタンスのひな型となるオブジェクト
クラス変数 ── クラスオブジェクトが保持する変数
クラス変数にはインスタンスからも参照可能
クラスメソッド ── クラスに紐付くメソッド
スタティックメソッド ── 関数のように振る舞うメソッド
6.4 クラスの継承
メソッドのオーバーライドとsuper()による基底クラスへのアクセス
すべてのオブジェクトはobjectクラスのサブクラス
多重継承 ── 複数の基底クラスを指定する
多重継承の注意点
属性__mro__を利用したメソッド解決順序の確認
6.5 本章のまとめ
□第7章 モジュールとパッケージ、名前空間とスコープ
7.1 モジュール ── コードを記述した.pyファイル
モジュールの作成
モジュールのインポート
python3コマンドから直接実行する
引数を取得する
直接実行したときのみ動くコード
if __name__ == '__main__':ブロックの意味
変数__name__に格納される値
7.2 パッケージ ── モジュールの集合
パッケージの作成
パッケージ内のモジュールのインポート
__init__.py ── パッケージの初期化を行う
__init__.pyの便利な使い方
import文の比較
import文のみを利用したインポート
from節を利用して特定の属性をインポートする
.を利用した相対インポート
ワイルドカードを利用して複数の属性を一括インポートする
as節による別名の付与
7.3 インポートのしくみ
モジュール検索の流れ
sys.path ── モジュールの検索パス
検索パスの優先度
PYTHONPATH ── sys.pathに検索パスを追加する
7.4 名前空間と変数のスコープ
名前空間 ── 名前とオブジェクトのマッピング
名前空間の活用
スコープ ── 直接アクセス可能な領域
ローカルスコープ ── 関数内に閉じたスコープ
グローバルスコープ ── モジュールトップレベルのスコープ
ビルトインスコープ ── 組み込みオブジェクトのスコープ
エンクロージングスコープ ── 現在のローカルスコープの1つ外側のスコープ
7.5 本章のまとめ
□第8章 組み込み関数と特殊メソッド
8.1 組み込み関数 ── いつでも利用できる関数
オブジェクトの型を調べる関数
isinstance()、issubclass() ── 動的な型判定
callable() ── 呼び出し可能オブジェクトを判定
オブジェクトの属性に関する関数
hasattr() ── オブジェクトの属性の有無を判定
getattr()、setattr()、delattr() ── オブジェクトの属性を操作する
イテラブルなオブジェクトを受け取る関数
zip() ── 複数のイテラブルの要素を同時に返す
sorted() ── イテラブルの要素を並べ替える
filter() ── イテラブルの要素を絞り込む
map() ── すべての要素に関数を適用する
all()、any() ── 真理値を返す
そのほかの組み込み関数
8.2 特殊メソッド ── Pythonが暗黙的に呼び出す特別なメソッド
__str__()、__repr__() ── オブジェクトを文字列で表現する
__bool__() ── オブジェクトを真理値で評価する
__call__() ── インスタンスを関数のように扱う
属性への動的なアクセス
__setattr__() ── 属性への代入で呼び出される
__delattr__() ── 属性の削除で呼び出される
__getattr__()、__getattribute__() ── 属性アクセスで呼び出される
イテラブルなオブジェクトとして振る舞う
__iter__() ── イテレータオブジェクトを返す
__next__() ── 次の要素を返す
コンテナオブジェクトとして振る舞う
__getitem__()、__setitem__() ── インデックスやキーによる操作
__contains__() ── オブジェクトの有無を判定する
そのほかの特殊メソッド
8.3 本章のまとめ
□第9章 Python特有のさまざまな機能
9.1 ジェネレータ ── メモリ効率のよいイテラブルなオブジェクト
ジェネレータの具体例
ジェネレータの実装
ジェネレータ関数 ── 関数のように作成する
ジェネレータ式 ── 内包表記を利用して作成する
yield from式 ── サブジェネレータへ処理を委譲する
ジェネレータを利用する際の注意点
len()で利用する場合
複数回利用する場合
ジェネレータの実例 ── ファイルの内容を変換する
そのほかのユースケース
9.2 デコレータ ── 関数やクラスの前後に処理を追加する
デコレータの具体例
functools.lru_cache() ── 関数の結果をキャッシュする関数デコレータ
dataclasses.dataclass() ── よくある処理を自動追加するクラスデコレータ
デコレータの実装
シンプルなデコレータ
引数を受け取る関数のデコレータ
デコレータ自身が引数を受け取るデコレータ
複数のデコレータを同時に利用する
functools.wraps()でデコレータの欠点を解消する
デコレータの実例 ── 処理時間の計測
そのほかのユースケース
9.3 コンテキストマネージャー ── with文の前後で処理を実行するオブジェクト
コンテキストマネージャーの具体例
コンテキストマネージャーの実装
__enter__()、__exit__() ── with文の前後に呼ばれるメソッド
with文と例外処理
asキーワード ── __enter__()の戻り値を利用する
contextlib.contextmanagerでシンプルに実装する
コンテキストマネージャーの実例 ── 一時的なログレベルの変更
そのほかのユースケース
9.4 デスクリプタ ── 属性処理をクラスに委譲する
デスクリプタの具体例
デスクリプタの実装
__set__()を実装する ── データデスクリプタ
__get__()のみを実装する ── 非データデスクリプタ
デスクリプタの実例 ── プロパティのキャッシュ
そのほかのユースケース
9.5 本章のまとめ
□第10章 並行処理
10.1 並行処理と並列処理 ── 複数の処理を同時に行う
逐次処理で実行する
並行処理で実行する
並列処理で実行する
Pythonと並行処理
並行処理と非同期処理の関係
10.2 concurrent.futuresモジュール ── 並行処理のための高水準インタフェース
FutureクラスとExecutorクラス ── 非同期処理のカプセル化と実行
ThreadPoolExecutorクラス ── スレッドベースの非同期実行
スレッドベースの非同期実行が効果的なケース
ThreadPoolExecutorクラスを利用したマルチスレッド処理の実例
逐次処理で実装
マルチスレッドで実装
マルチスレッドの注意点
マルチスレッドでの動作に問題がある実装
スレッドセーフな実装
ProcessPoolExecutorクラス ── プロセスベースの非同期実行
プロセスベースの非同期実行が効果的なケース
ProcessPoolExecutorクラスを利用したマルチプロセス処理の実例
逐次処理で実装
マルチプロセスで実装
マルチプロセスの注意点
pickle化できるオブジェクトを使う
乱数の取り扱い方
10.3 asyncioモジュール ── イベントループを利用した並行処理を行う
コルーチン ── 処理の途中で中断、再開する
async構文を使ったコルーチンの実装
await構文を使ったコルーチンの呼び出しと中断
コルーチンの並行実行
コルーチンのスケジューリングと実行
イベントループ ── asyncioモジュールの中心的な機構
タスク ── スケジューリングしたコルーチンをカプセル化
非同期I/O ── イベントループに適したI/O処理
同期I/Oを利用する処理のタスク化
asyncioモジュールとHTTP通信
aiohttp ── 非同期I/Oを利用するHTTPクライアント兼サーバライブラリ
10.4 本章のまとめ
□第11章 開発環境とパッケージの管理
11.1 仮想環境 ── 隔離されたPython実行環境
venv ── 仮想環境作成ツール
venvのしくみ
仮想環境の有効化、無効化
仮想環境内でのpythonコマンド
仮想環境内でパッケージを利用する
複数のプロジェクトを並行して開発する
11.2 パッケージの利用
pip ── パッケージ管理ツール
基本的な使い方
パッケージのインストール
パッケージのアンインストール
PyPI ── Pythonパッケージのリポジトリ
ソースコードリポジトリにあるパッケージをインストールする
ローカルにあるパッケージをインストールする
インストール済みのパッケージをアップデートする
現在のユーザー用にインストールする
環境の保存と再現 ── requirementsファイルの活用
現在の環境の情報をrequirementsファイルに保存する
requirementsファイルから環境を再現する
開発環境でのみ利用するパッケージの管理
依存パッケージのアップデート
11.3 パッケージの作成
setup.py ── パッケージの情報をまとめたファイル
パッケージのディレクトリ構成
setup.pyの基本
PyPIへの登録を考慮する
依存パッケージを考慮する
.py以外のファイルを考慮する
PyPIへのパッケージの登録
PyPIのアカウント作成
配布物の作成
配布物のアップロード
11.4 本章のまとめ
□第12章 ユニットテスト
12.1 ユニットテストの導入
単一モジュールのテスト
テスト実行コマンドの簡略化
パッケージのテスト
ディレクトリ構成
サンプルアプリケーションの作成
12.2 unittestモジュール ── 標準のユニットテストライブラリ
テストケースの実装
前処理、後処理が必要なテストケース
テストの実行と結果の確認
テスト失敗時の結果
テスト失敗時の結果を抑制する
特定のテストのみを実行する
テストケースを直接指定
テストディスカバリ
12.3 unittest.mockモジュール ── モックオブジェクトの利用
モックオブジェクトの基本的な使い方
任意の値を返す呼び出し可能オブジェクトとして利用する
アサーションメソッドで呼び出され方をテストする
patchを使ったオブジェクトの置き換え
mockを利用するテストケースの実例
12.4 ユースケース別のテストケースの実装
環境依存のテストをスキップする
例外の発生をテストする
違うパラメータで同じテストを繰り返す
コンテキストマネージャーをテストする
12.5 本章のまとめ
□第13章 実践的なPythonアプリケーションの開発
13.1 作成するアプリケーション
LGTM画像を自動生成するコマンドラインツール
利用する主な外部パッケージ
requests ── HTTPクライアントライブラリ
Click ── コマンドラインツール作成ライブラリ
Pillow ── 画像処理ライブラリ
13.2 プロジェクトの作成
Gitの利用
.gitignoreファイルの作成
GitHubでのソースコード管理
パッケージのひな型作成
lgtmパッケージの作成
テストコードの作成
13.3 継続的インテグレーションの導入
CircleCIでテスト自動化
プロジェクトの追加
config.ymlの追加
テストの実行と結果の確認
13.4 アプリケーションの開発
コマンドライン引数の取得
画像のソース情報とメッセージを受け取る
テストコードの修正
画像の取得
ファイルパスから画像を取得するクラスの実装
URLから画像を取得するクラスの実装
検索キーワードから画像を取得するクラスの実装
画像を取得するクラスの利用
画像処理
文字列を画像上に描画する最小限の実装例
文字列を中央に最適なサイズで描画する
各処理の呼び出し
13.5 コマンドとして実行する
setup.pyの作成
entry_points ── スクリプトインタフェースの登録を行う引数
動かしてみよう
13.6 本章のまとめ