目次
第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 本章のまとめ



