目次
第1章 Pythonはどのような言語か
- 1.1 プログラミング言語としての特徴
- シンプルで読みやすい動的型付き言語
- インデントによるブロックの表現
- 教育用プログラミング言語ABCの影響
- 後方互換性の重視
- 豊富な標準ライブラリ
- さまざまな用途での利用
- シンプルで読みやすい動的型付き言語
- 1.2 Pythonの歴史と現況
- Python自体の進化
- Pythonの誕生
- Python 2系でメジャーな言語に
- Python 3系への移行
- 現在のPythonの状況
- 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 ── ドキュメントの書き方
- コミュニティ主体のOSS
- 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文でよく使うオブジェクトの比較
- if文 ── 条件を指定した処理の分岐
- 3.3 ループ ── 処理の繰り返し
- for文 ── 要素の数だけ処理を繰り返す
- for文でよく使う組み込み関数
- for文のelse節の挙動
- for文での変数のスコープ
- while文 ── 条件を指定した処理の繰り返し
- while文のelse節の挙動
- break文 ── ループを抜ける
- continue文 ── 次のループに移る
- for文 ── 要素の数だけ処理を繰り返す
- 3.4 例外処理
- try文 ── 例外の捕捉
- except節 ── 例外が発生したときのみ実行する
- else節 ── 例外が発生しなかったときのみ実行する
- finally節 ── 例外の有無にかかわらず必ず実行する
- raise文 ── 意図的に例外を発生させる
- 独自の例外を定義する
- with文 ── 定義済みのクリーンアップ処理を必ず実行する
- try文 ── 例外の捕捉
- 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文での配列の挙動
- 条件式で使える配列の性質
- タプルとリストの使い分け
- list型 ── 可変な配列を扱う型
- 4.6 辞書 ── キーと値のセットを扱う
- dict型 ── 辞書を扱う型
- 要素の追加と削除
- キーによる要素へのアクセス
- キーに使えるオブジェクトの条件
- for文での辞書の挙動
- 条件式で使える辞書の性質
- 4.7 集合 ── 一意な要素の集合を扱う
- set型 ── 可変な集合を扱う型
- 要素の追加と削除
- frozenset型 ── 不変な集合を扱う型
- 集合の演算 ── 和,積,差,対称差
- for文での集合の挙動
- 条件式で使える集合の性質
- set型 ── 可変な集合を扱う型
- 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コマンド
- 仮想環境内でパッケージを利用する
- 複数のプロジェクトを並行して開発する
- venv ── 仮想環境作成ツール
- 11.2 パッケージの利用
- pip ── パッケージ管理ツール
- 基本的な使い方
- パッケージのインストール
- パッケージのアンインストール
- PyPI ── Pythonパッケージのリポジトリ
- ソースコードリポジトリにあるパッケージをインストールする
- ローカルにあるパッケージをインストールする
- インストール済みのパッケージをアップデートする
- 現在のユーザー用にインストールする
- 環境の保存と再現 ── requirementsファイルの活用
- 現在の環境の情報をrequirementsファイルに保存する
- requirementsファイルから環境を再現する
- 開発環境でのみ利用するパッケージの管理
- 依存パッケージのアップデート
- pip ── パッケージ管理ツール
- 11.3 パッケージの作成
- setup.py ── パッケージの情報をまとめたファイル
- パッケージのディレクトリ構成
- setup.pyの基本
- PyPIへの登録を考慮する
- 依存パッケージを考慮する
- .py以外のファイルを考慮する
- PyPIへのパッケージの登録
- PyPIのアカウント作成
- 配布物の作成
- 配布物のアップロード
- setup.py ── パッケージの情報をまとめたファイル
- 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パッケージの作成
- テストコードの作成
- Gitの利用
- 13.3 継続的インテグレーションの導入
- CircleCIでテスト自動化
- プロジェクトの追加
- config.ymlの追加
- テストの実行と結果の確認
- CircleCIでテスト自動化
- 13.4 アプリケーションの開発
- コマンドライン引数の取得
- 画像のソース情報とメッセージを受け取る
- テストコードの修正
- 画像の取得
- ファイルパスから画像を取得するクラスの実装
- URLから画像を取得するクラスの実装
- 検索キーワードから画像を取得するクラスの実装
- 画像を取得するクラスの利用
- 画像処理
- 文字列を画像上に描画する最小限の実装例
- 文字列を中央に最適なサイズで描画する
- 各処理の呼び出し
- コマンドライン引数の取得
- 13.5 コマンドとして実行する
- setup.pyの作成
- entry_points ── スクリプトインタフェースの登録を行う引数
- 動かしてみよう
- setup.pyの作成
- 13.6 本章のまとめ