python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次...

160
Python 実習マニュアル 第零版 revision06 大黒学

Upload: dothien

Post on 06-May-2018

284 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

Python実習マニュアル

第零版 revision06

大黒学

Page 2: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

Python実習マニュアル・第零版 revision06

著者 大黒学

2013年 10月 8日(火) 第零版発行2017年 8月 25日(金) 第零版 revision06発行

Copyright c⃝ 2013–2017 Daikoku Manabu

This tutorial is licensed under a Creative Commons Attribution 2.1 Japan License.

Page 3: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

目次 3

目次

第 1章 Pythonの基礎 121.1 プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.1.1 文書と言語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.1.2 プログラムとプログラミング . . . . . . . . . . . . . . . . . . . . . . . . 121.1.3 プログラミング言語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.1.4 スクリプト言語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.1.5 この文章について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.2 インタプリタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.1 言語処理系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.2 Pythonの処理系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.3 プログラムの入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.4 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.5 プログラムの文字コード . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2.6 エラー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.3 インタラクティブシェル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.3.1 インタラクティブシェルとは何か . . . . . . . . . . . . . . . . . . . . . . 141.3.2 インタラクティブシェルの起動 . . . . . . . . . . . . . . . . . . . . . . . 151.3.3 インタラクティブシェルの終了 . . . . . . . . . . . . . . . . . . . . . . . 151.3.4 式と評価と値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.3.5 リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.3.6 ファイルに保存されているプログラムの実行 . . . . . . . . . . . . . . . . 16

1.4 オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.4.1 オブジェクトとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.4.2 メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.4.3 メソッドを呼び出す式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.5 空白と改行と注釈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.5.1 空白 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.5.2 改行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.5.3 注釈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.5.4 コメントアウトとアンコメント . . . . . . . . . . . . . . . . . . . . . . . 18

第 2章 式 182.1 リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.1.1 リテラルの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.1.2 整数リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.1.3 浮動小数点数リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.1.4 マイナスの数値を生成する式 . . . . . . . . . . . . . . . . . . . . . . . . 192.1.5 文字列リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.1.6 短文字列リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.1.7 エスケープシーケンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.1.8 長文字列リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.1.9 未加工文字列リテラル . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.2 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.1 演算子の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.2 二項演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.3 算術演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.4 文字列の連結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.2.5 優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.2.6 結合規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.7 丸括弧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.8 単項演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.2.9 符号の反転 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Page 4: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

4 目次

2.3 呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.3.1 呼び出しとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.3.2 呼び出し可能オブジェクトの分類 . . . . . . . . . . . . . . . . . . . . . . 242.3.3 引数と戻り値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3.4 呼び出しの書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3.5 メソッドを求める式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3.6 ユーザー定義関数と組み込み関数 . . . . . . . . . . . . . . . . . . . . . . 262.3.7 読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3.8 出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3.9 キーワード引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3.10 ユーザー定義クラスと組み込み型 . . . . . . . . . . . . . . . . . . . . . . 272.3.11 整数を生成する組み込み型 . . . . . . . . . . . . . . . . . . . . . . . . . . 272.3.12 浮動小数点数を生成する組み込み型 . . . . . . . . . . . . . . . . . . . . . 272.3.13 文字列を生成する組み込み型 . . . . . . . . . . . . . . . . . . . . . . . . 272.3.14 指定された基数による数値から文字列への変換 . . . . . . . . . . . . . . . 28

2.4 式文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.4.1 式文の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.4.2 プログラムの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.4.3 複数の式文から構成されるプログラムの例 . . . . . . . . . . . . . . . . . 28

第 3章 識別子 283.1 識別子の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.1.1 識別子とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.1.2 識別子の作り方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.1.3 識別子の値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.2 代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.2.1 代入文の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.2.2 再束縛 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.2.3 累算代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.3 関数定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.1 関数定義の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.2 基本的な関数定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.3 複数の文から構成される関数定義 . . . . . . . . . . . . . . . . . . . . . . 31

3.4 スコープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.1 スコープの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.2 モジュールスコープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.3 ローカルスコープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.4 ローカルスコープのメリット . . . . . . . . . . . . . . . . . . . . . . . . 323.4.5 global文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.5 引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.5.1 仮引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.5.2 仮引数の順序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.5.3 デフォルト値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.5.4 キーワードとしての仮引数 . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.6 戻り値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.6.1 return文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.6.2 return文を実行しないで終了した関数の戻り値 . . . . . . . . . . . . . . 36

第 4章 選択 364.1 選択の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.1.1 選択とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.1.2 条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.1.3 真偽値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.1.4 真偽値を生成する組み込み型 . . . . . . . . . . . . . . . . . . . . . . . . 37

4.2 比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Page 5: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

目次 5

4.2.1 比較演算子の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.2.2 大小関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.2.3 等しいかどうか . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.3 if文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.3.1 if文の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.3.2 else以降を省略した if文 . . . . . . . . . . . . . . . . . . . . . . . . . . 394.3.3 多肢選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.3.4 複合文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.4 論理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.4.1 論理演算子の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.4.2 論理積演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.4.3 論理和演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.4.4 論理否定演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.5 条件演算式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.5.1 条件演算式の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.5.2 条件演算式の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.6 インスタンスの判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.6.1 インスタンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.6.2 クラスを判定する組み込み関数 . . . . . . . . . . . . . . . . . . . . . . . 43

第 5章 繰り返しと再帰 445.1 繰り返しの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

5.1.1 繰り返しとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.1.2 繰り返しを記述するための文 . . . . . . . . . . . . . . . . . . . . . . . . 44

5.2 for文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.1 for文の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.2 for文の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.3 範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

5.3 while文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.1 while文の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.3.2 while文の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.3.3 無限ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.3.4 条件による繰り返しの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

5.4 再帰 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.1 再帰とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.2 基底 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.3 関数の再帰的な定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.4 階乗 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.5 フィボナッチ数列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505.4.6 最大公約数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

第 6章 シーケンス 516.1 シーケンスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

6.1.1 スカラーとコレクション . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.1.2 変更不可能オブジェクトと変更可能オブジェクト . . . . . . . . . . . . . 526.1.3 要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.1.4 コレクションの長さ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.1.5 帰属演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.1.6 最大値と最小値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.7 シーケンスとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.8 インデックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.9 添字表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.10 スライス表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.1.11 シーケンスの連結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.1.12 要素の探索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Page 6: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6 目次

6.1.13 出現回数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.2 タプル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.2.1 タプルの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.2.2 丸括弧形式の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.2.3 tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.2.4 シーケンスに共通する処理:タプルの場合 . . . . . . . . . . . . . . . . . 566.2.5 複数のオブジェクトを返す関数 . . . . . . . . . . . . . . . . . . . . . . . 576.2.6 タプルに対する繰り返し . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

6.3 リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.3.1 リストの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.3.2 リスト表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.3.3 list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.3.4 リスト内包表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.3.5 シーケンスに共通する処理:リストの場合 . . . . . . . . . . . . . . . . . 606.3.6 リストの要素の置換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606.3.7 リストの要素の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616.3.8 エラトステネスのふるい . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

6.4 文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.4.1 この節について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.4.2 部分文字列の探索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.4.3 部分文字列の置換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636.4.4 文字列の分割 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636.4.5 文字列の結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

第 7章 順序なしコレクション 637.1 順序なしコレクションの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

7.1.1 シーケンスと順序なしコレクション . . . . . . . . . . . . . . . . . . . . . 637.1.2 順序なしコレクションの特徴 . . . . . . . . . . . . . . . . . . . . . . . . 637.1.3 順序なしコレクションの分類 . . . . . . . . . . . . . . . . . . . . . . . . 63

7.2 集合と不変集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.1 集合と不変集合の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.2 集合表示の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.3 set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.4 frozenset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.5 コレクションに共通する処理:集合の場合 . . . . . . . . . . . . . . . . . 657.2.6 集合演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.2.7 集合比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.2.8 集合に対する繰り返し . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.2.9 ハッシュ可能性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

7.3 辞書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.3.1 辞書の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.3.2 辞書表示の書き方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.3.3 コレクションに共通する処理:辞書の場合 . . . . . . . . . . . . . . . . . 687.3.4 辞書の添字表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687.3.5 辞書の要素の置換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687.3.6 要素の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.3.7 辞書ビューオブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . 697.3.8 度数分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

第 8章 クラス 708.1 クラスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

8.1.1 クラスについての復習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708.1.2 クラスとオブジェクトとの関係 . . . . . . . . . . . . . . . . . . . . . . . 708.1.3 組み込み型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.1.4 クラスを生成する組み込み型 . . . . . . . . . . . . . . . . . . . . . . . . 71

Page 7: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

目次 7

8.2 クラス定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2.1 クラス定義の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2.2 基本的なクラス定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2.3 オブジェクトの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.2.4 何の動作もしない文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

8.3 メソッドの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.3.1 メソッドの定義の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728.3.2 メソッドの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738.3.3 メソッドが受け取る 1個目の引数 . . . . . . . . . . . . . . . . . . . . . . 738.3.4 2個以上の引数を受け取るメソッド . . . . . . . . . . . . . . . . . . . . . 748.3.5 属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748.3.6 オブジェクトの初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

8.4 派生クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.4.1 基底クラスと派生クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.4.2 派生クラスの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.4.3 継承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.4.4 オーバーライド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778.4.5 オーバーライドされたメソッドの呼び出し . . . . . . . . . . . . . . . . . 77

第 9章 例外 789.1 例外の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

9.1.1 例外とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789.1.2 例外による関数の終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

9.2 例外の捕獲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799.2.1 例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799.2.2 try文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799.2.3 複数の except節 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809.2.4 例外クラスの階層 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819.2.5 finally節 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819.2.6 捕獲した例外に識別子を束縛する except節 . . . . . . . . . . . . . . . . 829.2.7 例外の属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

9.3 例外の発生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829.3.1 生成と発生の違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829.3.2 例外の生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829.3.3 raise文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839.3.4 独自の例外クラスの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

第 10章 ファイル 8410.1 オープンとクローズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

10.1.1 オープンとクローズの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.1.2 ファイルをオープンする組み込み関数 . . . . . . . . . . . . . . . . . . . 8410.1.3 ファイルをクローズする組み込み関数 . . . . . . . . . . . . . . . . . . . 8410.1.4 ストリーム位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

10.2 ファイルからの読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8510.2.1 ファイルからデータを読み込むメソッド . . . . . . . . . . . . . . . . . . 8510.2.2 読み込んだデータをリストにして返すメソッド . . . . . . . . . . . . . . . 8610.2.3 文字列の末尾にある改行を削除するメソッド . . . . . . . . . . . . . . . . 8610.2.4 データを 1行だけ読み込むメソッド . . . . . . . . . . . . . . . . . . . . . 8710.2.5 for文による読み込みの繰り返し . . . . . . . . . . . . . . . . . . . . . . 88

10.3 ファイルへの書き込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8810.3.1 ファイルにデータを書き込むメソッド . . . . . . . . . . . . . . . . . . . 8810.3.2 printによるファイルへの書き込み . . . . . . . . . . . . . . . . . . . . . 89

10.4 モジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8910.4.1 モジュールの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8910.4.2 from文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Page 8: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

8 目次

10.4.3 import文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9010.5 ファイルに対するその他の処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

10.5.1 この節について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9110.5.2 osで定義されている関数 . . . . . . . . . . . . . . . . . . . . . . . . . . 9110.5.3 os.pathで定義されている関数 . . . . . . . . . . . . . . . . . . . . . . . 9110.5.4 ディレクトリの再帰的な処理 . . . . . . . . . . . . . . . . . . . . . . . . 92

第 11章 正規表現 9311.1 正規表現の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

11.1.1 正規表現とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9311.1.2 1個の特定の文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.1.3 連接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.1.4 マッチした部分文字列を取得する関数 . . . . . . . . . . . . . . . . . . . 94

11.2 メタ文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.1 メタ文字の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.2 文字クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.3 すべての文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.4 文字の列挙 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.5 文字コードの範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9511.2.6 文字クラスに属さない文字 . . . . . . . . . . . . . . . . . . . . . . . . . . 9511.2.7 パターンの繰り返し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9511.2.8 グループ化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9611.2.9 パターンの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9611.2.10アンカー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9711.2.11エスケープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9711.2.12文字クラスの略記法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

11.3 正規表現を扱う関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9811.3.1 この節について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9811.3.2 マッチした部分文字列で文字列を分解する関数 . . . . . . . . . . . . . . . 9811.3.3 マッチした部分文字列を置換する関数 . . . . . . . . . . . . . . . . . . . 9811.3.4 部分文字列を検索する関数 . . . . . . . . . . . . . . . . . . . . . . . . . . 9811.3.5 正規表現オブジェクトを生成する関数 . . . . . . . . . . . . . . . . . . . 9911.3.6 正規表現オブジェクトが持っているメソッド . . . . . . . . . . . . . . . . 9911.3.7 構文の正しさを判定する関数の定義 . . . . . . . . . . . . . . . . . . . . . 99

第 12章 GUIの基礎 10012.1 GUIの基礎の基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

12.1.1 GUIとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10012.1.2 Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10012.1.3 tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

12.2 ウィジェット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10112.2.1 ウィジェットの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10112.2.2 ルートウィジェット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10112.2.3 イベントループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10112.2.4 ウィンドウのタイトル . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10112.2.5 ラベル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.2.6 ジオメトリーマネージャー . . . . . . . . . . . . . . . . . . . . . . . . . . 102

12.3 フォント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.3.1 フォント記述子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.3.2 フォントの大きさ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10312.3.3 スタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

12.4 色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10412.4.1 色をあらわす文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10412.4.2 前景色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10412.4.3 背景色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Page 9: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

目次 9

第 13章 イベント 10413.1 イベントの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

13.1.1 バインディング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.1.2 イベントオブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.1.3 イベントパターン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.1.4 ウィジェットの状態の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . 105

13.2 マウスによるイベント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.2.1 マウスのイベントタイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.2.2 マウスの特定のボタンに限定したバインディング . . . . . . . . . . . . . 10613.2.3 マウスのイベント修飾子 . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.2.4 マウスポインターの座標 . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

13.3 キーボードによるイベント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10813.3.1 キーボードのイベントタイプ . . . . . . . . . . . . . . . . . . . . . . . . 10813.3.2 キーボードの特定のキーに限定したバインディング . . . . . . . . . . . . 10813.3.3 キーボードのイベント修飾子 . . . . . . . . . . . . . . . . . . . . . . . . 10913.3.4 イベントを発生させたキーのキーシム . . . . . . . . . . . . . . . . . . . 109

第 14章 キャンバス 11014.1 キャンバスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

14.1.1 キャンバスとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11014.1.2 キャンバスの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11014.1.3 長方形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11014.1.4 描画のキーワード引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

14.2 グラフィックスの描画 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11114.2.1 この節について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11114.2.2 楕円 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11114.2.3 円弧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11214.2.4 折れ線 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11214.2.5 多角形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11314.2.6 文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11314.2.7 ウィジェット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

14.3 グラフィックスの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11414.3.1 グラフィックスの ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11414.3.2 グラフィックスのバインディング . . . . . . . . . . . . . . . . . . . . . . 11414.3.3 グラフィックスの消去 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11514.3.4 グラフィックスの状態の変更 . . . . . . . . . . . . . . . . . . . . . . . . 11514.3.5 グラフィックスの移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11614.3.6 タグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

14.4 アニメーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11814.4.1 アフター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11814.4.2 移動のアニメーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11814.4.3 インタラクティブなアニメーション . . . . . . . . . . . . . . . . . . . . . 119

第 15章 ボタンとメニュー 11915.1 ボタンの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

15.1.1 ボタンとは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11915.1.2 ボタンの分類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

15.2 プッシュボタン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12015.2.1 プッシュボタンの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12015.2.2 プッシュボタンの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

15.3 チェックボタン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12015.3.1 チェックボタンの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12015.3.2 制御変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12015.3.3 チェックボタンの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

15.4 ラジオボタン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Page 10: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10 目次

15.4.1 ラジオボタンの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12115.4.2 ラジオボタンの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

15.5 メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.5.1 メニューの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.5.2 メニューの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.5.3 メニュー項目の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.5.4 メニューバー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.5.5 サブメニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12315.5.6 チェックボタンのメニュー項目 . . . . . . . . . . . . . . . . . . . . . . . 12415.5.7 ラジオボタンのメニュー項目 . . . . . . . . . . . . . . . . . . . . . . . . 124

第 16章 ジオメトリーマネージャー 12516.1 pack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

16.1.1 packについての復習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12516.1.2 packが受け取る引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12516.1.3 詰め込みの方向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12516.1.4 配置領域の中での位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12616.1.5 引き延ばし . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12616.1.6 余白 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.1.7 詰めもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

16.2 grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.2.1 gridの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.2.2 gridが受け取る引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.2.3 行と列の番号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12816.2.4 複数のセルにまたがった配置 . . . . . . . . . . . . . . . . . . . . . . . . 12816.2.5 配置領域の中での表示方法 . . . . . . . . . . . . . . . . . . . . . . . . . . 128

16.3 place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12916.3.1 placeの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12916.3.2 ルートウィジェットの大きさ . . . . . . . . . . . . . . . . . . . . . . . . 12916.3.3 絶対的な座標によるウィジェットの配置 . . . . . . . . . . . . . . . . . . 12916.3.4 相対的な座標によるウィジェットの配置 . . . . . . . . . . . . . . . . . . 130

16.4 フレーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13016.4.1 フレームの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13016.4.2 フレームの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13016.4.3 境界線のスタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13116.4.4 ラベルフレーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

第 17章 文字列入力ウィジェット 13117.1 文字列入力ウィジェットの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

17.1.1 エントリーとテキストウィジェット . . . . . . . . . . . . . . . . . . . . . 13117.1.2 フォーカス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

17.2 エントリー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13217.2.1 エントリーの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13217.2.2 エントリーの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13217.2.3 エントリーからの文字列の取り出し . . . . . . . . . . . . . . . . . . . . . 13217.2.4 エンターキーのバインディング . . . . . . . . . . . . . . . . . . . . . . . 13217.2.5 エントリーへの制御変数の設定 . . . . . . . . . . . . . . . . . . . . . . . 133

17.3 テキストウィジェット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13317.3.1 テキストウィジェットの基礎 . . . . . . . . . . . . . . . . . . . . . . . . 13317.3.2 テキストウィジェットの生成 . . . . . . . . . . . . . . . . . . . . . . . . 13317.3.3 テキストウィジェットからの文字列の取り出し . . . . . . . . . . . . . . . 13417.3.4 スクロールバーの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13417.3.5 ウィジェットとスクロールバーの連動 . . . . . . . . . . . . . . . . . . . 134

Page 11: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

目次 11

第 18章 定型的なダイアログボックス 13518.1 定型的なダイアログボックスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . 135

18.1.1 ダイアログボックスとは何か . . . . . . . . . . . . . . . . . . . . . . . . 13518.1.2 定型的なダイアログボックスの分類 . . . . . . . . . . . . . . . . . . . . . 135

18.2 メッセージボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13618.2.1 メッセージボックスの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . 13618.2.2 メッセージボックスを表示するメソッド . . . . . . . . . . . . . . . . . . 136

18.3 ファイル選択ダイアログボックス . . . . . . . . . . . . . . . . . . . . . . . . . . 13618.3.1 ファイル選択ダイアログボックスの基礎 . . . . . . . . . . . . . . . . . . 13618.3.2 ファイル選択ダイアログボックスを表示するメソッド . . . . . . . . . . . 13718.3.3 ファイル選択ダイアログボックスのキーワード引数 . . . . . . . . . . . . 137

18.4 色選択ダイアログボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13818.4.1 色選択ダイアログボックスの基礎 . . . . . . . . . . . . . . . . . . . . . . 13818.4.2 色選択ダイアログボックスを表示するメソッド . . . . . . . . . . . . . . . 138

第 19章 トップレベルウィンドウ 13919.1 トップレベルウィンドウの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

19.1.1 トップレベルウィンドウの基礎 . . . . . . . . . . . . . . . . . . . . . . . 13919.1.2 トップレベルウィンドウの生成 . . . . . . . . . . . . . . . . . . . . . . . 139

19.2 トップレベルウィンドウへのウィジェットの取り付け . . . . . . . . . . . . . . . 13919.2.1 トップレベルウィンドウへの通常のウィジェットの取り付け . . . . . . . 13919.2.2 トップレベルウィンドウへのメニューバーの取り付け . . . . . . . . . . . 140

19.3 オリジナルなダイアログボックス . . . . . . . . . . . . . . . . . . . . . . . . . . 14019.3.1 オリジナルなダイアログボックスの基礎 . . . . . . . . . . . . . . . . . . 14019.3.2 グラブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14119.3.3 破壊 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14119.3.4 文字列を読み込むダイアログボックス . . . . . . . . . . . . . . . . . . . 141

第 20章 標準ライブラリーのその他のモジュール 14220.1 time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

20.1.1 この章について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14220.1.2 UNIX時間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14220.1.3 timeで定義されている関数 . . . . . . . . . . . . . . . . . . . . . . . . . 142

20.2 sys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14320.2.1 sysの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14320.2.2 コマンドライン引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14420.2.3 プログラムの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

20.3 random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14420.3.1 randomの基礎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14420.3.2 浮動小数点数の擬似乱数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 14420.3.3 整数の擬似乱数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

付録A 練習問題の解答例 145

参考文献 148

索引 150

Page 12: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

12 第 1章 Pythonの基礎

第1章 Pythonの基礎

1.1 プログラム

1.1.1 文書と言語文字を並べることによって何かを記述したものは、「文書」(document)と呼ばれます。文書を作るためには、記述したいことを意味として持つように、文字を並べていく必要があり

ます。そして、そのためには、文字をどのように並べればどのような意味になるかということを定めた規則が必要になります。そのような規則は、「言語」(language)と呼ばれます。人間に読んでもらうことを第一の目的とする文書を書く場合は、日本語や中国語やアラビア語

のような、「自然言語」(natural language)と呼ばれる言語が使われます。自然言語というのは、人間の社会の中で自然発生的に形成された言語のことです。言語には、自然言語のほかに、人間が意図的に設計することによって作られた、「人工言語」

(artificial language)と呼ばれるものもあります。人間ではなくてコンピュータに読んでもらうことを第一の目的とする文書を書く場合は、通常、自然言語ではなく人工言語が使われます。

1.1.2 プログラムとプログラミングコンピュータに何らかの動作を実行させるためには、実行してほしいことがどんな動作なのか

ということを記述した文書をコンピュータに与える必要があります。そのような文書は、「プログラム」(program)と呼ばれます。プログラムを作成するためには、プログラムを書くという作業だけではなくて、プログラムの

構造を設計したり、プログラムの動作をテストしたり、その不具合を修正したりするというような、さまざまな作業が必要になります。そのような、プログラムを作成するために必要となるさまざまな作業の全体は、「プログラミング」(programming)と呼ばれます。

1.1.3 プログラミング言語プログラムというのも文書の一種ですから、それを書くためには何らかの言語が必要になり

ます。プログラムを書く場合には、プログラムを書くことだけを目的として作られた人工言語を使うのが普通です。そのような、プログラムを書くための専用の言語は、「プログラミング言語」(programming language)と呼ばれます。プログラミング言語には、たくさんのものがあります。例を挙げると、Fortran、COBOL、Lisp、

Pascal、Basic、C、AWK、Smalltalk、ML、Prolog、Perl、PostScript、Tcl、Java、Ruby、……というように、枚挙にいとまがないほどです。

1.1.4 スクリプト言語プログラミング言語を設計するときには、どのようなことを得意とする言語を作るのかという

方針を立てる必要があります。複数の方針を立ててプログラミング言語を設計することも可能です。しかし、プログラムがコンピュータによって実行されるときの効率を向上させるという方針と、プログラムが人間にとって書きやすくて読みやすいものになるようにするという方針とは、トレードオフの関係にあります。つまり、それらの二つの方針を両立させることは、とても困難なことなのです。プログラミング言語の中には、書きやすさや読みやすさよりも実行の効率を優先させて設計さ

れたものもあれば、それとは逆に、効率よりも書きやすさや読みやすさを優先させて設計されたものもあります。後者の方針で設計されたプログラミング言語は、「スクリプト言語」(scriptinglanguage)と呼ばれます1。スクリプト言語としては、sed、awk、Perl、Tcl、Python、Rubyなどがよく使われています。プログラミング言語で書かれた文書は「プログラム」と呼ばれるわけですが、スクリプト言語

で書かれた文書は、「スクリプト」(script)と呼ばれることもあります。

1.1.5 この文章についてこの文章(「Python実習マニュアル」)は、Pythonというスクリプト言語を使って、プログラ

ムというものの書き方について説明する、ということを目的とするチュートリアルです。

1スクリプト言語は、「軽量言語」(lightweight language) と呼ばれることもあります。

Page 13: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

1.2. インタプリタ 13

Pythonというのは、Guido van Rossumさんという人によって設計されたスクリプト言語です。この言語は、文法が単純ですので、プログラミングの学習にとても適しています。また、「ライブラリ」とよばれる拡張機能が充実していますので、実用性も申し分ありません。

1.2 インタプリタ

1.2.1 言語処理系コンピュータというものは異質な二つの要素から構成されていて、それぞれの要素は、「ハー

ドウェア」(hardware)と「ソフトウェア」(software)と呼ばれます。ハードウェアというのは物理的な装置のことで、ソフトウェアというのはプログラムなどのデータのことです。コンピュータは、さまざまなプログラミング言語で書かれたプログラムを理解して実行するこ

とができます。しかし、コンピュータのハードウェアが、ソフトウェアの助力を得ないで単独で理解することのできるプログラミング言語は、ハードウェアの種類によって決まっているひとつの言語だけです。ハードウェアが理解することのできるプログラミング言語は、そのハードウェアの「機械語」

(machine language)と呼ばれます。機械語というのは、人間にとっては書くことも読むことも困難な言語ですので、人間が機械語でプログラムを書くということはめったにありません。人間にとって書いたり読んだりすることが容易なプログラミング言語で書かれたプログラムを

コンピュータに理解させるためには、そのためのプログラムが必要になります。そのような、人間が書いたプログラムをコンピュータに理解させるためのプログラムのことを、「言語処理系」(language processor)と呼びます(「言語」を省略して、単に「処理系」と呼ぶこともあります)。言語処理系には、「コンパイラ」(compiler)と「インタプリタ」(interpreter)と呼ばれる二つ

の種類があります。コンパイラというのは、人間が書いたプログラムを機械語に翻訳するプログラムのことで、インタプリタというのは、人間が書いたプログラムがあらわしている動作をコンピュータに実行させるプログラムのことです。

1.2.2 Pythonの処理系Pythonの処理系は、Python Software Foundation (PSF)という非営利団体によってオープン

ソースとして開発されていて、PSFの公式サイトからダウンロードすることができます。

Python Software Foundationの公式サイト http://www.python.org/

ちなみに、PSFが開発しているPythonの処理系は、コンパイラではなくてインタプリタです。PSFが開発しているPythonの処理系は、日本Pythonユーザ会 (Python Japan User’s Group,

PyJUG) という非営利団体の公式サイトからも、ダウンロードすることができます。

日本 Pythonユーザ会の公式サイト http://www.python.jp/

1.2.3 プログラムの入力プログラムをファイルに保存したり、すでにファイルに保存されているプログラムを修正した

りしたいときは、「テキストエディター」(text editor)と呼ばれるソフトを使います(テキストエディターは、単に「エディター」(editor)と呼ばれることもあります)。それでは、何らかのテキストエディターを使って、次のプログラムを入力して、hello.pyと

いうファイルに保存してください。

プログラムの例 hello.py

print(’Hello, world!’)

このプログラムは、実行すると、「Hello, world!」という言葉を出力する、という動作をします。Pythonで書かれたプログラムをファイルに保存する場合、ファイル名の拡張子は、 .pyにし

ます。

1.2.4 プログラムの実行Pythonで書かれたプログラムは、

python パス名

というコマンドによって、Pythonのインタプリタに実行させることができます。コマンドライン引数として指定するのは、プログラムが保存されているファイルのパス名です。

Page 14: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

14 第 1章 Pythonの基礎

それでは、先ほど入力したプログラムをインタプリタに実行させてみましょう。コマンドを入力するためのアプリ(LinuxやMac OSならばターミナル、Windowsならばコマンドプロンプト)を起動して、プログラムのファイルがあるフォルダをカレントフォルダにして、

python hello.py

というコマンドを入力してみてください。そうすると、インタプリタによってプログラムが実行されて、

Hello, world!

という言葉が出力されるはずです。

1.2.5 プログラムの文字コードプログラムというのは、文字でできているデータ、すなわちテキストデータですので、何らか

の文字コードを使って書かれることになります。Pythonのインタプリタは、デフォルトでは、UTF-8という文字コードでプログラムが書かれ

ているとみなしてそれを処理します。ですから、日本語の文字を含んでいるプログラムも、それを UTF-8でファイルに保存すれば、正しく処理されるはずです。それでは、次のプログラムをUTF-8でファイルに保存して、Pythonのインタプリタに実行さ

せてみてください。

プログラムの例 utf8.py

print(’こんにちは、世界!’)

1.2.6 エラープログラムの中には、何らかの間違いが含まれていることがあります。そのような、プログラ

ムの中に含まれている間違いは、「エラー」(error)と呼ばれます。言語処理系は、入力されたプログラムがエラーを含んでいる場合、そのエラーについてのメッ

セージを出力します。そのような、エラーについてのメッセージは、「エラーメッセージ」(errormessage)と呼ばれます。それでは、エラーを含んでいる次の Pythonのプログラムをインタプリタに実行させてみてく

ださい。

プログラムの例 error.py

brint(’Hello, world!’)

そうすると、Pythonのインタプリタは、次のようなエラーメッセージを出力します。

Traceback (most recent call last):File "error.py", line 1, in <module>brint(’Hello, world!’)

NameError: name ’brint’ is not defined

このエラーメッセージは、brintという名前のものが定義されていないということを教えてくれています。

1.3 インタラクティブシェル

1.3.1 インタラクティブシェルとは何か前節では、ファイルに保存されているプログラムを Pythonのインタプリタに実行させる方法

について説明したわけですが、この節では、「インタラクティブシェル」(interactive shell)と呼ばれるソフトを使ってプログラムをインタプリタに実行させる方法について説明したいと思います。インタラクティブシェルというソフトは、

(1) プロンプトを表示する。(2) プログラムを読み込む。(3) 読み込んだプログラムをインタプリタに実行させる。

Page 15: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

1.3. インタラクティブシェル 15

ということを延々と繰り返すように作られています。ですから、インタラクティブシェルを使うことによって、プログラムをキーボードから直接入力して、それをインタプリタに実行させる、ということができます。

1.3.2 インタラクティブシェルの起動インタラクティブシェルは、コマンドライン引数を何も書かずに、

python

というコマンドをシェルに入力することによって、起動することができます。それでは、実際にインタラクティブシェルを起動してみてください。そうすると、

>>>

というプロンプトが表示されるはずです。

1.3.3 インタラクティブシェルの終了インタラクティブシェルは、exit()と入力するか、または quit()と入力することによって終

了させることができます。それでは、実際にインタラクティブシェルを終了させてみてください。インタラクティブシェ

ルが終了すると、LinuxやMac OSの場合はターミナルのプロンプトが、Windowsの場合はコマンドプロンプトのプロンプトが表示されます。

1.3.4 式と評価と値Pythonのプログラムは、「式」(expression)または「文」(statement)と呼ばれる文字の列か

ら構成されます。式も文も、何らかの動作をあらわしている文字の列です。式があらわしている動作を実行することを、式を「評価する」(evaluate)と言います。式を評

価すると、その結果として 1個のデータが得られます。式を評価することによって得られたデータは、その式の「値」(value)と呼ばれます。インタラクティブシェルに対して式を入力すると、インタラクティブシェルはその式を評価し

て、得られた値を出力します。

1.3.5 リテラル特定のデータを生成するという動作を記述した式は、「リテラル」(literal)と呼ばれます。リテ

ラルを評価すると、それによって生成されたデータが、そのリテラルの値になります。リテラルにはさまざまな種類があるのですが、ここでは、整数と文字列のデータを生成するリ

テラルについて、ごく簡単に説明しておきたいと思います2。0から 9までの数字を並べてできる列は、整数のデータを生成するリテラルです。たとえば、

2800というのは、整数のデータを生成するリテラルの一例です。このリテラルを評価すると、2800という整数のデータが生成されて、そのデータが値として得られます。それでは、整数のデータを生成するリテラルをインタラクティブシェルに入力してみましょう。

たとえば、

>>> 2800

というように、整数のリテラルを入力して、そののちエンターキーを押してみてください。すると、

2800

と出力されます。リテラルを評価すると、それによって生成されたデータが値として得られますので、 2800というリテラルを評価した結果が、 2800と出力されたわけです。文字列のデータを生成するリテラルは、その文字列を引用符 ( ’ )で囲んだものです。たとえ

ば、 ’namako’というのは、文字列のデータを生成するリテラルの一例です。このリテラルを評価すると、 namakoという文字列のデータが生成されて、そのデータが値として得られます。それでは、文字列のデータを生成するリテラルをインタラクティブシェルに入力してみましょ

う。そうすると、

>>> ’Hello, world!’’Hello, world!’

2リテラルについては、第 2.1 節で、さらに詳細に説明します。

Page 16: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

16 第 1章 Pythonの基礎

というように、文字列のリテラルを評価することによって得られた文字列のデータが出力されます。

1.3.6 ファイルに保存されているプログラムの実行インタラクティブシェルは、キーボードから入力されたプログラムだけではなくて、ファイル

に保存されているプログラムをインタプリタに実行させることもできます。ファイルに保存されているプログラムを、インタラクティブシェルを使ってインタプリタに実

行させたいときは、そのファイルのあるフォルダをカレントフォルダにして、

from モジュール名 import *

という文をインタラクティブシェルに入力します。この中の「モジュール名」のところには、プログラムが保存されているファイルの名前から拡張子を取り除いたものを書きます。それでは、前節で hello.pyというファイルに保存したプログラムを、インタラクティブシェ

ルを使ってインタプリタに実行させてみましょう。hello.pyのあるフォルダをカレントフォルダにして、インタラクティブシェルを起動して、

from hello import *

という文をインタラクティブシェルに入力してみてください。そうすると、

>>> from hello import *Hello, world!>>>

というように、プログラムが実行されるはずです。

1.4 オブジェクト

1.4.1 オブジェクトとは何か第 1.3.4節で、「式を評価すると、その結果として 1個のデータが得られます」と書きました

が、厳密に言うと、これは正しくありません。実は、Pythonでは、式を評価することによって得られるものは、単なるデータではなくて、「オブジェクト」(object)と呼ばれるものなのです。オブジェクトというのは、箱のようなものだと考えることができます。オブジェクトという箱の中には、2種類のものが詰め込まれています。ひとつの種類はデータ

で、もうひとつの種類は、「メソッド」(method)と呼ばれるものです。

1.4.2 メソッドメソッドは、何らかの仕事をすることができます。メソッドの仕事というのは、基本的には、

自分が所属しているオブジェクトの中にあるデータの操作です。ひとつのオブジェクトはいくつかのメソッドを持っていて、それぞれのメソッドは、自分に固有の仕事を実行します。ですから、オブジェクトというのは、自分の中にあるデータを操作するためのさまざまな機能を持っている箱のことだと考えることができます。オブジェクトにはさまざまな種類があります。たとえば文字列のオブジェクトや整数のオブジェ

クトなどです。オブジェクトがどんなメソッドを持っているかというのは、そのオブジェクトの種類ごとに決まっています。たとえば、文字列のオブジェクトは、小文字を大文字に変換するメソッドや、文字列の検索をするメソッドや、指定された区切り文字列で文字列を区切るメソッドなどを持っています。それぞれのメソッドは、自分を識別するための名前を持っています。たとえば、文字列のオブ

ジェクトが持っている、小文字を大文字に変換するメソッドは、 upperという名前を持っています。

1.4.3 メソッドを呼び出す式メソッドに仕事をさせることを、メソッドを「呼び出す」(call)と言います。メソッドを呼び出すためには、そのための式を評価する必要があります。メソッドを呼び出す

式は、「メソッド呼び出し」(method call)と呼ばれます。文字列のオブジェクトが持っている upperというメソッドは、

exp.upper()

Page 17: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

1.5. 空白と改行と注釈 17

というメソッド呼び出しを書くことによって呼び出すことができます。この式の中の exp という部分には、文字列のオブジェクトが値として得られる式を書きます。たとえば、

’namako’.upper()

というメソッド呼び出しを書くことによって、 namakoという文字列を大文字に変換した結果を求めることができます。それでは、インタラクティブシェルを使って、文字列のオブジェクトが持っている upperとい

うメソッドを呼び出してみてください。

実行例>>> ’namako’.upper()’NAMAKO’

1.5 空白と改行と注釈

1.5.1 空白空白という文字(スペースキーを押したときに入力される文字)は、Pythonのプログラムの

意味に影響を与えません(ただし、行の先頭の空白には意味があります)。たとえば、

print(’Hello, world!’)

というプログラムは、

print ( ’Hello, world!’ )

と書いたとしても同じ意味になりますし、

print ( ’Hello, world!’ )

と書いたとしても同じ意味になります。ただし、文字列のリテラルの中に空白を挿入した場合は、その空白を含んだ文字列のオブジェ

クトが生成されます。たとえば、

print(’H e l l o , w o r l d !’)

というプログラムは、

H e l l o , w o r l d !

という文字列を出力します。名前の途中には、空白を挿入することができません。ですから、 printという名前を、

p r i n t

と書くことはできません。

1.5.2 改行Pythonでは、原則としては式の途中に改行(エンターキーを押したときに入力される文字)

を挿入することはできません。ただし、丸括弧などの括弧類で囲まれた部分は、その途中に改行を挿入してもかまいません。その場合、空白の場合と同じように、改行を挿入したとしてもプログラムの意味には影響を与えません。たとえば、

print(’Hello, world!’)

というプログラムは、全体が 1個の式になっていますが、一部分が丸括弧で囲まれていますので、その部分に改行を挿入して、

print(’Hello, world!’)

と書いたとしても、同じ意味になります。インタラクティブシェルには、改行を含む式や文を入力することも可能です。式または文の途

中で改行が入力された場合、インタラクティブシェルは、式または文の入力がまだ終わっていないということを示すために、

...

Page 18: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

18 第 2章 式

というプロンプトを表示します。たとえば、上のプログラムをインタラクティブシェルに入力したとすると、

>>> print(... ’Hello, world!’... )Hello, world!>>>

というようにプロンプトが変化します。改行も、名前の途中に挿入することができないという点は、空白と同じです。

1.5.3 注釈プログラムを書いているとき、それを読む人間(プログラムを書いた人自身もその中に含まれ

ます)に伝えたいことを、そのプログラムの一部分として書いておきたい、ということがしばしばあります。プログラムの中に書かれたそのような文字列は、「注釈」(comment)と呼ばれます。注釈は、プログラムを処理するプログラムが、「ここからここまでは注釈だ」ということを認

識することができるように、注釈を書くための文法にしたがって書く必要があります。Pythonでは、「この部分は注釈です」ということを言語処理系に知らせるために、井桁 ( # )と

いう文字を使います。プログラムの中に井桁を書くと、Pythonの言語処理系は、その直後から改行までの部分を注釈とみなして無視します。それでは、インタラクティブシェルを使って、井桁から改行までの部分が本当に無視されるか

どうかを確かめてみましょう。

>>> print(’Hello, world!’) # I am a comment.Hello, world!

このように、入力したプログラムの中にある「I am a comment.」という部分は、井桁と改行のあいだに書かれていますので、Pythonのインタプリタはその部分を注釈とみなして無視します。逆に、井桁を書かなかった場合は、どうなるでしょうか。

>>> print(’Hello, world!’) I am a comment.File "<stdin>", line 1print(’Hello, world!’) I am a comment.

^SyntaxError: invalid syntax

このように、井桁を書かなかった場合、インタプリタは、書かれたものをすべて解釈しようとしますので、エラーメッセージが表示されることになります。

1.5.4 コメントアウトとアンコメントプログラムを作成したり修正したりしているとき、その一部分を一時的に無効にしたい、とい

うことがしばしばあります。そのような場合、無効にしたい部分を削除してしまうと、それを復活させるのに手間がかかりますので、削除するのではなくて、注釈にすることによって無効にするという手段が、しばしば使われます。記述の一部分を注釈にすることによって、それを無効にすることを、その部分を「コメントアウトする」(comment out)と言います。逆に、コメントアウトされている部分を復活させることを、その部分を「アンコメントする」(uncomment)と言います。

第2章 式

2.1 リテラル

2.1.1 リテラルの基礎「リテラル」というものについては、すでに第 1.3.5項で簡単に説明しましたが、そこでの説明は概略にすぎないものでしたので、この節では、リテラルについて、もう少し詳細に説明したいと思います。特定のオブジェクトを生成するという動作を記述した式は、「リテラル」(literal)と呼ばれま

す。たとえば、 ’suzume’のような、文字列を引用符で囲んだものは、リテラルの一種です。

Page 19: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

2.1. リテラル 19

リテラルを評価すると、それによって生成されたオブジェクトが、その値として得られます。たとえば、 ’suzume’というリテラルを評価すると、それによって生成された suzumeという文字列のオブジェクトが、その値として得られます。なお、この文章のこれから先の部分では、誤解のおそれがない場合、「○○のオブジェクト」の

ことを単に「○○」と呼ぶことがあります。たとえば、文字列そのものではなくて文字列のオブジェクトのことを指しているということが文脈から明らかに分かる場合には、文字列のオブジェクトのことを単に「文字列」と呼ぶことがあります。

2.1.2 整数リテラル整数のオブジェクトを生成するリテラルは、「整数リテラル」(integer literal)と呼ばれます。整数リテラルは、次の 4種類に分類することができます。

• 10進数リテラル (decimal integer literal)

• 16進数リテラル (hexadecimal integer literal)

• 8進数リテラル (octal integer literal)

• 2進数リテラル (binary integer literal)

これらの整数リテラルの相違点は、その名前が示しているとおり、整数を表現するための基数です。つまり、それぞれの整数リテラルは、10、16、8、2のそれぞれを基数として整数を表現します。10進数リテラルは、481とか 3007というような、数字だけから構成される列(ただし、先頭

の数字は 0以外でないといけません)です。たとえば、 481という 10進数リテラルを評価すると、481というプラスの整数が値として得られます。8進数リテラル、16進数リテラル、2進数リテラルは、基数を示す接頭辞を先頭に書くことに

よって作られます。基数を示す接頭辞は、8進数は 0o、16進数は 0x、2進数は 0bです( o、x、bは大文字でもかまいません)。たとえば、 0o377、 0xff、 0b11111111は、いずれも、255という整数を生成します。

2.1.3 浮動小数点数リテラルひとつの数値を、数字の列と小数点の位置という二つの要素で表現しているデータは、「浮動

小数点数」(floating point number)と呼ばれます。浮動小数点数のオブジェクトを生成するリテラルは、「浮動小数点数リテラル」(floating point

literal)と呼ばれます。.003、 41.56、 723.というような、ドット ( . )という文字を 1個だけ含んでいる数字の列

は、浮動小数点数のオブジェクトを生成するリテラルになります。この場合、ドットは小数点の位置を示します。浮動小数点数を生成するリテラルとしては、

a e b

という形のものを書くことも可能です( eは大文字でもかまいません)。aのところには、ドットを 1個だけ含むかまたは含まない数字の列を書くことができて、bのところには、数字の列または左側にマイナスのある数字の列を書くことができます。この形のリテラルを評価すると、

a× 10b

という浮動小数点数が生成されます。

リテラル 意味

3e8 3× 108

6.022e23 6.022× 1023

6.626e-34 6.626× 10−34

2.1.4 マイナスの数値を生成する式マイナス ( - )という文字を書いて、その右側に整数または浮動小数点数のリテラルを書くと、

その全体は、マイナスの数値を生成する式になります。たとえば、-56という式はマイナスの 56という整数を生成して、-0xffはマイナスの 255という整数を生成して、-8.317はマイナスの8.317という浮動小数点数を生成します。

Page 20: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

20 第 2章 式

マイナスの数値を生成するこのような式の先頭に書かれるマイナスという文字は、リテラルの一部分ではなくて、第 2.2節で説明することになる「演算子」と呼ばれるものです。

2.1.5 文字列リテラル文字列のオブジェクトを生成するリテラルは、「文字列リテラル」(string literal)と呼ばれます。文字列リテラルは、次の 3種類に分類することができます。

• 短文字列リテラル (short string literal)

• 長文字列リテラル (long string literal)

• 未加工文字列リテラル (raw string literal)

2.1.6 短文字列リテラル短文字列リテラル (short string literal)は、引用符 ( ’ )または二重引用符 ( " )で文字列を囲む

ことによって作られます。たとえば、 ’namako’や "namako"は、短文字列リテラルです。短文字列リテラルは、引用符または二重引用符で囲まれた中にある文字列を生成します。たと

えば、 ’namako’という短文字列リテラルは、 namakoという文字列を生成します。

2.1.7 エスケープシーケンス文字の中には、たとえばビープ音や改ページのように、そのままでは文字列リテラルの中に書

くことができない特殊なものがあります。そのような特殊な文字を文字列リテラルの中に書きたいときに使われるのが、「エスケープシー

ケンス」(escape sequence)と呼ばれる文字列です。エスケープシーケンスは、必ず、バックスラッシュ(\)という文字で始まります1。エスケープシーケンスには、次のようなものがあります。

\a ビープ音 \f 改ページ

\t 水平タブ \v 垂直タブ

\’ 引用符 \" 二重引用符

\n 改行 \r キャリッジリターン

\b バックスペース \\ バックスラッシュ

\ooo 8進数 oooに対応する文字 \xhh 16進数 hhに対応する文字

短文字列リテラルまたは長文字列リテラルの中にエスケープシーケンスが含まれていた場合、そのエスケープシーケンスは、それが意味している文字に置き換わります。

>>> print(’namako\numiushi\nkurage’)namakoumiushikurage

2.1.8 長文字列リテラル長文字列リテラル (long string literal) は、引用符または二重引用符を 3 個連続して並べた

もの( ’’’または """)で文字列を囲むことによって作られます。たとえば、 ’’’namako’’’

や """namako"""は、長文字列リテラルです。長文字列リテラルは、3連続の引用符または 3連続の二重引用符で囲まれた中にある文字列を

生成します。たとえば、 ’’’namako’’’という長文字列リテラルは、 namakoという文字列を生成します。短文字列リテラルと長文字列リテラルとの相違点は、改行を含む文字列を生成するための方法

です。短文字列リテラルの場合、改行を含む文字列を生成するためには、 \nというエスケープシーケンスを書く必要がありますが、長文字列リテラルを使えば、エスケープシーケンスを書かなくても、改行を挿入したいところに改行を書くだけで、改行を含む文字列を生成することができます。ですから、長文字列リテラルは、改行を何個も含む文字列を生成したいときに便利です。

>>> print(’’’namako... umiushi... kurage’’’)

1バックスラッシュは、日本語の環境では円マーク ( Y= ) で表示されることがあります。

Page 21: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

2.2. 演算子 21

namakoumiushikurage

2.1.9 未加工文字列リテラル未加工文字列リテラル (raw string literal)は、短文字列リテラルまたは長文字列リテラルの

先頭に rまたは Rを書くことによって作られます。たとえば、r’namako’や r"""namako"""は、未加工文字列リテラルです。未加工文字列リテラルも、短文字列リテラルや長文字列リテラルと同様に、引用符または二重

引用符で囲まれた中にある文字列を生成します。たとえば、r’namako’という未加工文字列リテラルは、 namakoという文字列を生成します。短文字列リテラルや長文字列リテラルと、未加工文字列リテラルとの相違点は、バックスラッ

シュが特別扱いされるかどうかです。短文字列リテラルや長文字列リテラルの中に含まれているバックスラッシュは、エスケープシーケンスの 1文字目として解釈されます。ただし、バックスラッシュから始まる文字列をエスケープシーケンスとして解釈することができなかった場合、バックスラッシュは、それ自身として解釈されます。それに対して、未加工文字列リテラルの場合、その中に含まれているバックスラッシュは特別扱いされることなく、無条件にそれ自身として解釈されます。ですから、未加工文字列リテラルは、Windowsのパス名のような、バックスラッシュを何個も含む文字列を生成したいときに便利です。

>>> print(r’c:\prog\tex\bin’)c:\prog\tex\bin

2.2 演算子

2.2.1 演算子の基礎Pythonでは、頻繁に必要となる単純な動作は、「演算子」(operator)と呼ばれるものを書くこ

とによって記述することができます。演算子を使いたいときは、演算子と式とを組み合わせた式を書きます。大多数の演算子は、そ

れと式とを組み合わせた式の構造によって、次の 2種類に分類することができます。

• 二項演算子 (binary operator)

• 単項演算子 (unary operator)

2.2.2 二項演算子「二項演算子」(binary operator)と呼ばれるグループに所属している演算子は、

式 二項演算子 式

という構造の式を作ります。二項演算子を含む式を評価すると、原則的には、まず演算子の左右の式が評価されて、それら

の式の値に対して、二項演算子があらわしている動作が実行されて、その結果が式全体の値になります。

2.2.3 算術演算子数値に対する計算をあらわしている演算子は、「算術演算子」(arithmetic operator)と呼ばれ

ます。二項演算子でかつ算術演算子であるような演算子としては、次のようなものがあります。

a + b aと bとを足し算(加算)する。a - b aから bを引き算(減算)する。a * b aと bとを掛け算(乗算)する。a / b aを bで割り算(除算)する。整数の範囲で割り切れない場合は小数点以下も求める。a // b aを bで割り算(除算)する。小数点以下は切り捨て。a % b aを bで除算したあまりを求める。a ** b aの b乗(べき乗)を求める。

Page 22: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

22 第 2章 式

>>> 30+737>>> 30-723>>> 30*7210>>> 30/74.285714285714286>>> 30//74>>> 30%72>>> 3**481

2.2.4 文字列の連結

+という演算子は、数値の加算だけではなくて、文字列の連結という意味も持っています。+の左右に書かれた式の値の両方が文字列だった場合、 +は、数値の加算という動作ではなく

て、文字列の連結という動作をします。

>>> ’kitsune’ + ’udon’’kitsuneudon’

ちなみに、+の左右に書かれた式の値の一方が文字列で、他方が数値だった場合は、エラーになります。*という演算子は、数値の乗算だけではなくて、指定された回数だけ同じ文字列を連結すると

いう意味も持っています。*の左右に書かれた式の一方の値が文字列で、他方が整数だった場合、 *は、数値の乗算とい

う動作ではなくて、整数で指定された回数だけ文字列を連結するという動作をします。

>>> ’hoge’ * 6’hogehogehogehogehogehoge’

2.2.5 優先順位ひとつの式の中に 2個以上の演算子が含まれている場合、その式はどのように解釈されるので

しょうか。たとえば、

2+3*4

という式は、

2+3 *4

という構造なのでしょうか。それとも、

2+ 3*4

という構造なのでしょうか。この問題は、個々の演算子が持っている「優先順位」(precedence)と呼ばれるものによって解

決されます。優先順位というのは、演算子が左右の式と結合する強さのことだと考えることができます。優

先順位が高い演算子は、それが低い演算子よりも、より強く左右の式と結合します。*と /と //と %は、 +と -よりも高い優先順位を持っています。ですから、

2+3*4

という式は、

2+ 3*4

という構造だと解釈されます。

>>> 2+3*414

さらに、 **は、 *と /と //と %よりも高い優先順位を持っています。ですから、

Page 23: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

2.2. 演算子 23

2*3**4

という式は、

2* 3**4

という構造だと解釈されます。

>>> 2*3**4162

2.2.6 結合規則ひとつの式の中に同じ優先順位を持っている 2個以上の演算子が含まれている場合、その式は

どのように解釈されるのでしょうか。たとえば、

10-5+2

という式は、

10-5 +2

という構造なのでしょうか。それとも、

10- 5+2

という構造なのでしょうか。この問題は、同一の優先順位を持つ演算子が共有している「結合規則」(associativity)と呼ば

れる性質によって解決されます。結合規則には、「左結合」(left-associativity)と「右結合」(right-associativity)という二つのも

のがあります。左結合というのは、左右の式と結合する強さが左にあるものほど強くなるという性質で、右結合というのは、それが右にあるものほど強くなるという性質です。+、 -、 *、 /、 //、 %の結合規則は、左結合です。したがって、

10-5+2

という式は、

10-5 +2

という構造だと解釈されます。

>>> 10-5+27

**の結合規則は、右結合です。したがって、

2**3**4

という式は、

2** 3**4

という構造だと解釈されます。

>>> 2**3**42417851639229258349412352

2.2.7 丸括弧ところで、2と 3とを足し算して、その結果と 4とを掛け算したい、というときは、どのよう

な式を書けばいいのでしょうか。先ほど説明したように、 +と *とでは、 *のほうが優先順位が高くなっていますので、

2+3*4

と書いたのでは、期待した結果は得られません。演算子の優先順位や結合規則に縛られずに、自分が望んだとおりに式を解釈してほしい場合

は、ひとまとまりの式だと解釈してほしい部分を、丸括弧 ( () )で囲みます。そうすると、丸括弧で囲まれている部分は、演算子の優先順位や結合規則とは無関係に、ひとまとまりの式だと解釈されます。

Page 24: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

24 第 2章 式

>>> (2+3)*420>>> (2*3)**41296>>> 10-(5+2)3>>> (2**3)**44096

第 1.5.2項で説明したように、Pythonでは、原則としては式の途中に改行を挿入することができません。しかし、式の途中にどうしても改行を挿入したいということも、しばしばあります。途中に改行が挿入された式は、丸括弧を使うことによって書くことができます。なぜなら、

Pythonでは、丸括弧などの括弧類で囲まれた部分は、その途中に改行が挿入されていてもかまわないからです。

>>> (700+... 60+... 5)765

2.2.8 単項演算子「単項演算子」(unary operator)と呼ばれるグループに所属している演算子は、

単項演算子 式

という構造の式を作ります。ほとんどの二項演算子は、単項演算子よりも低い優先順位を持っていますが、べき乗を求める

二項演算子は、単項演算子よりも高い優先順位を持っています。

2.2.9 符号の反転

-という単項演算子は、数値の符号(プラスかマイナスか)を反転させる算術演算子です。

>>> -(3+5)-8>>> -(3-5)2>>> -3**2-9>>> (-3)**29

2.3 呼び出し

2.3.1 呼び出しとは何かPythonでは、動作させることのできるオブジェクトのことを「呼び出し可能オブジェクト」

(callable object)と呼びます。呼び出し可能オブジェクトを動作させることを、それを「呼び出す」(call)と言います。そし

て、呼び出し可能オブジェクトを呼び出すという動作をあらわす式は、「呼び出し」(call)と呼ばれます。

2.3.2 呼び出し可能オブジェクトの分類呼び出し可能オブジェクトは、次の 3種類に分類することができます。

• 関数 (function)

• メソッド (method)

• クラス (class)

関数というのは、もっとも普通の呼び出し可能オブジェクトです。メソッドというのは、第 1.4.2項で説明したように、オブジェクトの中にあって、何らかの仕

事をするもののことです。クラスというのは、オブジェクトを生成するという動作をする呼び出し可能オブジェクトのこ

とです。

Page 25: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

2.3. 呼び出し 25

2.3.3 引数と戻り値呼び出し可能オブジェクトは、自分が動作を開始する前に、自分を呼び出した者からオブジェ

クトを受け取ることができます。呼び出し可能オブジェクトが受け取るオブジェクトは、「引数」(argument)と呼ばれます(「引数」は「ひきすう」と読みます)。呼び出し可能オブジェクトは、引数を何個でも受け取ることができます。呼び出し可能オブジェクトは、自分の動作が終了したのちに、自分を呼び出した者にオブジェ

クトを返すことができます。呼び出し可能オブジェクトが返すオブジェクトは、「戻り値」(returnvalue)と呼ばれます。呼び出し可能オブジェクトは、引数は何個でも受け取ることができるのに対して、返すことができる戻り値は 1個だけです。Pythonの処理系には、lenという関数が組み込まれています。この関数は、1個のオブジェク

トを引数として受け取って、その長さ(文字列ならば文字の個数)を求めるという動作をして、その結果を戻り値として返します。たとえば、umiushiという文字列を引数として lenに渡したとすると、 lenは、7という整数を戻り値として返します。

2.3.4 呼び出しの書き方呼び出しは、

式 ( 式, ... )

と書きます。先頭の式は、呼び出し可能オブジェクトが値として得られるものでないといけません。呼び出しを評価すると、その先頭に書かれた式を評価することによって得られた呼び出し可能

オブジェクトが呼び出されて、丸括弧の中に書かれた式の値が、その呼び出し可能オブジェクトに引数として渡されます。そして、その呼び出し可能オブジェクトが返した戻り値が、呼び出しの値になります。lenという関数を呼び出して、 umiushiという文字列を引数として渡す呼び出しは、

len(’umiushi’)

と書くことができます。この式を評価すると、その値として 7という整数が得られます。

>>> len(’umiushi’)7

この例のように、関数に名前が与えられている場合、その名前を評価すると、その関数が値として得られます。

2.3.5 メソッドを求める式メソッドを求めたいときは、

式.メソッド名

という形の式を書きます。この形の式を評価すると、ドット ( . )の左側の式を評価することによって得られたオブジェクトが持っている、メソッド名で指定されたメソッドが、値として得られます。たとえば、

’isoginchaku’.find

という式を書くことによって、isoginchakuという文字列が持っている findというメソッドを求めることができます。文字列が持っている findというメソッドは、自身(メソッドを持っている文字列自身)の一

部分として引数が含まれているならば、その位置をあらわす整数を戻り値として返します。自身の一部分として引数が含まれていない場合は、−1を返します。位置をあらわす整数というのは、先頭の文字を 0番目と数えて何番目にあるかということです。

>>> ’isoginchaku’.find(’cha’)6>>> ’isoginchaku’.find(’myu’)-1

メソッドの動作を説明するときは、しばしば、そのメソッドを持っているオブジェクトに言及する必要が生じます。このチュートリアルでは、メソッドを持っているオブジェクトに言及したいときは、先ほどのように、「自身」という言葉を使うことにしたいと思います。

Page 26: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

26 第 2章 式

2.3.6 ユーザー定義関数と組み込み関数Pythonでは、「関数定義」(function definition)と呼ばれる文をプログラムの中に書くことに

よって、関数を自由に定義することができます(関数定義の書き方については、第 3.3節で説明することにしたいと思います)。プログラムの中に関数定義を書くことによって定義された関数は、「ユーザー定義関数」(user-defined function)と呼ばれます。「ユーザー定義関数」の対義語は、「組み込み関数」です。「組み込み関数」(built-in function)というのは、Pythonの処理系に組み込まれている関数のことです。組み込み関数は、関数定義を書かなくても、呼び出しを書くだけで呼び出すことができます。先ほど紹介した lenも、組み込み関数のひとつです。

2.3.7 読み込み

inputという組み込み関数は、キーボードから 1行の文字列を読み込んで、読み込んだ文字列を戻り値として返します(行の末尾の改行は、戻り値には含まれません)。

>>> input()katatsumuri’katatsumuri’

引数として 1個の文字列を inputに渡すと、 inputは、その引数をプロンプトとして出力します。

>>> input(’What is your name? ’)What is your name? Togawa Arika’Togawa Arika’

2.3.8 出力

printという組み込み関数は、何個かのオブジェクトを引数として受け取って、それらのオブジェクトを出力します(文字列以外のオブジェクトは、文字列に変換されて出力されます)。

>>> print(’Matsubue Takaomi’)Matsubue Takaomi

printは、2個以上の引数を受け取ることもできます。2個以上の引数を受け取った場合、print

は、それらの引数を空白で区切って出力します。

>>> print(38, 27, 64, 58, 80)38 27 64 58 80

printは、 Noneというオブジェクトを戻り値として返します。

>>> print(print(’namako’))namakoNone

Noneは、「何も存在しない」という意味で使われるオブジェクトです。インタラクティブシェルは、入力された式の値が Noneだった場合、その式の値を出力しません。

2.3.9 キーワード引数2個以上の引数を呼び出し可能オブジェクトに渡すときには、呼び出しの丸括弧の中に、正し

い順序で式を書く必要があります。たとえば、printを使って 2個以上のオブジェクトを出力する場合、それらのオブジェクトを求める式は、それらを出力する順序のとおりに呼び出しの中に書かないといけません。しかし、呼び出し可能オブジェクトに引数を渡す方法としては、順番が意味を持つ通常の方

法だけではなくて、それとは異なる別の方法もあります。それは、「キーワード引数」(keywordargument)と呼ばれるものを渡すという方法です。キーワード引数というのは、オブジェクトとともに、そのオブジェクトが何を意味しているの

かということを示すキーワードを呼び出し可能オブジェクトに渡す、というタイプの引数のことです。呼び出し可能オブジェクトにキーワード引数を渡したいときは、呼び出しの中に、

キーワード = 式

という形のものを書きます。printという関数は、次のようなキーワード引数を受け取ることができます。

Page 27: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

2.3. 呼び出し 27

sep 複数のオブジェクトを出力する場合に、それらを区切る文字列。デフォルト値は 1個の空白。

end 最後に出力する文字列。デフォルト値は 1個の改行。

「デフォルト値」(default value)というのは、引数を受け取らなかった場合に引数の代わりに使われるオブジェクトのことです。キーワード引数は、普通の引数とは違って、書く順番は自由です。それらがどんな順番で書か

れていたとしても、呼び出し可能オブジェクトはそれらを正しく受け取ることができます。ただし、普通の引数とキーワード引数とを 1個の呼び出しの中に混在させる場合は、まず最初に普通の引数を書いて、そののちにキーワード引数を書く、という順番を守る必要があります。

>>> print(2, 3, 5, 7, 11, 13, sep=’, ’, end=’, etc.\n’)2, 3, 5, 7, 11, 13, etc.>>> print(2, 3, 5, 7, 11, 13, end=’, etc.\n’, sep=’, ’)2, 3, 5, 7, 11, 13, etc.

2.3.10 ユーザー定義クラスと組み込み型Pythonでは、「クラス定義」(class definition)と呼ばれる文をプログラムの中に書くことに

よって、クラスを自由に定義することができます(クラス定義の書き方については、第 8.2節で説明することにしたいと思います)。プログラムの中にクラス定義を書くことによって定義されたクラスは、「ユーザー定義クラス」(user-defined class)と呼ばれます。「ユーザー定義クラス」の対義語は、「組み込み型」です。「組み込み型」(built-in type)というのは、Pythonの処理系に組み込まれているクラスのことです。組み込み型は、クラス定義を書かなくても、呼び出しを書くだけで呼び出すことができます。

2.3.11 整数を生成する組み込み型整数は、intという組み込み型から生成されるオブジェクトです。intを明示的に呼び出して、

整数をあらわしている文字列を引数として渡すと、intは、その文字列によってあらわされている整数を生成して、その整数を戻り値として返します。

>>> int(’801’)801

intは、引数として浮動小数点数を受け取ることもできます。その場合、intは、引数の小数点以下を切り捨てた整数を生成します。

>>> int(6.82)6

2.3.12 浮動小数点数を生成する組み込み型浮動小数点数は、floatという組み込み型から生成されるオブジェクトです。floatを明示的

に呼び出して、浮動小数点数をあらわしている文字列を引数として渡すと、 floatは、その文字列によってあらわされている浮動小数点数を生成して、その浮動小数点数を戻り値として返します。

>>> float(’3.14’)3.14

floatは、引数として整数を受け取ることもできます。その場合、floatは、引数と等しい浮動小数点数を生成します。

>>> float(3)3.0

2.3.13 文字列を生成する組み込み型文字列は、strという組み込み型から生成されるオブジェクトです。strを明示的に呼び出し

て、任意のオブジェクトを引数として渡すと、strは、そのオブジェクトをあらわす文字列を生成して、その文字列を戻り値として返します。

>>> str(801)’801’>>> str(3.14)

Page 28: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

28 第 3章 識別子

’3.14’

2.3.14 指定された基数による数値から文字列への変換引数として数値を渡して strを呼び出すと、 strは、それをあらわす 10進数を生成して、そ

れを戻り値として返します。strでは、10以外の基数を使って数値を文字列に変換するということはできません。10以外の基数を使いたい場合は、formatという組み込み関数を使う必要があります。formatは、1個目の引数として数値、2個目の引数として「書式指定」(format specification)

と呼ばれる文字列を受け取って、書式指定によって指定された基数を使って 1個目の引数を文字列に変換して、その結果を戻り値として返します。書式指定は、16進数に変換したい場合は xまたは X、8進数に変換したい場合は o、2進数に

変換したい場合は bと書きます。

>>> format(255, ’x’)’ff’>>> format(255, ’o’)’377’>>> format(255, ’b’)’11111111’

2.4 式文

2.4.1 式文の基礎Pythonでは、ひとつの式は、それ自体でひとつの文になることができます。文として書かれた式は、「式文」(expression statement)と呼ばれます。式文が意味している動作は、それの式としての動作と同じです。たとえば、

print(’Masuda Hiromi’)

という文を実行すると、 Masuda Hiromiという文字列が出力されます。

2.4.2 プログラムの実行Pythonのプログラムは、いくつかの文を改行で区切って並べたものです。Pythonのプログラムを実行すると、それを構成しているそれぞれの文は、原則として、上か

ら下へという順番で 1回ずつ実行されます。

2.4.3 複数の式文から構成されるプログラムの例それでは、実際に、複数の式文から構成されるプログラムを書いて、それがどのように実行さ

れるかを試してみましょう。

プログラムの例 sequence.py

print(’Kaname Madoka’)print(’Akemi Homura’)print(’Miki Sayaka’)

このプログラムを、

python sequence.py

というコマンドで実行すると、次のように文字列が出力されます。

Kaname MadokaAkemi HomuraMiki Sayaka

第3章 識別子

Page 29: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

3.1. 識別子の基礎 29

3.1 識別子の基礎

3.1.1 識別子とは何かPythonのプログラムでは、しばしば、オブジェクトに名前を与えておいて、その名前によっ

てオブジェクトを識別する、ということをします。オブジェクトに名前として与えることのできるものは、「識別子」(identifier)と呼ばれます。識別子を名前としてオブジェクトに与えることを、識別子をオブジェクトに「束縛する」(bind)

と言います。識別子をオブジェクトに束縛することを、識別子にオブジェクトを「代入する」(assign)と言うこともあります。

3.1.2 識別子の作り方識別子は、次のような規則に従って作ることになっています。

• 識別子を作るために使うことのできる文字は、英字、数字、アンダースコア (_)です。• 識別子の先頭の文字として、数字を使うことはできません。• 予約語 (reserved word)と同じものは識別子としては使えません。「予約語」(reserved word)というのは、用途があらかじめ予約されている単語のことで、次のようなものがあります。

False class finally is return

None continue for lambda try

True def from nonlocal while

and del global not with

as elif if or yield

assert else import pass

break except in raise

識別子として使うことのできるものの例としては、次のようなものがあります。

a A a8 namako back_to_the_future

英字の大文字と小文字は区別されますので、たとえば、 aと Aは、それぞれを異なるオブジェクトに束縛することができます。最後の例のように、アンダースコアは、複数の単語から構成される識別子を作るときに、空

白の代わりとして使うことができます。識別子として使うことのできないものの例としては、次のようなものがあります。

nam@ko 使うことのできない文字を含んでいる。

8a 先頭の文字が数字。

def 同じ予約語が存在する。

3.1.3 識別子の値識別子は、式として評価することができます。識別子を評価すると、その識別子が束縛されて

いるオブジェクトが、その値として得られます。たとえば、lenや printなどの組み込み関数の名前は、組み込み関数に束縛されている識別子

ですので、評価すると、その値として組み込み関数が得られます。

>>> len<built-in function len>

3.2 代入文

3.2.1 代入文の基礎識別子をオブジェクトに束縛したいとき、言い換えれば、識別子にオブジェクトを代入したい

ときは、「代入文」(assignment statement)と呼ばれる文を書きます。代入文は、基本的には、

識別子 = 式

Page 30: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

30 第 3章 識別子

と書きます。代入文を実行すると、イコールの左側に書かれた識別子が、イコールの右側に書かれた式の値に束縛されます。言い換えれば、イコールの右側に書かれた式の値が、イコールの左側に書かれた識別子に代入されます。たとえば、

a = 7

という代入文を書くことによって、aという識別子が 7という整数に束縛されます。言い換えれば、 aという識別子に 7という整数が代入されます。

>>> a = 7>>> a7

3.2.2 再束縛すでに何らかのオブジェクトに束縛されている識別子について、その束縛を解消して、その

オブジェクトとは別のオブジェクトに束縛することを、識別子をオブジェクトに「再束縛する」(rebind)と言います。代入文のイコールの左側に、すでに何らかのオブジェクトに束縛されている識別子を書いたと

すると、その識別子は、イコールの右側の式の値に再束縛されます。

>>> a = 7>>> a7>>> a = 3>>> a3

3.2.3 累算代入文代入文には、「累算代入文」(augmented assignment statement)と呼ばれる変種があります。累算代入文は、

識別子 op= 式

と書きます。この中の op というところには、何らかの二項演算子を書きます。累算代入文は、すでに何らかのオブジェクトに束縛されている識別子を、そのオブジェクトに

対して二項演算子の動作を実行した結果に再束縛する、という動作をします。たとえば、aという識別子が 7という整数に束縛されているとするとき、

a *= 3

という累算代入文を実行すると、 aは、7を 3倍した結果、すなわち 21に再束縛されます。

>>> a = 7>>> a *= 3>>> a21

3.3 関数定義

3.3.1 関数定義の基礎関数を生成して、識別子をその関数に束縛することを、関数を「定義する」(define)と言います。関数は、「関数定義」(function definition)と呼ばれる文を書くことによって定義することがで

きます。関数定義は、関数を定義するという動作を意味する文です。

3.3.2 基本的な関数定義引数を受け取らない関数を定義する関数定義は、

def 識別子 (): 文

と書きます。関数定義を実行すると、「文」のところに書かれた文があらわしている動作を実行する関数が生成されて、「識別子」のところに書かれた識別子がその関数に束縛されます。たとえば、次のような関数定義を書くことによって、「Hello, world!」という文字列を出力す

る関数を生成して、 helloという識別子をその関数に束縛することができます。

def hello(): print(’Hello, world!’)

Page 31: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

3.3. 関数定義 31

インタラクティブシェルに関数定義を入力すると、インタラクティブシェルは、

...

というプロンプトを表示して続きの入力を要求しますが、エンターキーを押すことによって、「入力はこれで終わりです」ということをインタラクティブシェルに知らせることができます。

>>> def hello(): print(’Hello, world!’)...>>> hello()Hello, world!

次に、関数定義をファイルに保存しておいて、インタラクティブシェルでその関数定義を実行してみましょう。

プログラムの例 funcdef.py

def world(): print(’What a wonderful world!’)

実行例>>> from funcdef import *>>> world()What a wonderful world!

3.3.3 複数の文から構成される関数定義関数の動作を記述するための文は、1個だけではなくて、何個でも書くことができます。関数

の動作を複数の文で記述したいときは、「ブロック」(block)と呼ばれるものを書きます。ブロックというのは、改行で区切って文を並べたもののことです。ただし、それらの文は、イ

ンデントする必要があります。文を「インデントする」(indent)というのは、その先頭に 1個以上の空白またはタブを書くということです。ひとつのブロックを構成しているそれぞれの文は、同じ個数の空白またはタブによってインデントされている必要があります。Pythonでは、インデントには 4個の空白を使うことが推奨されています。ブロックは、それを構成しているそれぞれの文を、原則として、上から下へという順番で 1回

ずつ実行する、という動作をあらわしています。関数の動作を複数の文で記述したいときは、

def 識別子 ():

ブロック

という形の関数定義を書きます。この形の関数定義を実行すると、ブロックがあらわしている動作を実行する関数が生成されます。

>>> def namako():... print(’namako’)... print(’umiushi’)... print(’kurage’)...>>> namako()namakoumiushikurage

プログラムの例 magica.py

def magica():print(’Kaname Madoka’)print(’Akemi Homura’)print(’Miki Sayaka’)

実行例>>> from magica import *>>> magica()Kaname MadokaAkemi HomuraMiki Sayaka

Page 32: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

32 第 3章 識別子

3.4 スコープ

3.4.1 スコープの基礎識別子とオブジェクトとの束縛が有効である、プログラムの上での範囲は、その識別子の「ス

コープ」(scope)と呼ばれます。

3.4.2 モジュールスコープPythonでは、関数定義の外でオブジェクトに束縛された識別子は、ひとつのファイルの中に

保存されたプログラムの全域というスコープを持つことになります。そのようなスコープは、「モジュールスコープ」(module scope)と呼ばれます。関数定義の内部もモジュールスコープの一部分ですから、関数定義の中でモジュールスコープ

を持つ識別子を評価すると、その識別子が束縛されているオブジェクトが値として得られます。

プログラムの例 module.py

def func():print(’func:’, a)

a = ’I am a string.’func()

実行例func: I am a string.

3.4.3 ローカルスコープPythonでは、関数定義の中でオブジェクトに束縛された識別子は、その関数定義の中だけと

いうスコープを持つことになります。そのような、関数定義の中だけという限定されたスコープは、「ローカルスコープ」(local scope)と呼ばれます。モジュールスコープを持つ識別子と同一の識別子を、ローカルスコープを持つ識別子として

使っても、問題はありません。

プログラムの例 local.py

def func():a = ’My scope is func.’print(a)funcfunc()print(a)

def funcfunc():a = ’My scope is funcfunc.’print(a)

a = ’My scope is module.’print(a)func()print(a)

実行例My scope is module.My scope is func.My scope is funcfunc.My scope is func.My scope is module.

3.4.4 ローカルスコープのメリットところで、「関数定義の中でオブジェクトに束縛された識別子は、その関数定義の中だけとい

うスコープを持つ」という規則には、いったいどのようなメリットがあるのでしょうか。もしも、「ひとつの関数定義の中で束縛された識別子は、それとは別の関数定義の中でも有効

である」という規則が定められていたとするとどうなるか、ということについて考えてみましょう。その場合、識別子をオブジェクトに束縛するときには、その識別子がすでに別の関数定義で

Page 33: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

3.5. 引数 33

使われていないか、ということに細心の注意を払う必要があります。うっかりと同一の識別子を複数の関数定義の中で使うと、思わぬ不具合が発生しかねません。つまり、「関数定義の中でオブジェクトに束縛された識別子は、その関数定義の中だけという

スコープを持つ」という規則は、「関数定義を書くときに、その関数定義の外でどのような識別子が使われているかということを、まったく気にする必要がない」というメリットを、プログラムを書く人に与えてくれているのです。

3.4.5 global文関数定義の中で識別子をオブジェクトに束縛すると、その識別子はローカルスコープを持つこ

とになります。それでは、モジュールスコープを持つ識別子を関数定義の中で再束縛したい、というときにはどうすればいいのでしょうか。そのような場合に必要となるのが、「 global文」( global statement)と呼ばれる文です。こ

の文を関数定義の中に書いておけば、モジュールスコープを持つ識別子を関数定義の中で再束縛することができるようになります。global文は、

global 識別子, ...

と書きます。この文は、「識別子」のところに書かれた識別子を、モジュールスコープを持つものとして認識する、という動作をあらわしています。たとえば、関数定義の中に、

global a

という global文を書いておくと、モジュールスコープを持つ aという識別子を、その関数定義の中で別のオブジェクトに再束縛することができるようになります。

プログラムの例 global.py

def func():global aprint(’func:’, a)a = ’I am another string.’print(’func:’, a)

a = ’I am a string.’print(a)func()print(a)

実行例I am a string.func: I am a string.func: I am another string.I am another string.

3.5 引数

3.5.1 仮引数引数を受け取る関数を定義する関数定義は、

def 識別子 (識別子, ... ): 文

と書くか、または、

def 識別子 (識別子, ... ):

ブロック

と書きます。つまり、丸括弧の中に何個かの識別子を書くわけです。丸括弧の中に書かれた識別子は、「仮引数」(formal argument)と呼ばれます。仮引数は、関数が呼び出されたとき、関数が受け取った引数に束縛されることになります。仮引数は、ローカルスコープを持つことになります。つまり、仮引数のスコープは関数定義の

中だけです。

Page 34: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

34 第 3章 識別子

次のプログラムの中で定義されている starsという関数は、引数として受け取った個数のアスタリスクを出力します。

プログラムの例 stars.py

def stars(length): print(’*’ * length)

実行例>>> from stars import *>>> stars(40)****************************************

3.5.2 仮引数の順序関数定義の中で並んでいるそれぞれの仮引数と、呼び出しの中で並んでいるそれぞれの式と

は、同じ順序で結び付けられます。たとえば、

def namako(a, b, c): 文

という関数定義で定義された関数を、

namako(24, 33, 81)

という呼び出しで呼び出したとすると、 aが 24に、 bが 33に、 cが 81に束縛されることになります。次のプログラムの中で定義されている rectという関数は、文字列と横の個数と縦の個数を引

数として受け取って、その文字列を長方形の形に並べたものを出力します。

プログラムの例 rect.py

def rect(str, width, height):print((str * width + ’\n’) * height, end=’’)

実行例>>> from rect import *>>> rect(’Python’, 4, 3)PythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPython

printは、デフォルトでは 1個の改行を最後に出力します。この改行を抑制したい場合は、rect

の定義の中に書かれているように、endというキーワードで、長さが 0の文字列を渡します。ちなみに、長さが 0の文字列は、「空文字列」(empty string)と呼ばれます。

3.5.3 デフォルト値仮引数は、関数を定義する段階で、あらかじめ特定のオブジェクトに束縛しておくことができ

ます。仮引数があらかじめ束縛されているオブジェクトは、「デフォルト値」(default value)と呼ばれます。仮引数をあらかじめデフォルト値に束縛しておくと、その仮引数に引数が渡されなかった場合、その仮引数はデフォルト値に束縛されたままになりますので、引数の代わりとしてデフォルト値が使われることになります。仮引数をデフォルト値に束縛したいときは、関数定義の先頭の丸括弧の中に、

仮引数 = 式

という形のものを書きます。そうすると、その中に書かれた式の値が、仮引数のデフォルト値になります。

プログラムの例 rect2.py

def rect2(str=’Python’, width=4, height=3):print((str * width + ’\n’) * height, end=’’)

rect2という関数をこのように定義したとすると、引数を 2個しか渡さなかった場合には height

がデフォルト値のままになり、引数を 1個しか渡さなかった場合には widthと heightがデフォルト値のままになり、引数をまったく渡さなかった場合には strと widthと heightがデフォルト値のままになります。

Page 35: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

3.6. 戻り値 35

実行例>>> from rect2 import *>>> rect2(’Ruby’, 7, 2)RubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRuby>>> rect2(’Ruby’, 7)RubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRuby>>> rect2(’Ruby’)RubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRubyRuby>>> rect2()PythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPython

3.5.4 キーワードとしての仮引数第 2.3.9項で説明したように、関数には、「キーワード引数」(keyword argument)と呼ばれる

ものを渡すことができます。仮引数は、キーワード引数を関数に渡すときに使われるキーワードになります。それでは、先ほど定義を書いた rect2に、キーワード引数を渡してみましょう。

実行例>>> rect2(height=2, str=’Haskell’, width=6)HaskellHaskellHaskellHaskellHaskellHaskellHaskellHaskellHaskellHaskellHaskellHaskell

キーワード引数を使えば、順番が前の仮引数には引数を渡さないで、後ろの仮引数に引数を渡す、ということもできます。

実行例>>> rect2(height=4)PythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPythonPython

3.6 戻り値

3.6.1 return文戻り値を返す関数を定義したいときは、「 return文」( return statement)と呼ばれる文を関

数定義の中に書きます。return文は、

return 式

と書きます。この中の「式」というところには、戻り値として返したいオブジェクトを求める式を書きます。return文は、式を評価して、その値を戻り値にして、関数の動作を終了させる、という動作をあらわしています。aが 0でない数値だとするとき、1/aという数値は、aの「逆数」(reciprocal, multiplicative

inverse)と呼ばれます。次のプログラムの中で定義されている reciproという関数は、1個の数値を引数として受け取って、その逆数を戻り値として返します。

プログラムの例 recipro.py

def recipro(a): return 1/a

実行例>>> from recipro import *>>> recipro(4)

Page 36: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

36 第 4章 選択

0.25

nが自然数だとするとき、1から nまでの自然数の総和は、

n(n+ 1)

2

という計算をすることによって求めることができます。次のプログラムの中で定義されている sum

という関数は、1個の自然数を引数として受け取って、1からその自然数までの総和を戻り値として返します。

プログラムの例 sum.py

def sum(n): return n*(n+1)//2

実行例>>> from sum import *>>> sum(10)55

3.6.2 return文を実行しないで終了した関数の戻り値Pythonでは、あらゆる関数が戻り値を返します。関数が return文を実行しないで動作を終了

した場合も、その関数は戻り値を返しています。その場合に関数が返すのは、Noneと呼ばれる特定のオブジェクトです。Noneは、 Noneという予約語を評価したときに値として得られるオブジェクトです。Noneのような、評価すると特定のオブジェクトが値として得られる予約語は、「組み込み定数」

(built-in constant)と呼ばれます。

第4章 選択

4.1 選択の基礎

4.1.1 選択とは何か第 2.4.2項で説明したように、Pythonのプログラムは、いくつかの文を改行で区切って並べた

ものです。プログラムを構成しているそれぞれの文は、原則として、上から下へという順番で 1回ずつ実行されます。ですから、いくつかの文を書くことによって、まずこの動作を実行して、次にこの動作を実行

して、次にこの動作を実行して……というように、複数の動作を直線的に実行していくという動作を記述することができるわけですが、コンピュータに実行させたい動作は、必ずしも一直線に進んでいくものばかりとは限りません。しばしば、そのときの状況に応じて、いくつかの動作の候補の中からひとつの動作を選んで実行するということも、必要になります。「いくつかの動作の候補の中からひとつの動作を選んで実行する」という動作は、「選択」

(selection)と呼ばれます。

4.1.2 条件コンピュータは、運を天に任せて動作を選択するわけではありません。選択は、何らかの判断

にもとづいて実行されます。成り立っているか、それとも成り立っていないか、という判断の対象は、「条件」(condition)

と呼ばれます。条件が成り立っていると判断されるとき、その条件は「真」(true)であると言われます。逆に、

条件が成り立っていないと判断されるとき、その条件は「偽」(false)であると言われます。

4.1.3 真偽値真を意味するオブジェクトと、偽を意味するオブジェクトは、総称して「真偽値」(Boolean)

と呼ばれます。何の判断もしないで、特定の真偽値を求めたいときは、次の二つの組み込み定数のうちのどち

らかを書きます。

Page 37: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

4.2. 比較演算子 37

True 真を値とする組み込み定数

False 偽を値とする組み込み定数

4.1.4 真偽値を生成する組み込み型真偽値は、boolという組み込み型から生成されるオブジェクトです。boolを明示的に呼び出

して、数値を引数として渡すと、 boolは、その数値が 0ならば偽、それ以外ならば真を戻り値として返します。

>>> bool(0)False>>> bool(532)True

boolに文字列を引数として渡すと、boolは、その文字列が空文字列ならば偽、それ以外ならば真を戻り値として返します。

>>> bool(’’)False>>> bool(’namako’)True

4.2 比較演算子

4.2.1 比較演算子の基礎二つのデータのあいだに何らかの関係があるという条件が成り立っているかどうかを調べる二

項演算子は、「比較演算子」(comparison operator)と呼ばれます。比較演算子の優先順位は、加算や乗算などの演算子よりも低くなっています。比較演算子を含む式を評価すると、演算子の左右にある式が評価されて、それらの式の値のあ

いだに関係が成り立っているかどうかという判断が実行されます。そして、関係が成り立っているならば真、成り立っていないならば偽が、式全体の値になります。

4.2.2 大小関係次の比較演算子を使うことによって、オブジェクトの大小関係について調べることができます。

a > b aは bよりも大きい。a < b aは bよりも小さい。a >= b aは bよりも大きいか、または aと bとは等しい。a <= b aは bよりも小さいか、または aと bとは等しい。

>>> 8 > 5True>>> 5 > 8False>>> 5 > 5False>>> 5 >= 5True

大小関係があるのは、数値と数値とのあいだだけではありません。文字列と文字列とのあいだにも大小関係があります。辞書の見出しは、「辞書式順序」(lexicographical order)と呼ばれる順序で並べられています。

文字列と文字列とのあいだの大小関係は、辞書式順序で文字列を並べたときに、後ろにあるものは前にあるものよりも大きい、という関係です。

>>> ’stay’ > ’star’True>>> ’star’ > ’stay’False

Page 38: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

38 第 4章 選択

4.2.3 等しいかどうか二つのオブジェクトが等しいかどうかということは、次の比較演算子を使うことによって調べ

ることができます。

a == b aと bとは等しい。a != b aと bとは等しくない。

>>> 5 == 5True>>> 5 == 8False>>> ’star’ == ’star’True>>> ’star’ == ’stay’False

4.3 if文

4.3.1 if文の基礎何らかの条件が成り立っているかどうかを調べて、その結果にもとづいて二つの動作のうちの

どちらかを実行したい、というときは、「 if文」( if statement)と呼ばれる文を書きます。if文は、

if 条件式:

ブロック1

else:

ブロック2

と書きます。この中の「条件式」のところには、条件をあらわす式、つまり、評価すると値として真偽値が得られる式を書きます。if文を実行すると、まず最初に、条件式が評価されます。そして、条件式の値が真だった場合

は、ブロック1が実行されます(その場合、ブロック2は実行されません)。条件式の値が偽だった場合は、ブロック2 が実行されます(その場合、ブロック1 は実行されません)。つまり、if文は、「もしも条件式が真ならばブロック1を実行して、そうでなければブロック

2 を実行する」という動作を意味しているわけです。それでは、 if文をインタラクティブシェルに入力してみましょう。

>>> if 8 > 5:... print(’namako’)... else:... print(’hitode’)...namako

この場合、条件式の値は真ですので、 namakoが出力されて、 hitodeは出力されません。

>>> if 5 > 8:... print(’namako’)... else:... print(’hitode’)...hitode

この場合、条件式の値は偽ですので、 hitodeが出力されて、 namakoは出力されません。次のプログラムの中で定義されている evenoddという関数は、整数を受け取って、それが偶数

ならば「偶数」という文字列を返して、そうでなければ「奇数」という文字列を返します。

プログラムの例 evenodd.py

def evenodd(n):if n%2 == 0:

return ’偶数’else:

return ’奇数’

Page 39: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

4.3. if文 39

実行例>>> from evenodd import *>>> evenodd(6)’偶数’>>> evenodd(7)’奇数’

練習問題 4.1 aと bを整数とするとき、divisible(a, b)という式で呼び出すと、aを bで除算したときに割り切れるならば「割り切れる」という文字列を返して、そうでなければ「割り切れない」という文字列を返す関数を定義してください。

実行例>>> from divisible import *>>> divisible(12, 3)’割り切れる’>>> divisible(14, 3)’割り切れない’

4.3.2 else以降を省略した if文二つの動作のうちのどちらかを選択するのではなくて、ひとつの動作を実行するかしないかを

選択したい、ということもしばしばあります。そのような場合は、else以降を省略した if文を書きます。つまり、

if 条件式:

ブロック

という形の if文を書くわけです。この形の if文を実行すると、条件式の値が真の場合はブロックが実行されますが、条件式の値が偽の場合は何も実行されません。インタラクティブシェルを使って試してみましょう。

>>> if 8 > 5:... print(’namako’)...namako>>> if 5 > 8:... print(’namako’)...>>>

次のプログラムの中で定義されている mtohmという関数は、分を単位とする時間の長さを受け取って、それを「何時間何分」という形式の文字列に変換した結果を返します。ただし、「何分」という端数が出ない場合は、「何時間」という形式の文字列を返します。

プログラムの例 mtohm.py

def mtohm(m):hm = str(m//60) + ’時間’if m%60 != 0:

hm += str(m%60) + ’分’return hm

実行例>>> from mtohm import *>>> mtohm(160)’2時間 40分’>>> mtohm(180)’3時間’

「何時間」の部分の右側に「何分」の部分を連結するという動作は、実行するかしないかを選択することになりますので、このように、else以降を省略した if文を使って書くことができます。

Page 40: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

40 第 4章 選択

練習問題 4.2 mtohmは、60分よりも短い時間を引数として渡すと、「0時間何分」という形式の文字列を返します。そこで、この欠点を改良して、そのような場合には「何分」という形式の文字列を返す、 mtohm2という関数を定義してください。なお、引数として 0を渡した場合は、「0分」という文字列を返すようにしてください。

実行例>>> from mtohm2 import *>>> mtohm2(160)’2時間 40分’>>> mtohm2(180)’3時間’>>> mtohm2(40)’40分’>>> mtohm2(0)’0分’

4.3.3 多肢選択選択の対象となる動作が 3個以上あるような選択は、「多肢選択」(multibranch selection)と

呼ばれます。多肢選択を記述したいときは、 if文の中に、

elif 条件式:

ブロック

という形のものをいくつか書きます。この中の elifというのは、else ifを縮めたもので、「そうではなくてもしも……ならば」ということを意味しています。たとえば、3個の条件による多肢選択は、

if 条件式1:

ブロック1

elif 条件式2:

ブロック2

elif 条件式3:

ブロック3

else:

ブロック4

という形の if文を書くことによって記述することができます。この形の if文を実行すると、値が真になる条件式が見つかるまで、条件式1、条件式2、条件式3という順番で条件式が評価されていきます。値が真になる条件式が見つかった場合は、その条件式と同じ番号のブロックが実行されます(その場合、それ以降の条件式は評価されません)。すべての条件式の値が偽だった場合は、ブロック4 が実行されます。インタラクティブシェルを使って試してみましょう。

>>> if 5 > 8:... print(’namako’)... elif 8 > 5:... print(’hitode’)... else:... print(’umiushi’)...hitode

次のプログラムの中で定義されている signという関数は、数値を受け取って、それがプラスならば「プラス」という文字列を返して、そうでなくてマイナスならば「マイナス」という文字列を返して、そうでなければ「ゼロ」という文字列を返します。

プログラムの例 sign.py

def sign(a):if a > 0:

return ’プラス’elif a < 0:

return ’マイナス’

Page 41: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

4.4. 論理演算子 41

else:return ’ゼロ’

実行例>>> from sign import *>>> sign(5)’プラス’>>> sign(-5)’マイナス’>>> sign(0)’ゼロ’

4.3.4 複合文文を組み合わせることによって作られる文は、「複合文」(compound statement)と呼ばれま

す。 if文は、複合文の一種です。複合文ではない文、つまり、これ以上は文に分解することのできない文は、「単純文」(simple

statement)と呼ばれます。式文、代入文、 return文などは単純文に分類されます。1個の単純文だけを実行する関数を定義する関数定義は、たとえば、

def sum(n): return n*(n+1)//2

というように、ブロックを使わなくても書くことができます。しかし、複合文を実行する関数を定義する関数定義は、たとえ 1個の複合文を実行するだけであっても、ブロックを使う必要があります。

4.4 論理演算子

4.4.1 論理演算子の基礎処理の対象が真偽値で、処理の結果も真偽値であるような動作をあらわしている演算子は、「論

理演算子」(Boolean operator)と呼ばれます。Pythonには、次の三つの論理演算子があります。

a and b aかつ bである。a or b aまたは bである。not a aではない。

andと orは、比較演算子よりも低い優先順位を持っています。そして、 andは、 orよりも高い優先順位を持っています。

4.4.2 論理積演算子

andは、「論理積演算子」(Boolean AND operator)と呼ばれます。これは、二つの条件が両方とも成り立っているかどうかを判断したいとき、つまり、Aかつ B という条件が成り立っているかどうかを判断したいときに使われる論理演算子で、次のような動作をします。

True and True −→ True

True and False −→ False

False and True −→ False

False and False −→ False

4.4.3 論理和演算子

orは、「論理和演算子」(Boolean OR operator)と呼ばれます。これは、二つの条件のうちの少なくとも一つが成り立っているかどうかを判断したいとき、つまり、AまたはBという条件が成り立っているかどうかを判断したいときに使われる論理演算子で、次のような動作をします。

Page 42: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

42 第 4章 選択

True or True −→ True

True or False −→ True

False or True −→ True

False or False −→ False

次のプログラムの中で定義されている leapyearという関数は、西暦であらわされた年を受け取って、その年がうるう年ならば「うるう年」という文字列を返して、そうでなければ「平年」という文字列を返します。

プログラムの例 leapyear.py

def leapyear(y):if y%4 == 0 and y%100 != 0 or y%400 == 0:

return ’うるう年’else:

return ’平年’

実行例>>> from leapyear import *>>> leapyear(2080)’うるう年’>>> leapyear(2100)’平年’>>> leapyear(2400)’うるう年’

4.4.4 論理否定演算子

notは、「論理否定演算子」(Boolean negation operator)と呼ばれます。これは、真偽値を反転させたいとき、つまり、Aではないという条件が成り立っているかどうかを判断したいときに使われる論理演算子で、次のような動作をします。

not True −→ False

not False −→ True

4.5 条件演算式

4.5.1 条件演算式の基礎第 4.3節で説明したように、Pythonでは、if文という文を使うことによって選択を記述する

ことができます。しかし、選択を記述する方法は、それだけではありません。Pythonでは、選択は、「条件演算式」(conditional expression)と呼ばれる式を書くことによっ

て記述することも可能です。

4.5.2 条件演算式の書き方条件演算式は、

式 1 if 条件式 else 式 2

と書きます。「条件式」のところには、評価すると値として真偽値が得られる式を書きます。条件演算式を評価すると、まず最初に、条件式が評価されます。そして、条件式の値が真だっ

た場合は、式 1 が評価されます(その場合、式 2 は評価されません)。条件式の値が偽だった場合は、式 2 が評価されます(その場合、式 1 は評価されません)。そして、評価された式 1 または式 2 の値が、条件演算式の値になります。インタラクティブシェルを使って試してみましょう。

>>> ’namako’ if 8 > 5 else ’hitode’’namako’>>> ’namako’ if 5 > 8 else ’hitode’’hitode’

次のプログラムは、第 4.3.1項で紹介した、整数が偶数なのか奇数なのかを判定して、その結果をあらわす文字列を返す、evenoddという関数の定義を、条件演算式を使って書き直したもの

Page 43: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

4.6. インスタンスの判定 43

です。

プログラムの例 evenodd2.py

def evenodd(n): return ’偶数’ if n%2 == 0 else ’奇数’

実行例>>> from evenodd2 import *>>> evenodd(6)’偶数’>>> evenodd(7)’奇数’

練習問題 4.3 第 4.3.1項で出題した、除算したときに割り切れるかどうかを判定して、その結果をあらわす文字列を返す、divisibleという関数の定義を、条件演算式を使って書き直してください。

実行例>>> from divisible2 import *>>> divisible(12, 3)’割り切れる’>>> divisible(14, 3)’割り切れない’

練習問題 4.4 第 4.3.3項で紹介した、数値がプラスなのかマイナスなのかゼロなのかを判定して、その結果をあらわす文字列を返す、 signという関数の定義を、条件演算式を使って書き直してください。

実行例>>> from sign2 import *>>> sign(5)’プラス’>>> sign(-5)’マイナス’>>> sign(0)’ゼロ’

4.6 インスタンスの判定

4.6.1 インスタンス「インスタンス」(instance)という言葉は、何らかのクラスから生成されたもの、という意味を持っています。Pythonでは、すべてのオブジェクトはクラスから生成されますので、すべてのオブジェクトは、それを「インスタンス」と呼ぶことも可能です。オブジェクトを、「オブジェクト」という言葉ではなくて、「インスタンス」という言葉で呼ぶ

ことがしばしばあります。それは、オブジェクトを生成したクラスが強く意識される文脈においてです。

4.6.2 クラスを判定する組み込み関数

isinstanceという組み込み関数は、インスタンスとクラスとのあいだに、「そのインスタンスを生成したのはそのクラスである」という関係が成り立っているかどうかを調べて、その結果の真偽値を戻り値として返します。isinstanceは、2個の引数を受け取ります。1個目はオブジェクトで、2個目はクラスです。

この関数は、1個目の引数が 2個目の引数から生成されたものかどうかを調べて、もしもそうならば真、そうでなければ偽を返します。

>>> isinstance(35, int)True>>> isinstance(35, str)False>>> isinstance(’namako’, int)

Page 44: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

44 第 5章 繰り返しと再帰

False>>> isinstance(’namako’, str)True

次のプログラムの中で定義されている instanceという関数は、オブジェクトを受け取って、それが、真偽値、整数、浮動小数点数、文字列のいずれであるかということを判定して、その結果をあらわす文字列を返します。

プログラムの例 instance.py

def instance(a):if isinstance(a, bool):

return ’真偽値’elif isinstance(a, int):

return ’整数’elif isinstance(a, float):

return ’浮動小数点数’elif isinstance(a, str):

return ’文字列’else:

return ’その他のインスタンス’

実行例>>> from instance import *>>> instance(False)’真偽値’>>> instance(532)’整数’>>> instance(3.14)’浮動小数点数’>>> instance(’namako’)’文字列’>>> instance(print)’その他のインスタンス’

第5章 繰り返しと再帰

5.1 繰り返しの基礎

5.1.1 繰り返しとは何かコンピュータに実行させたい動作は、必ずしも、一連の動作をそれぞれ一回ずつ実行していけ

ばそれで達成される、というものばかりとは限りません。しばしば、ほとんど同じ動作を何回も何十回も何百回も実行しなければ意図していることを達成できない、ということがあります。「同じ動作を何回も実行する」という動作は、「繰り返し」(iteration)と呼ばれます。この章では、繰り返しというのはどのように記述すればいいのか、ということについて説明し

ます。

5.1.2 繰り返しを記述するための文繰り返しは、繰り返したい回数と同じ個数の文を書くことによって記述することも可能です

が、そのような書き方だと、繰り返しの回数に比例してプログラムが長くなってしまいます。ですから、多くのプログラミング言語は、繰り返しを簡潔に記述することができるようにする機能を持っています。Pythonでは、次の 2種類の文のうちのどちらかを使うことによって、繰り返しを簡潔に記述

することができます。

• for文 ( for statement)

• while文 ( while statement)

Page 45: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

5.2. for文 45

5.2 for文

5.2.1 for文の基礎Pythonでは、それに対して繰り返しを実行することが可能なオブジェクトのことを、「繰り返

し可能オブジェクト」(iterable object)と呼びます。たとえば、文字列は、それを構成しているそれぞれの文字に対して繰り返しを実行することの

できるオブジェクトですので、繰り返し可能オブジェクトの一種です。繰り返し可能オブジェクトに対して繰り返しを実行したいときは、通常、「 for文」( for state-

ment)と呼ばれる文が使われます。

5.2.2 for文の書き方

for文は、

for 識別子 in 式:

ブロック

と書きます。この中の「式」のところには、値として繰り返し可能オブジェクトが得られる式を書きます。for文を実行すると、まず最初に、inの右側の式が 1回だけ評価されます。そして、その式の

値として得られた繰り返し可能オブジェクトに対して、ブロックの実行が繰り返されます。for

の右側の識別子は、ブロックが実行される直前に、ブロックの動作の対象となるオブジェクトに束縛されます。たとえば、

for c in ’namako’:print(c, end=’, ’)

という for文を実行すると、まず最初に、’namako’という文字列リテラルが評価されて、namako

という文字列が値として得られます。そして、その文字列を構成している 1個 1個の文字に対して、

print(c, end=’, ’)

というブロックが実行されます(ここで「文字」と呼んでいるのは、厳密に言えば、1文字だけから構成される文字列のことです)。 cという識別子は、ブロックが実行される直前に、ブロックの動作の対象となる文字に束縛されます。インタラクティブシェルを使って試してみましょう。

>>> for c in ’namako’:... print(c, end=’, ’)...n, a, m, a, k, o, >>>

次のプログラムの中で定義されている reverseという関数は、文字列を受け取って、それを構成しているそれぞれの文字を逆の順序で並べ替えることによってできる文字列を返します。

プログラムの例 reverse.py

def reverse(s):s2 = ’’for c in s:

s2 = c + s2return s2

実行例>>> from reverse import *>>> reverse(’isoginchaku’)’ukahcnigosi’

練習問題 5.1 sを文字列とするとき、 space(s)という式で呼び出すと、 sを構成しているそれぞれの文字の直後に 1個の空白を挿入することによってできる文字列を返す関数を定義してください。

実行例

Page 46: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

46 第 5章 繰り返しと再帰

>>> from space import *>>> space(’hitode’)’h i t o d e ’

練習問題 5.2 sを文字列、 aを文字(文字が 1個の文字列)とするとき、 delete(s, a)という式で呼び出すと、sに含まれているすべての aを削除することによってできる文字列を返す関数を定義してください。

実行例>>> from delete import *>>> delete(’asparagus’, ’a’)’sprgus’

練習問題 5.3 sを文字列、 aと bを文字とするとき、 replace(s, a, b)という式で呼び出すと、sを構成しているすべての aを bに置き換えることによってできる文字列を返す関数を定義してください。

実行例>>> from replace import *>>> replace (’asparagus’, ’a’, ’o’)’osporogus’

練習問題 5.4 sを文字列とするとき、 reduce(s)という式で呼び出すと、 sに含まれている 2個以上の連続する空白を 1個の空白に縮小させることによってできる文字列を返す関数を定義してください。

実行例>>> from reduce import *>>> reduce(’ abc def ghi jkl ’)’ abc def ghi jkl ’

練習問題 5.5 sを、3進数で整数をあらわしている文字列とするとき、parseternary(s)という式で呼び出すと、 sがあらわしている整数を返す関数を定義してください。

実行例>>> from parseternary import *>>> parseternary(’201’)19

5.2.3 範囲Pythonでは、「範囲」(range)と呼ばれるオブジェクトを扱うことができます。範囲というのは、整数から構成される有限の長さの等差数列のことです。つまり、何らかの整

数を出発点として、それに対して一定の整数を次々と加算していくことによってできる整数の列のことです。範囲は、 rangeという組み込み型から生成されるオブジェクトです。引数として整数 bを渡して rangeを呼び出すと、 rangeは、

0、1、2、3、...、b− 1

という範囲を生成します。

>>> for i in range(10):... print(i, end=’ ’)...0 1 2 3 4 5 6 7 8 9 >>>

引数として整数 a、整数 bを渡して rangeを呼び出すと、 rangeは、

a、a+ 1、a+ 2、a+ 3、...、b− 1

という範囲を生成します。

>>> for i in range(4, 10):

Page 47: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

5.3. while文 47

... print(i, end=’ ’)

...4 5 6 7 8 9 >>>

引数として整数 a、整数 b、整数 cを渡して rangeを呼び出すと、rangeは、aから始まって、cずつ増えていって、bに到達する直前で終わる範囲を生成します。

>>> for i in range(40, 100, 10):... print(i, end=’ ’)...40 50 60 70 80 90 >>>>>> for i in range(100, 40, -10):... print(i, end=’ ’)...100 90 80 70 60 50 >>>

次のプログラムの中で定義されている divisorという関数は、プラスの整数を受け取って、そのすべての約数を出力します。

プログラムの例 divisor.py

def divisor(n):for i in range(1, n+1):

if n%i == 0:print(i, end=’ ’)

print()

実行例>>> divisor(96)1 2 3 4 6 8 12 16 24 32 48 96

divisorの定義の最後に書かれている、

print()

という文は、「改行を出力する」という意味です。このように、引数を何も渡さないで printを呼び出した場合、 printは、改行だけを出力します。

練習問題 5.6 nをプラスの整数とするとき、n自身を除いた nの約数の和が nと等しいならば、nを「完全数」(perfect number)と言います。たとえば、6、28、496、8128などは完全数です。nをプラスの整数とするとき、 perfect(n)という式で呼び出すと、 nが完全数ならば真、そ

うでなければ偽を返す関数を定義してください。

実行例>>> from perfect import *>>> perfect(28)True>>> perfect(36)False

5.3 while文

5.3.1 while文の基礎繰り返しを記述したいときは、基本的には for文を使えばいいわけですが、for文では記述す

ることが困難な繰り返しも存在します。たとえば、条件による繰り返しは、for文では記述することが困難です。条件による繰り返しというのは、繰り返しの対象となる動作を実行するたびに、繰り返しを続

行するか終了するかということを、何らかの条件が成り立っているかどうかを判断することによって決定する、というタイプの繰り返しのことです。このようなタイプの繰り返しは、for文では記述することが困難です。そこで登場するのが、条件による繰り返しを表現するために存在する、「 while文」( while

statement)と呼ばれる文です。

Page 48: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

48 第 5章 繰り返しと再帰

5.3.2 while文の書き方

while文は、

while 条件式:

ブロック

と書きます。この中の「条件式」のところには、条件をあらわす式、つまり、評価すると値として真偽値が得られる式を書きます。while文は、次のような動作をあらわしています。

(1) 条件式を評価する。その値が偽だった場合、 while文の動作は終了する。(2) 条件式の値が真だった場合は、ブロックを実行する。(3) (1)に戻って、ふたたび同じ動作を実行する。

5.3.3 無限ループ

while文を使うと、永遠に終わらない繰り返しというものを記述することも可能になります。永遠に終わらない繰り返しは、「無限ループ」(infinite loop)と呼ばれます。Trueという組み込み定数を評価すると、真を意味するオブジェクトが値として得られますの

で、 while文の条件式としてそれを書くと、その while文は無限ループになります。たとえば、次の while文は、 kurageという文字列の出力を永遠に繰り返します。

while True:print(’kurage’)

この while文の実行を終了させたいときは、Ctrl-C、つまりコントロールキーを押しながら Cのキーを押す、という操作をします。

5.3.4 条件による繰り返しの例条件による繰り返しの例として、二つの整数の最大公約数を求めるという処理について考えて

みることにしましょう。nがプラスの整数で、mが 0またはプラスの整数だとするとき、nとmの両方に共通する約数

のうちで最大のもののことを、nとmの「最大公約数」(greatest common measure, GCM)と呼びます(mが 0の場合は、nとmの最大公約数は nだと定義します)。たとえば、54と 36の最大公約数は 18です。二つの整数の最大公約数は、「ユークリッドの互除法」(Euclidean algorithm)と呼ばれる方法

を使えば、きわめて簡単に求めることができます。ユークリッドの互除法というのは、

ステップ 1 与えられた二つの整数のそれぞれを、nとmという変数に代入する。ステップ 2 mが 0ならば計算を終了する。ステップ 3 nをmで除算して、そのあまりを rという変数に代入する。ステップ 4 mを nに代入する。ステップ 5 rをmに代入する。ステップ 6 ステップ 2に戻る。

という計算を実行していけば、計算が終了したときの nが、最初に与えられた二つの整数の最大公約数になっている、というものです。ステップ 2からステップ 6までは、

mが 0ではないあいだ、ステップ 3からステップ 5までを繰り返す。

ということだと考えることができますので、その部分は、while文を書くことによって記述することができます。次のプログラムの中で定義されている gcmという関数は、二つの整数を受け取って、それらの

最大公約数を返します。

プログラムの例 gcm.py

def gcm(n, m):while m != 0:

r = n%mn = mm = r

return n

Page 49: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

5.4. 再帰 49

実行例>>> from gcm import *>>> gcm(54, 36)18

練習問題 5.7 nを 0またはプラスの整数とするとき、ternary(n)という式で呼び出すと、3進数で nをあらわしている文字列を返す関数を定義してください。

実行例>>> from ternary import *>>> ternary(19)’201’

5.4 再帰

5.4.1 再帰とは何かこの節では、「再帰」(recursion)と呼ばれるものについて説明したいと思います。再帰というのは、全体と同じものが一部分として含まれているという性質のことです。再帰と

いう性質を持っているものは、「再帰的な」(recursive)と形容されます。ここに、1台のカメラと 1台のモニターがあるとします。まず、それらを接続して、カメラで

撮影した映像がモニターに映し出されるようにします。そして次に、カメラをモニターの画面に向けます。すると、モニターの画面には、そのモニター自身が映し出されることになります。そして、映し出されたモニターの画面の中には、さらにモニター自身が映し出されています。このときにモニターの画面に映し出されるのは、再帰という性質を持っている映像、つまり再帰的な映像です。また、先祖と子孫の関係も再帰的です。なぜなら、先祖と子孫との中間にいる人々も、やはり

先祖と子孫の関係で結ばれているからです。

5.4.2 基底再帰という性質を持っているものは、全体と同じものが一部分として含まれているわけですが、

その構造は、内部に向かってどこまでも続いている場合もあれば、どこかで終わっている場合もあります。再帰的な構造がどこかで終わっている場合、その中心には、その内部に再帰的な構造を持って

いない何かがあります。そのような、再帰的な構造の中心にあって、その内部に再帰的な構造を持っていないものは、その再帰的な構造の「基底」(basis)と呼ばれます。先祖と子孫の関係では、親子関係というのが、その再帰的な構造の基底になります。

5.4.3 関数の再帰的な定義関数は、再帰的に定義することが可能です。関数を再帰的に定義するというのは、定義される

当の関数を使って関数を定義するということです。再帰的な構造を持っている概念を取り扱う関数は、再帰的に定義するほうが、再帰的ではない方法で定義するよりもすっきりした記述になります。関数を再帰的に定義する場合は、それが循環に陥ることを防ぐために、基底について記述した

選択肢を作っておくことが必要になります。

5.4.4 階乗nが0またはプラスの整数だとするとき、nから1までの整数をすべて乗算した結果、つまり、

n× (n− 1)× (n− 2)× ...× 1

という計算の結果は、nの「階乗」(factorial)と呼ばれて、n !と書きあらわされます。ただし、0 !は 1だと定義します。たとえば、5 !は、

5× 4× 3× 2× 1

Page 50: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

50 第 5章 繰り返しと再帰

という計算をすればいいわけですから、120ということになります。階乗という概念は、再帰的な構造を持っています。なぜなら、階乗は、{

0 ! = 1

n ≥ 1ならば n ! = n× (n− 1) !

というように再帰的に定義することができるからです。階乗を求める関数も、再帰的に定義することができます。次のプログラムは、階乗を求め

る factorialという関数を再帰的に定義しています。

プログラムの例 factorial.py

def factorial(n):if n == 0:

return 1elif n >= 1:

return n * factorial(n-1)

実行例>>> from factorial import *>>> factorial(5)120

5.4.5 フィボナッチ数列第 0項と第 1項が 1で、第 2項以降はその直前の 2項を足し算した結果である、という数列

は、「フィボナッチ数列」(Fibonacci sequence)と呼ばれます。フィボナッチ数列の第 0項から第12項までを表にすると、次のようになります。

n 0 1 2 3 4 5 6 7 8 9 10 11 12

第 n項 1 1 2 3 5 8 13 21 34 55 89 144 233

フィボナッチ数列というのは再帰的な構造を持っている概念ですので、その第 n項 (Fn)は、F0 = 1

F1 = 1

n ≥ 2ならば Fn = Fn−2 + Fn−1

というように再帰的に定義することができます。フィボナッチ数列の第 n項を求める関数も、再帰的に定義することができます。次のプログラ

ムは、フィボナッチ数列の第 n項を求める fibonacciという関数を再帰的に定義しています。

プログラムの例 fibonacci.py

def fibonacci(n):if n == 0:

return 1elif n == 1:

return 1elif n >= 2:

return fibonacci(n-2) + fibonacci(n-1)

実行例>>> from fibonacci import *>>> fibonacci(7)21

5.4.6 最大公約数第 5.3.4項で、条件による繰り返しの例として、ユークリッドの互除法を使って二つの整数の

最大公約数を求めるという処理について説明しましたが、ユークリッドの互除法は、二つの整数を nとmとするとき、次のように再帰的に記述することも可能です。

• mが 0ならば、nが、nとmの最大公約数である。

Page 51: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

51

• mが 1以上ならば、nをmで除算したときのあまりを求めて、その結果を rとする。そして、mと rの最大公約数を求めれば、その結果が nとmの最大公約数である。

次のプログラムは、2個のプラスの整数の最大公約数を求める gcmという関数を、ユークリッドの互除法を使って定義しています。

プログラムの例 gcm2.py

def gcm(n, m):if m == 0:

return nelif m >= 1:

return gcm(m, n%m)

実行例>>> from gcm2 import *>>> gcm(54, 36)18

練習問題 5.8 「n重の括弧列」(n-fold parenthesis sequence)という文字列を次のように定義します。

• 空文字列は 0重の括弧列である。• nを 1以上の整数とするとき、(n− 1)重の括弧列を丸括弧で囲んだものは n重の括弧列である。

たとえば、 ()は 1重の括弧列で、 (((())))は 4重の括弧列です。nを 0またはプラスの整数とするとき、 paren(n)という式で呼び出すと、 n重の括弧列を返

す関数を定義してください。

実行例>>> from paren import *>>> paren(4)’(((())))’

練習問題 5.9 第 5.3.4項の練習問題で出題した、0またはプラスの整数を引数として受け取って、それを 3進数に変換した結果を戻り値として返す、 ternaryという関数の定義を、再帰を使って書き直してください。

実行例>>> from ternary2 import *>>> ternary(19)’201’

第6章 シーケンス

6.1 シーケンスの基礎

6.1.1 スカラーとコレクションPythonによって扱われるオブジェクトは、次の 2種類に分類することができます。

• スカラー (scalar)

• コレクション (collection)

スカラーというのは、それ以上はオブジェクトに分解することのできないオブジェクトのことです。整数、浮動小数点数、関数、真偽値、Noneなどは、スカラーに分類されるオブジェクトです。コレクションというのは、いくつかのオブジェクトから構成されているオブジェクトのことで

す。範囲や文字列は、コレクションに分類されるオブジェクトです。

Page 52: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

52 第 6章 シーケンス

すべてのコレクションは繰り返し可能オブジェクトですので、for文を使うことによって、それを構成しているそれぞれのオブジェクトについて何らかの動作を繰り返すことができます。

6.1.2 変更不可能オブジェクトと変更可能オブジェクトオブジェクトは、次の 2種類に分類することができます。

• 変更不可能オブジェクト (immutable object)

• 変更可能オブジェクト (mutable object)

これらの 2種類の相違点は、その名前のとおり、変更が可能かどうかです。変更不可能オブジェクトは、ひとたび生成されたのちは、それに対する変更ができません。それに対して、変更可能オブジェクトは、生成されたのちも、それに対する変更が可能です。変更不可能オブジェクトには、次のようなものがあります。

• スカラー (scalar)

• 文字列 (string)

• 範囲 (range)

• タプル (tuple)

• 不変集合 (frozen set)

変更可能オブジェクトには、次のようなものがあります。

• リスト (list)

• 集合 (set)

• 辞書 (dictionary)

6.1.3 要素コレクションを構成しているそれぞれのオブジェクトは、そのコレクションの「要素」(item)

と呼ばれます。文字列の要素は、1個の文字から構成される文字列です。そして、範囲の要素は、整数です。

6.1.4 コレクションの長さコレクションが持っている要素の個数は、そのコレクションの「長さ」(length)と呼ばれます。lenという関数は、引数としてコレクションを受け取って、戻り値としてその長さを返します。

>>> len(’isoginchaku’)11>>> len(range(30, 40))10

6.1.5 帰属演算子特定の要素がコレクションに帰属しているかどうかという関係、つまり、コレクションが特定

の要素を持っているという関係は、「帰属関係」(membership relation)と呼ばれます。オブジェクトとコレクションとのあいだに帰属関係があるかどうかということは、「帰属演算

子」(membership operator)と呼ばれる比較演算子を使うことによって調べることができます。帰属演算子には、次の二つのものがあります。

x in a xは aの要素である。x not in a xは aの要素ではない。

通常のコレクションの場合、帰属演算子が調べるのは、オブジェクトが 1個の要素としてコレクションに帰属しているかどうかという関係です。しかし、文字列の場合、帰属演算子は、文字列の一部分として文字列が含まれているかどうかという関係を調べます。

>>> ’inch’ in ’isoginchaku’True>>> ’bach’ in ’isoginchaku’False>>> ’inch’ not in ’isoginchaku’False>>> ’bach’ not in ’isoginchaku’

Page 53: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6.1. シーケンスの基礎 53

True>>> 36 in range(30, 40)True>>> 46 in range(30, 40)False>>> 36 not in range(30, 40)False>>> 46 not in range(30, 40)True

6.1.6 最大値と最小値

maxという関数は、引数としてコレクションを受け取って、そのコレクションを構成している要素のうちでもっとも大きいものを返します。同じように minという関数は、引数としてコレクションを受け取って、そのコレクションを構

成している要素のうちでもっとも小さいものを返します。

>>> max(’isoginchaku’)’u’>>> min(’isoginchaku’)’a’>>> max(range(30, 40))39>>> min(range(30, 40))30

6.1.7 シーケンスとは何かコレクションは、順序を持っているものと、順序を持っていないものに分類することができま

す。順序を持っているコレクションは、「シーケンス」(sequence)と呼ばれます。シーケンスには、次のようなものがあります。

• 文字列 (string)

• 範囲 (range)

• タプル (tuple)

• リスト (list)

タプルについては第 6.2節で、リストについては第 6.3節で説明することにしたいと思います。そして、順序を持っていないコレクションについては第 7章で説明することにしたいと思います。

6.1.8 インデックスシーケンスを構成しているそれぞれの要素は、「インデックス」(index)と呼ばれる番号によっ

て識別することができます。インデックスには、2種類のものがあります。ひとつは、それぞれの要素に対して、先頭から

順番に、

0、1、2、3、4、...

と与えられるインデックスで、もうひとつは、末尾から順番に、

−1、−2、−3、−4、...

と与えられるインデックスです。

6.1.9 添字表記シーケンスが持っている特定の要素を指定したいときは、「添字表記」(subscription)と呼ばれ

るものを書きます。添字表記は、

s[i]

と書きます。sはシーケンスを求める式で、iは要素のインデックスを求める式です。添字表記は、式として評価することができます。添字表記を式として評価すると、その値とし

て、インデックスで指定されたシーケンスの要素が得られます。

Page 54: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

54 第 6章 シーケンス

>>> ’isoginchaku’[3]’g’>>> ’isoginchaku’[-3]’a’>>> range(30, 40)[3]33>>> range(30, 40)[-3]37

6.1.10 スライス表記シーケンスの一部分となっているシーケンスは、「部分シーケンス」(subsequence)と呼ばれ

ます。シーケンスが持っている特定の部分シーケンスを指定したいときは、「スライス表記」(slicing)

と呼ばれるものを書きます。スライス表記は、

s[i:j]

と書きます。sはシーケンスを求める式で、iと j のそれぞれは要素のインデックスを求める式です。指定される部分シーケンスは、i番目から j − 1番目までです。スライス表記は、式として評価することができます。スライス表記を式として評価すると、そ

の値として、二つのインデックスで指定された範囲の部分シーケンスが得られます。

>>> ’isoginchaku’[4:8]’inch’>>> range(30, 40)[4:8]range(34, 38)

コロンの左右の式は、省略することができます。左側の式を省略すると、シーケンスの先頭から始まる部分シーケンスが指定されて、右側の式を省略すると、シーケンスの末尾で終わる部分シーケンスが指定されます。

>>> ’isoginchaku’[:6]’isogin’>>> range(30, 40)[4:]range(34, 40)

6.1.11 シーケンスの連結第 2.2.4項で、 +という演算子を使うことによって文字列の連結ができるという説明をしまし

たが、文字列だけではなくて、それ以外のシーケンスについても、この演算子を使うことによって、連結を実行することができます(ただし、範囲の連結はできません)。同じように、*という演算子を使うことによって、文字列だけではなくて、それ以外のシーケ

ンス(ただし範囲を除く)についても、指定された回数だけ同じシーケンスを連結することができます。

6.1.12 要素の探索すべてのシーケンスは、indexというメソッドを持っています。これは、自身の中で、先頭か

ら末尾へ向かって引数を探索して、引数と一致する要素を発見した場合は、その要素のインデックスを戻り値として返す、という動作をするメソッドです。文字列が持っている indexは、引数として文字列を受け取って、引数と一致する部分シーケン

スの先頭のインデックスを戻り値として返します。

>>> ’abc785def785ghi’.index(’785’)3>>> range(30, 40).index(36)6

引数を発見することができなかった場合は、エラーになります。

>>> range(30, 40).index(48)Traceback (most recent call last):File "<stdin>", line 1, in <module>

ValueError: 48 is not in range

Page 55: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6.2. タプル 55

2個目の引数として整数 iを渡して indexを呼び出すと、 indexは i番目の要素から探索を開始します。

>>> ’abc785def785ghi’.index(’785’, 4)9

2個目の引数として整数 i、3個目の引数として整数 j を渡して indexを呼び出すと、 index

は i番目から j − 1番目までの範囲で探索を実行します。

>>> ’abc785def785ghi’.index(’785’, 4, 11)Traceback (most recent call last):File "<stdin>", line 1, in <module>

ValueError: substring not found

6.1.13 出現回数すべてのシーケンスは、countというメソッドを持っています。これは、自身の中での引数の

出現回数(要素として引数を何個含んでいるかという個数)を戻り値として返す、という動作をするメソッドです。文字列が持っている countは、引数として文字列を受け取って、引数と一致する部分シーケン

スの出現回数を戻り値として返します。

>>> ’abc785def785ghi785jkl’.count(’785’)3>>> range(30, 40).count(36)1

6.2 タプル

6.2.1 タプルの基礎任意のオブジェクトを並べることによって作られる、順序を持つ変更不可能オブジェクトは、

「タプル」(tuple)と呼ばれます。タプルは、 tupleという組み込み型から生成されるオブジェクトです。タプルは、「丸括弧形式」(parenthesized form)と呼ばれる式を評価するか、または tupleを

明示的に呼び出すことによって生成することができます。

6.2.2 丸括弧形式の書き方丸括弧形式は、式をコンマで区切って並べて、その全体を丸括弧で囲むことによって作られま

す。つまり、

(式, 式, 式, ...)

という形のものを書けば、それが丸括弧形式になるということです(丸括弧は、場合によっては省略することができます)。丸括弧形式は式ですから、評価することができます。丸括弧形式を評価すると、その中の式が

評価されて、それらの式の値から構成されるタプルが生成されて、そのタプルが丸括弧形式全体の値になります。

>>> (583, ’namako’, print, True, range(7, 20))(583, ’namako’, <built-in function print>, True, range(7, 20))

1個の要素だけから構成されるタプルを生成したいときは、その要素を求める式の右側にコンマを書く必要があります。コンマを書かなかったとすると、1個の式を丸括弧で囲んだ式ができるわけですが、それは丸括弧形式ではありません。ですから、それを評価してもタプルは生成されず、ただ単に丸括弧の中の式の値が得られるだけです。

>>> (583,)(583,)>>> (583)583

0個の要素から構成されるタプルは、「空タプル」(empty tuple)と呼ばれます。空タプルは、0 個の式を丸括弧で囲んだ丸括弧形式を書くことによって生成することができ

ます。

Page 56: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

56 第 6章 シーケンス

>>> ()()

練習問題 6.1 「n重の入れ子タプル」(n-fold nested tuple)というタプルを次のように定義します。

• 整数の 0は 0重の入れ子タプルである。• nを 1以上の整数とするとき、1個の (n− 1)重の入れ子タプルのみを要素とするタプルは

n重の入れ子タプルである。

たとえば、 (0,)は 1重の入れ子タプルで、 ((((0,),),),)は 4重の入れ子タプルです。nを 0またはプラスの整数とするとき、 nestedtuple(n)という式で呼び出すと、 n重の入れ

子タプルを返す関数を定義してください。

実行例>>> from nestedtuple import *>>> nestedtuple(4)((((0,),),),)

6.2.3 tuple

tupleという組み込み型は、引数としてコレクションを受け取って、そのコレクションの要素から構成されるタプルを生成して、そのタプルを戻り値として返します。

>>> tuple(’namekuji’)(’n’, ’a’, ’m’, ’e’, ’k’, ’u’, ’j’, ’i’)>>> tuple(range(10, 60, 5))(10, 15, 20, 25, 30, 35, 40, 45, 50, 55)

6.2.4 シーケンスに共通する処理:タプルの場合タプルはシーケンスの一種ですので、第 6.1節で説明した、すべてのシーケンスに共通する処

理は、タプルに対しても実行することができます。

>>> a = (5, 7, 3, 7, 8, 7, 6)>>> len(a)7>>> 6 in aTrue>>> 4 in aFalse>>> max(a)8>>> min(a)3>>> a[4]8>>> a[2:5](3, 7, 8)>>> a + (2, 3, 7, 6)(5, 7, 3, 7, 8, 7, 6, 2, 3, 7, 6)>>> a * 2(5, 7, 3, 7, 8, 7, 6, 5, 7, 3, 7, 8, 7, 6)>>> a.index(8)4>>> a.count(7)3

練習問題 6.2 nを 0またはプラスの整数、 aをオブジェクトとするとき、 newtuple(n, a)という式で呼び出すと、aを n個だけ並べることによってできるタプルを返す関数を定義してください。

実行例>>> from newtuple import *>>> newtuple(4, ’hoge’)(’hoge’, ’hoge’, ’hoge’, ’hoge’)

Page 57: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6.2. タプル 57

6.2.5 複数のオブジェクトを返す関数Pythonでは、関数が戻り値として返すことのできるオブジェクトの個数は、1個だけです。し

かし、複数のオブジェクトから構成される 1個のオブジェクトを戻り値として返すことは可能です。複数のオブジェクトを戻り値として返したい場合、たとえば、それらから構成される 1個のタプルを生成することによって、それらを戻り値として返すことができます。次のプログラムの中で定義されている divisorという関数は、プラスの整数を受け取って、そ

のすべての約数から構成されるタプルを返します。

プログラムの例 divisor2.py

def divisor(n):d = ()for i in range(1, n+1):

if n%i == 0:d += (i,)

return d

実行例>>> from divisor2 import *>>> divisor(96)(1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 96)

次のプログラムの中で定義されている number_to_wordsという関数は、プラスの整数を受け取って、それを英単語から構成されるタプルに変換した結果を返します。

プログラムの例 ntow.py

def digit_to_word(d):return (’zero’, ’one’, ’two’, ’three’, ’four’, ’five’,

’six’, ’seven’, ’eight’, ’nine’)[d]

def number_to_words(n):w = ()while n > 0:

w = (digit_to_word(n%10),) + wn //= 10

return w

実行例>>> from ntow import *>>> number_to_words(870316)(’eight’, ’seven’, ’zero’, ’three’, ’one’, ’six’)

練習問題 6.3 mを、分を単位とする時間の長さとするとき、hourminute(m)という式で呼び出すと、mを (何時間, 何分)という形式のタプルに変換した結果を返す関数を定義してください。

実行例>>> from hourminute import *>>> hourminute(160)(2, 40)

6.2.6 タプルに対する繰り返し第 6.1.1項で説明したように、すべてのコレクションは繰り返し可能オブジェクトです。した

がって、タプルも、for文を使うことによって、それを構成しているそれぞれのオブジェクトについて何らかの動作を繰り返すことができます。次のプログラムの中で定義されている sum_of_ivisorという関数は、プラスの整数を受け取っ

て、そのすべての約数の和を返します。

プログラムの例 sumdiv.py

def divisor(n):d = ()

Page 58: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

58 第 6章 シーケンス

for i in range(1, n+1):if n%i == 0:

d += (i,)return d

def sum_of_divisor(n):s = 0for i in divisor(n):

s += ireturn s

実行例>>> from sumdiv import *>>> sum_of_divisor(96)252

練習問題 6.4 aをタプルとするとき、 flatten(a)という式で呼び出すと、そのタプルに再帰的に含まれているすべてのタプルではない要素から構成されるタプル、すなわち、何重にも入れ子になっているタプルを平坦化したタプルを返す関数を定義してください。

実行例>>> from flatten import *>>> flatten((27, (64, (81, (27, 32), (64, 22), 86), 32), 42))(27, 64, 81, 27, 32, 64, 22, 86, 32, 42)

6.3 リスト

6.3.1 リストの基礎任意のオブジェクトを並べることによって作られる、順序を持つ変更可能オブジェクトは、「リ

スト」(list)と呼ばれます。任意のオブジェクトを並べることによって作られるシーケンスとしては、タプルとリストとい

う 2種類のものがあります。それらの相違点は、変更不可能オブジェクトかどうかということです。タプルは変更不可能オブジェクトで、リストは変更可能オブジェクトです。リストは、 listという組み込み型から生成されるオブジェクトです。リストは、次の方法のうちのいずれかを使うことによって生成することができます。

• リスト表示 (list display)を使う方法。

• listを明示的に呼び出す方法。• リスト内包表記 (list comprehension)を使う方法。

6.3.2 リスト表示式をコンマで区切って並べて、その全体を角括弧で囲むことによって作られる式、つまり、

[式, 式, 式, ...]

という形の式は、「リスト表示」(list display)と呼ばれます。リスト表示を評価すると、その中の式が評価されて、それらの式の値から構成されるリストが

生成されて、そのリストがリスト表示全体の値になります。

>>> [583, ’namako’, print, True, range(7, 20)][583, ’namako’, <built-in function print>, True, range(7, 20)]

タプルとは違って、1個の要素だけから構成されるリストを生成したいとき、その要素を求める式の右側にコンマを書く必要はありません。

>>> [583][583]

0個の要素から構成されるリストは、「空リスト」(empty list)と呼ばれます。空リストは、0 個の式を角括弧で囲んだリスト表示を書くことによって生成することができ

ます。

Page 59: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6.3. リスト 59

>>> [][]

6.3.3 list

listという組み込み型は、引数としてコレクションを受け取って、そのコレクションの要素から構成されるリストを生成して、そのリストを戻り値として返します。

>>> list(’namekuji’)[’n’, ’a’, ’m’, ’e’, ’k’, ’u’, ’j’, ’i’]>>> list(range(10, 60, 5))[10, 15, 20, 25, 30, 35, 40, 45, 50, 55]>>> list((True, True, False, True, False))[True, True, False, True, False]

6.3.4 リスト内包表記「リスト内包表記」(list comprehension)というのは、式の一種です。それを評価すると、す

でに存在するコレクションからリストが生成されて、そのリストが値として得られます。listも、すでに存在するコレクションからリストを生成しますが、listにできることは、コ

レクションからリストを単純に生成することだけです。それに対して、リスト内包表記は、すでに存在するコレクションに対して何らかの処理を加えたものからリストを生成することができます。リスト内包表記は、基本的には、

[式 1 for 識別子 in 式 2]

と書きます。式 2 は、コレクションを求める式でないといけません。リスト内包表記は、次のような手順で評価されます。

(1) 式 2 を評価する。(2) 式 2 の値として得られたコレクションを構成しているそれぞれの要素について、 forと in

のあいだに書かれた識別子をそれに束縛して、式 1 を評価する、ということを繰り返す。(3) 式 1を評価することによって得られた値から構成されるリストを生成して、それをリスト内

包表記全体の値にする。

forと inのあいだに書いた識別子を、そのまま式 1として書くと、listを使った場合と同じように、コレクションからリストが単純に生成されます。

>>> [x for x in range(10)][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

要素に対する処理を式 1として書くことによって、その処理の結果から構成されるリストを生成することができます。

>>> [x%3 for x in range(10)][0, 1, 2, 0, 1, 2, 0, 1, 2, 0]

リスト内包表記は、

[式 1 for 識別子 in 式 2 if 式 3]

と書くこともできます。式 3 としては、何らかの条件をあらわす式を書きます。この形のリスト内包表記は、次のような手順で評価されます。

(1) 式 2 を評価する。(2) 式 2 の値として得られたコレクションを構成しているそれぞれの要素について、 forと in

のあいだに書かれた識別子をそれに束縛して、式 3 を評価する、ということを繰り返す。(3) 式 3 の値が真だった場合は、式 1 も評価する。(4) 式 1を評価することによって得られた値から構成されるリストを生成して、それをリスト内

包表記全体の値にする。

>>> [x for x in range(10) if x%2 == 0][0, 2, 4, 6, 8]

Page 60: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

60 第 6章 シーケンス

次のプログラムの中で定義されている divisorという関数は、プラスの整数を受け取って、そのすべての約数から構成されるリストを返します。

プログラムの例 divisor3.py

def divisor(n):return [x for x in range(1, n+1) if n%x == 0]

実行例>>> from divisor3 import *>>> divisor(96)[1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 96]

6.3.5 シーケンスに共通する処理:リストの場合リストはシーケンスの一種ですので、第 6.1節で説明した、すべてのシーケンスに共通する処

理は、リストに対しても実行することができます。

>>> a = [5, 7, 3, 7, 8, 7, 6]>>> len(a)7>>> 6 in aTrue>>> 4 in aFalse>>> max(a)8>>> min(a)3>>> a[4]8>>> a[2:5][3, 7, 8]>>> a + [2, 3, 7, 6][5, 7, 3, 7, 8, 7, 6, 2, 3, 7, 6]>>> a * 2[5, 7, 3, 7, 8, 7, 6, 5, 7, 3, 7, 8, 7, 6]>>> a.index(8)4>>> a.count(7)3

6.3.6 リストの要素の置換リストは変更可能オブジェクトですので、生成されたのちも変更を加えることができます。リストの要素は、別のオブジェクトに置換することができます。リストの要素を置換したいと

きは、代入文を使います。代入文のイコールの左側に添字表記を書くと、その添字表記で指定された要素が、イコールの

右側に書かれた式の値に置換されます。

>>> a = [5, 7, 3, 7, 8, 7, 6]>>> a[4] = True>>> a[5, 7, 3, 7, True, 7, 6]

代入文のイコールの左側にスライス表記を書くと、それによって指定された部分シーケンスが、イコールの右側に書かれた式の値に置換されます。この場合、イコールの右側に書く式は、コレクションを求めるものでないといけません。

>>> a = [5, 7, 3, 7, 8, 7, 6]>>> a[2:5] = (True, True, False, True)>>> a[5, 7, True, True, False, True, 7, 6]>>> a[2:5] = [-3, -2, -5, -4]>>> a[5, 7, -3, -2, -5, -4, True, 7, 6]>>> a[2:5] = ’asari’

Page 61: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

6.3. リスト 61

>>> a[5, 7, ’a’, ’s’, ’a’, ’r’, ’i’, -4, True, 7, 6]

コロンの左右に、同じインデックスを求める式を書くことによって、そのインデックスで指定された要素の直前にコレクションを挿入する、ということもできます。

>>> a = [5, 7, 3, 7, 8, 7, 6]>>> a[3:3] = ’hitode’>>> a[5, 7, 3, ’h’, ’i’, ’t’, ’o’, ’d’, ’e’, 7, 8, 7, 6]

6.3.7 リストの要素の削除リストの要素は、削除することができます。リストの要素を削除したいときは、「 del文」( del

statement)と呼ばれる文を使います。del文は、

del 削除対象

と書きます。「削除対象」のところには、添字表記またはスライス表記を書きます。添字表記を書いた場合は、それによって指定された 1個の要素が削除されます。スライス表記を書いた場合は、それによって指定された部分シーケンスが削除されます。

>>> a = list(range(12))>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]>>> del a[10]>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11]>>> del a[3:8]>>> a[0, 1, 2, 8, 9, 11]

コロンの両側の式を省略したスライス表記を書くことによって、リストを構成しているすべての要素を省略する、ということもできます。

>>> a = list(range(12))>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]>>> del a[:]>>> a[]

リストが持っている removeというメソッドは、引数として受け取ったオブジェクトを、自身の中で、先頭から末尾へ向かって検索して、最初に発見した要素をリストから削除します。発見することができなかった場合は、エラーになります。

>>> a = [5, 7, 3, 7, 8, 7, 6]>>> a.remove(7)>>> a[5, 3, 7, 8, 7, 6]

6.3.8 エラトステネスのふるい2から nまでの範囲にあるすべての素数を求めるための手順としては、「エラトステネスのふ

るい」(sieve of Eratosthenes)と呼ばれるものがよく知られています。エラトステネスのふるいは、次のような手順です。

(1) 2から nまでのすべての整数を並べた列を作る。(2) 2を iとする。(3) 次の (4)と (5)を、i2 が n以下であるあいだ繰り返す。(4) iが列の中にあるならば、その倍数のうちで列の中にあるものをすべて取り除く。ただし、i

自身は取り除かない。(5) iに 1を加算した整数を iとする。

この手順が終了すると、素数だけが列の中に残ります。次のプログラムの中で定義されている eratosthenesという関数は、プラスの整数 nを受け

Page 62: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

62 第 6章 シーケンス

取って、エラトステネスのふるいを使って 2から nまでの範囲にあるすべての素数を求めて、それらの素数から構成されるリストを返します。

プログラムの例 eratos.py

def eratosthenes(n):sieve = list(range(2, n+1))i = 2while i*i <= n:

if i in sieve:j = i+iwhile j <= n:

if j in sieve:sieve.remove(j)

j += ii += 1

return sieve

実行例>>> from eratos import *>>> eratosthenes(50)[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

6.4 文字列

6.4.1 この節についてこの節では、文字列が持っているメソッドのうちで、重要と思われるいくつかのものを紹介し

たいと思います。文字列を生成するリテラルについては第 2.1節、文字列を数値に変換する方法や数値を文字列

に変換する方法については第 2.3節を参照してください。

6.4.2 部分文字列の探索文字列の部分シーケンス、つまり文字列の一部分となっている文字列は、「部分文字列」(sub-

string)と呼ばれます。部分文字列の探索は、第 6.1.12項で説明したように、文字列が持っている indexというメソッ

ドを使うことによって実行することができるわけですが、 findという、文字列が独自に持っているメソッドを使って実行することもできます。indexと findの相違点は、部分文字列を発見することができなかった場合の動作です。その

場合、 indexがエラーを出すのに対して、 findはエラーを出さないで、戻り値として −1を返します。

>>> ’abc785def785ghi’.find(’785’)3>>> ’abcdefghi’.find(’785’)-1

indexと同じように、findも、2個目と 3個目の引数として整数を渡すことによって、探索の範囲を限定することができます。

>>> ’abc785def785ghi’.find(’785’, 4)9>>> ’abc785def785ghi’.find(’785’, 4, 11)-1

練習問題 6.5 s1と s2を文字列とするとき、 findall(s1, s2)という式で呼び出すと、 s1の中に部分文字列として含まれている s2を探索して、発見されたすべての部分文字列の位置から構成されるタプルを返す関数を定義してください。

実行例>>> from findall import *>>> findall(’abc785def785ghij785kl785mnop785qrs785tu’, ’785’)(3, 9, 16, 21, 28, 34)

Page 63: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

63

6.4.3 部分文字列の置換文字列が持っている replaceというメソッドは、引数として 2個の文字列を受け取って、まず

自身のコピーを作って、その中に部分文字列として含まれている 1個目の引数を 2個目の引数に置換して、そのコピーを戻り値として返します。自身は変化しません。

>>> a = ’abc785def785ghi’>>> a.replace(’785’, ’012’)’abc012def012ghi’>>> a’abc785def785ghi’

6.4.4 文字列の分割文字列が持っている splitというメソッドは、自身を単語(連続した空白で区切られた部分文

字列)に分割して、それぞれの単語から構成されるリストを戻り値として返します。

>>> ’the moon is a harsh mistress’.split()[’the’, ’moon’, ’is’, ’a’, ’harsh’, ’mistress’]

引数として区切り文字列を渡すと、 splitは、その区切り文字列で文字列を分割します。

>>> ’1958/09/28’.split(’/’)[’1958’, ’09’, ’28’]

6.4.5 文字列の結合文字列が持っている joinというメソッドは、文字列を要素とする繰り返し可能オブジェクトを

引数として受け取って、自身を区切り文字列として、引数を構成しているすべての文字列を結合することによってできる文字列を戻り値として返します。

>>> ’/’.join([’1958’, ’09’, ’28’])’1958/09/28’

第7章 順序なしコレクション

7.1 順序なしコレクションの基礎

7.1.1 シーケンスと順序なしコレクション第 6.1.7項で説明したように、コレクションは、順序を持っているものと、順序を持っていな

いものに分類することができて、順序を持っているコレクションは、「シーケンス」(sequence)と呼ばれます。このチュートリアルにこれまでに登場したコレクション、すなわち、範囲、文字列、タプル、リストは、いずれもシーケンスです。順序を持っていないコレクションは、「順序なしコレクション」(unordered collection)と呼ば

れます。

7.1.2 順序なしコレクションの特徴順序なしコレクションには、次のような特徴があります。

• 要素をインデックスで識別することができない。したがって、添字表記やスライス表記を書くこともできないし、要素を探索して、そのインデックスを求めることもできない。

• 演算子の +や *を使って連結することができない。

7.1.3 順序なしコレクションの分類順序なしコレクションは、次の 3種類に分類することができます。

• 集合 (set)

• 不変集合 (frozen set)

• 辞書 (dictionary)

集合と不変集合については第 7.2節で、辞書については第 7.3節で説明することにしたいと思います。

Page 64: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

64 第 7章 順序なしコレクション

7.2 集合と不変集合

7.2.1 集合と不変集合の基礎集合 (set)と不変集合 (frozen set)は、どちらも、オブジェクトを単純に集めることによって作

られる順序なしコレクションです。集合と不変集合との相違点は、変更可能オブジェクトかどうかということです。集合は変更可

能オブジェクトで、不変集合は変更不可能オブジェクトです。集合も不変集合も、順序なしコレクションですので、第 7.1.2項で指摘した特徴を持っていま

す。また、要素の重複を許さないという特徴も持っています。つまり、1個の集合または不変集合の中に、同一の要素が 2個以上存在することはできない、ということです。集合は setという組み込み型から生成されるオブジェクトで、不変集合は frozensetという

組み込み型から生成されるオブジェクトです。集合は、「集合表示」(set display)と呼ばれる式を評価するか、または、 setを明示的に呼び

出すことによって生成することができます。不変集合は、 frozensetを明示的に呼び出すことによって生成することができます。

7.2.2 集合表示の書き方集合表示は、式をコンマで区切って並べて、その全体を中括弧で囲むことによって作られます。

つまり、

{式, 式, 式, ...}

という形のものを書けば、それが集合表示になるということです。集合表示を評価すると、その中の式が評価されて、それらの式の値から構成される集合が生成

されて、その集合が集合表示全体の値になります。

>>> {583, ’namako’, print, True, range(7, 20)}{True, ’namako’, range(7, 20), <built-in function print>, 583}

7.2.3 set

setという組み込み型は、引数としてコレクションを受け取って、そのコレクションの要素から構成される集合を生成して、その集合を戻り値として返します。引数として渡したコレクションの中に、同一の要素が 2個以上存在していた場合、それらの要

素のうちで集合の要素になるのは 1個だけです。

>>> set((5, 7, 3, 7, 8, 7, 6)){8, 3, 5, 6, 7}>>> set(’umiushi’){’u’, ’s’, ’h’, ’i’, ’m’}

0個の要素から構成される集合は、「空集合」(empty set)と呼ばれます。空集合は、引数を何も渡さないで setを呼び出すことによって生成することができます。

>>> set()set()

{}という式は、空集合ではなく、0個の要素から構成される辞書を生成します。

7.2.4 frozenset

frozensetという組み込み型は、引数としてコレクションを受け取って、そのコレクションの要素から構成される不変集合を生成して、その不変集合を戻り値として返します。

>>> frozenset((5, 7, 3, 7, 8, 7, 6))frozenset({8, 3, 5, 6, 7})>>> frozenset(’umiushi’)frozenset({’s’, ’i’, ’m’, ’h’, ’u’})

0個の要素から構成される不変集合は、「空不変集合」(empty frozen set)と呼ばれます。空不変集合は、引数を何も渡さないで frozensetを呼び出すことによって生成することがで

きます。

>>> frozenset()frozenset()

Page 65: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

7.2. 集合と不変集合 65

7.2.5 コレクションに共通する処理:集合の場合集合はコレクションの一種ですので、第 6.1節で説明した、すべてのコレクションに共通する

処理は、集合に対しても実行することができます。

>>> a = {5, 7, 3, 8, 6, 9, 2}>>> len(a)7>>> 6 in aTrue>>> 4 in aFalse>>> max(a)9>>> min(a)2

7.2.6 集合演算子処理の対象が集合で、処理の結果も集合であるような動作をあらわしている演算子は、「集合

演算子」(set operator)と呼ばれます。Pythonには、次の四つの集合演算子があります。

a & b aと bの共通部分 (intersection)を求める。aと bの共通部分というのは、aと bの両方に含まれる要素から構成される集合のこと。

a | b aと bの和集合 (union)を求める。aと bの和集合というのは、aの要素と bの要素から構成される集合のこと。

a - b aから bを引いた差集合 (difference)を求める。aから bを引いた差集合というのは、aには含まれるが bには含まれない要素から構成される集合のこと。

a ^ b aと bの対称差集合 (symmetric difference)を求める。aと bの対称差集合というのは、aと bのうちのどちらか一方のみに含まれる要素から構成される集合のこと。

>>> a = {1, 2, 3, 4, 5, 6}>>> b = {4, 5, 6, 7, 8, 9}>>> a & b{4, 5, 6}>>> a | b{1, 2, 3, 4, 5, 6, 7, 8, 9}>>> a - b{1, 2, 3}>>> b - a{8, 9, 7}>>> a ^ b{1, 2, 3, 7, 8, 9}

7.2.7 集合比較演算子二つの集合のあいだに何らかの関係があるという条件が成り立っているかどうかを調べる比較

演算子は、「集合比較演算子」(set comparison operator)と呼ばれます。Pythonには、次の四つの集合比較演算子があります。

a <= b aは bの部分集合 (subset)である。aは bの部分集合であるというのは、aのすべての要素が bの要素でもあるということ。

a < b aは bの真部分集合 (proper subset)である。aは bの真部分集合であるというのは、aのすべての要素が bの要素でもあって、かつ、bは、aの要素ではない要素を少なくとも 1個は含んでいるということ。

a >= b aは bの上位集合 (superset)である。aは bの上位集合であるというのは、bのすべての要素が aの要素でもあるということ。

a > b aは bの真上位集合 (proper superset)である。aは bの真上位集合であるというのは、bのすべての要素が aの要素でもあって、かつ、aは、bの要素ではない要素を少なくとも 1個は含んでいるということ。

>>> a = {3, 4, 5}

Page 66: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

66 第 7章 順序なしコレクション

>>> b = {2, 3, 4, 5, 6}>>> a <= bTrue>>> b <= aFalse>>> a >= bFalse>>> b >= aTrue>>> a <= aTrue>>> a >= aTrue>>> a < aFalse>>> a > aFalse

7.2.8 集合に対する繰り返し第 6.1.1項で説明したように、すべてのコレクションは繰り返し可能オブジェクトです。順序

なしコレクションも例外ではありません。したがって、集合も、for文を使うことによって、それを構成しているそれぞれのオブジェクトについて何らかの動作を繰り返すことができます。ただし、識別子がそれぞれの要素に束縛される順序は不定です。

>>> a = {5, 7, 3, 8, 6, 9, 2}>>> for x in a:... print(x, end=’ ’)...2 3 5 6 7 8 9 >>>

7.2.9 ハッシュ可能性タプルとリストは、任意のオブジェクトを要素として持つことができます。それに対して、集

合には、要素として持つことができないオブジェクトが存在します。オブジェクトが集合の要素になることができるためには、そのオブジェクトが「ハッシュ可能

性」(hashability)という性質を持っている必要があります。ハッシュ可能性というのは、「ハッシュ値」(hash value)とよばれる整数を持っていて、かつ、

他のオブジェクトとのあいだで、等しいかどうかの比較ができる、という性質のことです。ハッシュ可能性を持つオブジェクトは「ハッシュ可能オブジェクト」(hashable object)と呼

ばれ、ハッシュ可能性を持たないオブジェクトは「ハッシュ不可能オブジェクト」(unhashableobject)と呼ばれます。基本的には、スカラー、文字列、範囲などの変更不可能オブジェクトはハッシュ可能オブジェ

クトで、リストなどの変更可能オブジェクトはハッシュ不可能オブジェクトです。リストはハッシュ不可能オブジェクトですので、要素としてリストを含む集合を作るというこ

とはできません。無理に作ろうとすると、エラーになります。

>>> {5, 7, [3, 8, 2], 4, 6}Traceback (most recent call last):File "<stdin>", line 1, in <module>

TypeError: unhashable type: ’list’

タプルは、そのすべての要素が変更不可能オブジェクトならばハッシュ可能オブジェクトですが、要素として変更可能オブジェクトを 1個でも持っている場合はハッシュ不可能オブジェクトになります。

>>> {5, 7, (3, 8, 2), 4, 6}{(3, 8, 2), 4, 5, 6, 7}>>> {5, 7, (3, [8, 2]), 4, 6}Traceback (most recent call last):File "<stdin>", line 1, in <module>

TypeError: unhashable type: ’list’

集合と辞書も、ハッシュ不可能オブジェクトです。したがって、それらを要素として含む集合を作ることはできません。それに対して、不変集合はハッシュ可能オブジェクトですので、要素

Page 67: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

7.3. 辞書 67

として不変集合を含む集合を作ることは可能です。

>>> {5, 7, {3, 8, 2}, 4, 6}Traceback (most recent call last):File "<stdin>", line 1, in <module>

TypeError: unhashable type: ’set’>>> {5, 7, frozenset((3, 8, 2)), 4, 6}{frozenset({8, 2, 3}), 4, 5, 6, 7}

7.3 辞書

7.3.1 辞書の基礎「辞書」(dictionary)と呼ばれるオブジェクトは、集合と同じように、オブジェクトを集めることによって作られる順序なしコレクションです。集合と辞書との相違点は、要素の構造です。集合の個々の要素は単独のオブジェクトですが、

辞書の要素は、2個のオブジェクトがペアになったものです。辞書の要素を構成しているペアのオブジェクトのそれぞれは、「キー」(key)と「値」(value)

と呼ばれます。キーは、個々の要素を識別するために使われるオブジェクトです。したがって、1個の辞書の

中に、同じキーを持つ要素が 2個以上存在することはできません。それに対して、値は、要素の識別には使われませんので、1個の辞書の中に、同じ値を持つ要素が 2個以上存在することも可能です。辞書は、現実の世界に存在する辞書に、よく似ています。現実の辞書は、見出し語と、その見

出し語についての説明とをペアにした項目から構成されています。キーというのは見出し語に相当して、値というのは見出し語についての説明に相当します。そして、それぞれの項目は、見出し語によって識別されます。辞書の要素の値にすることができるのは、任意のオブジェクトです。それに対して、辞書の要

素のキーにすることができるのは、ハッシュ可能オブジェクトだけです。ハッシュ不可能オブジェクトを辞書の要素のキーにすることはできません。辞書は、 dictという組み込み型から生成されるオブジェクトです。辞書は、「辞書表示」(dictionary display)と呼ばれる式を評価することによって生成すること

ができます。

7.3.2 辞書表示の書き方辞書はキーと値のペアから構成されますので、辞書表示は、キーと値のペアをあらわす記述か

ら構成されることになります。キーと値のペアをあらわす記述は、「キー値ペア」(key-value pair)と呼ばれます。キー値ペアは、

式: 式

というように、コロンの左右に式を書いたものです。コロンの左にはキーを求める式、右側には値を求める式を書きます。たとえば、

’namako’: 707

というキー値ペアを書くことによって、 namakoという文字列がキーで、707という整数が値であるような辞書の要素を記述することができます。コロンとその右側の式とのあいだには、通常、1個の空白を書きます。ただしこれは、文法で

そのように決められているわけではなくて、あくまでスタイルの問題です。辞書表示は、キー値ペアをコンマで区切って並べて、その全体を中括弧で囲むことによって作

られます。つまり、

{キー値ペア, キー値ペア, キー値ペア, ...}

という形のものを書けば、それが辞書表示になるということです。辞書表示を評価すると、その中の式が評価されて、それらの式の値から構成される辞書が生成

されて、その辞書が辞書表示全体の値になります。

>>> {’namako’: 707, 532: {8, 4, 6}, (1, 9): [3, 0, 8]}{532: {8, 4, 6}, (1, 9): [3, 0, 8], ’namako’: 707}

Page 68: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

68 第 7章 順序なしコレクション

0個の要素から構成される辞書は、「空辞書」(empty dictionary)と呼ばれます。空辞書は、0個のキー値ペアを中括弧で囲んだ辞書表示を書くことによって生成することがで

きます。

>>> {}{}

7.3.3 コレクションに共通する処理:辞書の場合辞書はコレクションの一種ですので、第 6.1節で説明した、すべてのコレクションに共通する

処理は、辞書に対しても実行することができます。ただし、inと not inが調べるのは、キーが辞書に帰属するかどうかです。また、maxと minのそれぞれが求めるのは、キーの最大値と最小値です。

>>> a = {’a’: 8, ’w’: 2, ’g’: 7, ’d’: 6, ’m’: 4}>>> len(a)5>>> ’d’ in aTrue>>> ’e’ in aFalse>>> max(a)’w’>>> min(a)’a’

7.3.4 辞書の添字表記辞書が持っている特定の要素は、添字表記を書くことによって指定することができます。辞書の添字表記は、シーケンスの添字表記と同じように、

a[k]

と書きます。aは辞書を求める式で、kは要素のキーを求める式です。辞書の添字表記も、シーケンスの添字表記と同じように、式として評価することができます。

辞書の添字表記を式として評価すると、その値として、指定されたキーを持つ要素の値が得られます。指定されたキーを持つ要素が存在しない場合は、エラーになります。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a[’d’]6>>> a[’k’]Traceback (most recent call last):File "<stdin>", line 1, in <module>

KeyError: ’k’

キーで指定された要素の値は、辞書が持っている getというメソッドを使うことによって求めることもできます。getは、オブジェクトを引数として受け取って、それをキーとして持つ要素の値を戻り値として返します。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a.get(’d’)6

指定されたキーを持つ要素が存在しない場合、添字表記の評価では、エラーになりますが、get

はエラーにならず、戻り値として Noneを返します。getに 2個目の引数を渡すと、指定されたキーを持つ要素が存在しない場合、Noneの代わりに 2個目の引数を戻り値として返します。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a.get(’k’, ’not found’)’not found’

7.3.5 辞書の要素の置換辞書は変更可能オブジェクトですので、生成されたのちも変更を加えることができます。辞書の要素の値は、別のオブジェクトに置換することができます。辞書の要素の値を置換した

いときは、代入文を使います。

Page 69: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

7.3. 辞書 69

代入文のイコールの左側に添字表記を書くと、その添字表記で指定された要素の値が、イコールの右側に書かれた式の値に置換されます。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a[’d’] = True>>> a{’g’: 7, ’w’: 2, ’d’: True}

辞書の要素を置換する代入文を実行したときに、角括弧の中の式の値をキーとして持つ要素が存在しなかった場合は、その式の値をキーとして、イコールの右側に書かれた式の値を値とする要素が辞書に追加されます。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a[’m’] = False>>> a{’m’: False, ’g’: 7, ’w’: 2, ’d’: 6}

7.3.6 要素の削除辞書の要素は、 del文を使うことによって、削除することができます。辞書の要素を削除する del文は、リストの要素を削除する場合と同じように、

del 削除対象

と書きます。「削除対象」のところには、削除したい要素を指定する添字表記を書きます。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> del a[’g’]>>> a{’w’: 2, ’d’: 6}

辞書が持っている clearというメソッドは、辞書を構成しているすべての要素を削除します。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> a.clear()>>> a{}

7.3.7 辞書ビューオブジェクト辞書は、keys、values、 itemsというメソッドを持っています。これらのメソッドは、「辞

書ビューオブジェクト」(dictionary view object)と呼ばれるオブジェクトを戻り値として返します(引数は受け取りません)。辞書ビューオブジェクトというのは、自身を生成した辞書に関連づけられていて、辞書が変更されると、それに連動して自身も変更されるオブジェクトのことです。keys、 values、 itemsのそれぞれが返すのは、次のような辞書ビューオブジェクトです。

keys 辞書のすべてのキーから構成される辞書ビューオブジェクト。values 辞書のすべての値から構成される辞書ビューオブジェクト。items 辞書のすべての要素から構成される辞書ビューオブジェクト。

辞書ビューオブジェクトは、 tupleを呼び出すことによってタプルに、 listを呼び出すことによってリストに変換することができます。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> tuple(a.keys())(’g’, ’d’, ’w’)>>> list(a.values())[7, 6, 2]>>> tuple(a.items())((’g’, 7), (’d’, 6), (’w’, 2))>>> list(a.items())[(’g’, 7), (’d’, 6), (’w’, 2)]

辞書ビューオブジェクトは、それに関連づけられている辞書を変更すると、それに連動して変更されます。

>>> a = {’w’: 2, ’g’: 7, ’d’: 6}>>> b = a.items()

Page 70: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

70 第 8章 クラス

>>> tuple(b)((’g’, 7), (’d’, 6), (’w’, 2))>>> a[’d’] = True>>> tuple(b)((’g’, 7), (’d’, True), (’w’, 2))

7.3.8 度数分布何かの度数分布を求めたいときは、辞書を使うと便利です。次のプログラムの中で定義されている frequencyという関数は、文字列を受け取って、その文

字列を構成している文字の度数分布を示す辞書を返します。

プログラムの例 frequency.py

def frequency(s):fd = {}for c in s:

if c in fd:fd[c] += 1

else:fd[c] = 1

return fd

実行例>>> from frequency import *>>> frequency(’sakatanokintoki’){’t’: 2, ’a’: 3, ’s’: 1, ’n’: 2, ’o’: 2, ’i’: 2, ’k’: 3}

第8章 クラス

8.1 クラスの基礎

8.1.1 クラスについての復習この章では、クラスについて説明するわけですが、まず最初に、クラスについてこれまでに説

明したことを復習しておくことにしましょう。第 2.3.2項で説明したように、オブジェクトを生成するという動作をする呼び出し可能オブジェ

クトは、「クラス」(class)と呼ばれます。クラスは、何らかのオブジェクトを生成して、そのオブジェクトを戻り値として返します。Pythonのオブジェクトは、例外なく、何らかのクラスから生成されます。第 2.3.10項で説明したように、Pythonでは、「クラス定義」(class definition)と呼ばれる文

をプログラムの中に書くことによって、クラスを自由に定義することができます。プログラムの中にクラス定義を書くことによって定義されたクラスは、「ユーザー定義クラス」(user-definedclass)と呼ばれます。「ユーザー定義クラス」の対義語は、「組み込み型」です。「組み込み型」(built-in type)というのは、Pythonの処理系に組み込まれているクラスのことです。

8.1.2 クラスとオブジェクトとの関係クラスとオブジェクトとの関係は、鋳型と鋳物との関係に似ています。「鋳物」というのは、高熱で溶けた金属を冷やして固めることによって製造される金属製品のことです。鋳物を製造するとき、溶けた金属は、「鋳型」と呼ばれるものの中にある空洞に流し込まれます。そうすることによって、鋳物は、鋳型の中の空洞と同じ形を持つことになります。そして、ひとつの鋳型からは、同じ形を持つ鋳物をいくつでも製造することができます。鋳物が鋳型から製造されるのと同じように、オブジェクトはクラスから生成されます。ひとつ

の鋳型から製造されたすべての鋳物が同じ形を持つのと同じように、ひとつのクラスから生成されたすべてのオブジェクトは、同じメソッドを持つことになります。

Page 71: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

8.2. クラス定義 71

8.1.3 組み込み型このチュートリアルにこれまでに登場したオブジェクトは、すべて、組み込み型から生成され

たものです。すべての組み込み型には、あらかじめ識別子が束縛されています。次の表は、このチュートリ

アルにこれまでに登場したオブジェクトを生成する組み込み型のうちで主要なものについて、それに束縛されている識別子を示しています。

整数 int 範囲 range

浮動小数点数 float タプル tuple

文字列 str リスト list

真偽値 bool 集合 set

ユーザー定義関数 function 辞書 dict

8.1.4 クラスを生成する組み込み型クラスというのはオブジェクトの一種ですから、ほかのオブジェクトと同じように、何らかの

クラスから生成されます。クラスを生成するクラスは組み込み型で、 typeという識別子がその組み込み型に束縛されて

います。typeは、引数としてオブジェクトを受け取って、そのオブジェクトを生成したクラスを戻り

値として返します。

>>> type(87)<class ’int’>>>> type(3.14)<class ’float’>>>> type(’namako’)<class ’str’>

クラスを生成したクラスが typeだということも、typeを呼び出すことによって確かめることができます。

>>> type(int)<class ’type’>

typeもオブジェクトですから、何らかのクラスから生成されます。typeを生成するのは、自分自身です。

>>> type(type)<class ’type’>

8.2 クラス定義

8.2.1 クラス定義の基礎クラスを生成して、識別子をそのクラスに束縛することを、クラスを「定義する」(define)と

言います。クラスは、「クラス定義」(class definition)と呼ばれる文を書くことによって定義することが

できます。クラス定義は、クラスを定義するという動作を意味する文です。

8.2.2 基本的なクラス定義クラス定義は、基本的には、

class 識別子:

ブロック

と書きます。クラス定義を実行すると、新しいクラスが生成されて、「識別子」のところに書かれた識別子がそのクラスに束縛されます。それでは、クラス定義をインタラクティブシェルに入力してみましょう。

>>> class Hitode:... print(’hitode’)...

Page 72: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

72 第 8章 クラス

hitode

これによって、新しいクラスが生成されて、 Hitodeという識別子がそのクラスに束縛されます。クラス定義が実行されると、それと同時に、その中のブロックも実行されますので、この場合は、 hitodeという文字列が出力されています。なお、ユーザー定義クラスに束縛する識別子は、この Hitodeのように、その先頭の文字を大

文字にします(これは文法で決まっていることではなくて、プログラムを読みやすくするための約束事です)。

8.2.3 オブジェクトの生成クラスというのは呼び出し可能オブジェクトですから、呼び出しを書くことによってクラスを

呼び出すことができます。クラスを呼び出すと、オブジェクトが生成されて、そのオブジェクトが戻り値として返ってきます。先ほど定義した Hitodeクラスも、呼び出すことによってオブジェクトを生成することができ

ます。インタラクティブシェルを使って試してみましょう。

>>> h = Hitode()>>> h<__main__.Hitode object at 0x00C40830>>>> type(h)<class ’__main__.Hitode’>

8.2.4 何の動作もしない文先ほど定義した Hitodeというクラスから生成されたオブジェクトは、クラス定義の中にメソッ

ドを作る記述を書いていませんが、メソッドをまったく持っていないわけではなくて、いくつかのデフォルトのメソッドを持っています。Hitodeのような、デフォルトのメソッドだけを持つオブジェクトを生成するクラスを定義し

たいときは、その中のブロックとして、何の動作もしない文を書くのが普通です。Pythonには、「 pass文」( pass statement)と呼ばれる、何の動作もしない文があります。pass

文は、

pass

と書くだけの文です。それでは、ブロックとして pass文を書いたクラス定義をインタラクティブシェルに入力して

みましょう。

>>> class Kurage:... pass...>>> Kurage()<__main__.Kurage object at 0x00C4A310>

8.3 メソッドの定義

8.3.1 メソッドの定義の基礎第 8.1.2項で説明したように、クラスというのは、オブジェクトを生成する鋳型のようなもの

だと考えることができます。オブジェクトの中のメソッドは、クラスという鋳型の中にあるメソッドの鋳型から生成されま

す。ですから、メソッドの鋳型をクラスの中に作ることによって、メソッドを持つオブジェクトを生成するクラスを作ることができます。メソッドの鋳型をクラスの中に作って、識別子をその鋳型に束縛することを、メソッドを「定

義する」(define)と言います。第 3.3節で紹介した関数定義という文は、関数を定義する場合だけではなくて、メソッドを定

義する場合にも使われます。ただし、メソッドを定義したい場合、そのための関数定義は、次の二つの条件を満足する必要があります。

• クラス定義のブロックの中に書かれていなければならない。• 少なくとも 1個の引数を受け取るように書かれていないといけない。

Page 73: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

8.3. メソッドの定義 73

メソッドは、少なくとも 1個の引数を受け取ります。ですから、それを定義する関数定義には、少なくとも 1個の仮引数を書く必要があります。文法的には、仮引数としてどんな識別子を使ってもかまわないわけですが、メソッドの 1個目の仮引数としては、 selfという識別子を使うことになっています。それでは、メソッドを定義する関数定義を持つクラス定義を、インタラクティブシェルに入力

してみましょう。

>>> class Namako:... def what(self):... print(’namako’)...

このクラス定義によって定義された Namakoというクラスは、メソッドを生成する whatという鋳型を持っています。ですから、Namakoから生成されたオブジェクトは、whatから生成されたメソッドを持つことになります。今後は、「○○というメソッドの鋳型から生成されたメソッド」のことを、誤解のおそれのな

い限り、ただ単に「○○」と呼ぶことにしたいと思います。

8.3.2 メソッドの呼び出しメソッドが受け取る 1個目の引数は、メソッドに暗黙的に渡されます。ですから、先ほど定義

した、Namakoクラスのオブジェクトが持っている whatというメソッドを呼び出す場合、明示的に引数を渡す必要はありません。第 2.3.5項で説明したように、メソッドを求めたいときは、

式.メソッド名

という形の式を書きます。この形の式を評価すると、ドットの左側の式を評価することによって得られたオブジェクトが持っている、メソッド名で指定されたメソッドが、その値として得られます。ですから、nという変数が Namakoクラスのオブジェクトに束縛されているとすると、

n.what

という式を評価することによって、 nが持っている whatというメソッドを求めることができます。呼び出し可能オブジェクトは、それを求める式の右側に丸括弧を書くことによって呼び出すことができるわけですから、

n.what()

という式を評価することによって、 nが持っている whatを呼び出すことができます。それでは、Namakoクラスからオブジェクトを生成して、それが持っている whatというメソッ

ドを呼び出してみましょう。

>>> n = Namako()>>> n.what()namako

8.3.3 メソッドが受け取る 1個目の引数すべてのメソッドは、暗黙的に 1個目の引数を受け取ります。その引数というのは、そのメソッ

ドを持っているオブジェクト自身です。第 8.3.1項で、メソッドの 1個目の仮引数としては self

という識別子を使うことになっていると説明しましたが、 selfという識別子を使う理由は、それがオブジェクト自身に束縛されることになるからです。それでは、オブジェクト自身を戻り値として返すメソッドを持つオブジェクトを生成するクラ

スを定義してみましょう。

>>> class Umiushi:... def get_self(self):... return self...>>> u = Umiushi()>>> u<__main__.Umiushi object at 0x00C4FB30>>>> u.get_self()<__main__.Umiushi object at 0x00C4FB30>

Page 74: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

74 第 8章 クラス

8.3.4 2個以上の引数を受け取るメソッドメソッドを定義する関数定義が 2個以上の仮引数を持っている場合、2個目以降の仮引数は、

明示的に渡された引数に束縛されます。

>>> class Hamaguri:... def add_hamaguri(self, s):... return s + ’hamaguri’...>>> h = Hamaguri()>>> h.add_hamaguri(’hoge’)’hogehamaguri’

8.3.5 属性個々のオブジェクトは、「属性」(attribute)と呼ばれる識別子を持つことができます。属性と

いうのは、個々のオブジェクトに専属の識別子だと考えることができます。「個々のオブジェクトに専属」というのは、識別子がオブジェクトに束縛されるという関係が、個々のオブジェクトごとに別々だということです。たとえば、Aと Bという二つのオブジェクトがあって、そのどちらも sizeという属性を持っ

ているとしましょう。この場合、Aの sizeを 53に束縛して、Bの sizeを 78に束縛するというように、それぞれの属性を別のオブジェクトに束縛することができます。プログラムの中で属性を扱いたいときは、

式.属性

という形のものを書きます。この形のものは、式の値として得られたオブジェクトが持っている属性を指定する記述です。この形のものを式として評価すると、属性が束縛されているオブジェクトが値として得られます。代入文のイコールの左側に、属性を指定する記述を書くことによって、属性をオブジェクトに

束縛することができます。

>>> class Namekuji:... pass...>>> n1 = Namekuji()>>> n2 = Namekuji()>>> n1.size = 37>>> n2.size = 84>>> n1.size37>>> n2.size84

メソッドの中でも、 selfを使うことによって、属性を扱うことができます。

>>> class Sazae:... def get_size(self):... return self.size...>>> s1 = Sazae()>>> s2 = Sazae()>>> s1.size = 48>>> s2.size = 73>>> s1.get_size()48>>> s2.get_size()73

8.3.6 オブジェクトの初期化クラスからオブジェクトが生成されるときに、そのオブジェクトが自動的に初期化されるよ

うにしたい、ということがしばしばあります。Pythonでは、「初期化メソッド」(initializationmethod)と呼ばれる特殊なメソッドを定義しておくことによって、オブジェクトの初期化を自動化することができます。初期化メソッドというのは、__init__という識別子が束縛されているメソッドのことです。こ

の識別子をメソッドに束縛しておくと、そのメソッドは、クラスからオブジェクトが生成される

Page 75: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

8.3. メソッドの定義 75

ときに自動的に呼び出されます。ですから、オブジェクトの初期化に必要な動作をするように初期化メソッドを定義しておけば、オブジェクトの初期化が自動的に実行されるようになります。

>>> class Fujitsubo:... def __init__(self):... self.size = 67...>>> f = Fujitsubo()>>> f.size67

__init__は、戻り値としてNoneを返すように定義する必要があります。ですから、__init__の定義の中に return文を書く必要はありません(第 3.6.2項で説明したように、return文を実行しないで終了した関数は Noneを返すわけですが、これはメソッドも同じです)。ちなみに、None以外の戻り値を返す__init__を定義すると、オブジェクトを生成したときに

エラーになります。

>>> class Hoya:... def __init__(self):... return 35...>>> h = Hoya()Traceback (most recent call last):File "<stdin>", line 1, in <module>

TypeError: __init__() should return None, not ’int’

クラスに引数を渡すと、それらの引数は__init__に渡されます。

>>> class Kamenote:... def __init__(self, size):... self.size = size...>>> k = Kamenote(48)>>> k.size48

次のプログラムの中で定義されている Saifuというクラスは、財布をシミュレートするオブジェクトを生成します。Saifuクラスは、財布に入れるお金の金額を引数として受け取ります。財布の中のお金は、

dashiireというメソッドを呼び出すことによって出し入れすることができます。dashiireに渡す引数は、出し入れするお金の金額です。プラスの金額を渡すと財布の中のお金が増えて、マイナスの金額を渡すとお金が減ります。

プログラムの例 saifu.py

class Saifu:def __init__(self, kingaku):

self.kingaku = kingakudef dashiire(self, kingaku):

self.kingaku += kingaku

実行例>>> from saifu import *>>> s = Saifu(3000)>>> s.kingaku3000>>> s.dashiire(800)>>> s.kingaku3800>>> s.dashiire(-1200)>>> s.kingaku2600

Page 76: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

76 第 8章 クラス

8.4 派生クラス

8.4.1 基底クラスと派生クラス第 8.1.2項で説明したように、クラスというのはオブジェクトを生成する鋳型のようなもので

す。しかし、鋳型のようなものというのは、クラスというものの側面のひとつにすぎません。クラスには、もうひとつの別の側面があります。それは、「分類体系の部品」という側面です。さまざまなクラスの全体は、生物などの分類体系と同じように、木の形をした構造を持ってい

ます。この木は、本物の木とは上と下とが逆になっていて、いちばん上に根があって、下に向かって枝が伸びています。木を構成するそれぞれのクラスは、上にあるものほど一般的で、下にあるものほど特殊です。Pythonでは、すでに存在するクラスを特殊化することによって新しいクラスを作るというこ

とができます。クラスを特殊化するというのは、メソッドを追加するということです。Bというクラスが、Aというクラスを特殊化することによって作られたものだとするとき、A

は、Bの「基底クラス」(base class)と呼ばれ、Bは、Aの「派生クラス」(derived class)と呼ばれます。

8.4.2 派生クラスの定義すでに存在するクラスを特殊化した新しいクラスを定義したいとき、つまり、派生クラスを定

義したいときは、

class 識別子 (基底クラス名):

ブロック

という形のクラス定義を書きます。そうすると、「基底クラス名」のところに書いた識別子が束縛されているクラスを特殊化した派生クラスが定義されます。

8.4.3 継承オブジェクト指向をサポートするプログラミング言語の大多数は、基底クラスが持っている変

数やメソッドの鋳型が派生クラスに自動的に受け継がれるという機能を持っていて、そのような機能は「継承」(inheritance)と呼ばれます。そして、継承によって変数やメソッドの鋳型を受け継ぐことを、変数やメソッドの鋳型を「継承する」(inherit)と言います。Pythonも、継承という機能を備えているプログラミング言語のひとつです。次のプログラムの中で定義されている Ningenは、人間をあらわすオブジェクトを生成するク

ラスです。そして、Rikishiは、Ningenクラスの派生クラスで、力士をあらわすオブジェクトを生成します。

プログラムの例 rikishi.py

class Ningen:def set_namae(self, namae):

self.namae = namae

class Rikishi(Ningen):def set_shikona(self, shikona):

self.shikona = shikona

実行例>>> from rikishi import *>>> r = Rikishi()>>> r.set_namae(’Yamanaka’)>>> r.namae’Yamanaka’>>> r.set_shikona(’Hogenoumi’)>>> r.shikona’Hogenoumi’

このように、Rikishiクラスのオブジェクトは、Ningenクラスから継承した set_namaeというメソッドと、 Rikishiクラスで定義した set_shikonaというメソッドを持っています。

Page 77: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

8.4. 派生クラス 77

8.4.4 オーバーライド新しいクラスを定義するとき、新しいメソッドを追加するだけではなくて、基底クラスで定義

されているメソッドの動作を変更したい、ということがしばしばあります。基底クラスのメソッドの動作を派生クラスで変更したいときは、基底クラスで定義されているメソッドと同じ名前のメソッドを派生クラスで定義します。このことを、基底クラスのメソッドを「オーバーライドする」(override)と言います。次のプログラムは、まず Sakanaというクラスを定義して、次に、 Maguroというクラスを、

Sakanaを基底クラスとする派生クラスとして定義しています。 Maguroクラスは、 Sakanaクラスで定義されている whatというメソッドの動作を、それをオーバーライドすることによって変更しています。

プログラムの例 maguro.py

class Sakana:def what(self):

return ’sakana’

class Maguro(Sakana):def what(self):

return ’maguro’

実行例>>> from maguro import *>>> s = Sakana()>>> s.what()’sakana’>>> m = Maguro()>>> m.what()’maguro’

8.4.5 オーバーライドされたメソッドの呼び出しオーバーライドされた基底クラスのメソッドは、派生クラスのメソッドによって隠されること

になりますが、派生クラスのメソッドの中から呼び出すことは可能です。オーバーライドされた基底クラスのメソッドを派生クラスのメソッドから呼び出したいときは、

superという組み込み関数を使います。派生クラスのメソッドを定義する関数定義の中で super

を呼び出すと、 superは、基底クラスのメソッドを持つオブジェクトを戻り値として返します。ですから、whatという名前のメソッドが派生クラスの whatによってオーバーライドされているとするとき、派生クラスのメソッドを定義する関数定義の中に、

super().what()

と書くと、基底クラスの whatが呼び出されることになります。次のプログラムは、まず Konchuuというクラスを定義して、次に、 Tonboというクラスを、

Konchuuを基底クラスとする派生クラスとして定義しています。Tonboクラスは、Konchuuクラスで定義されている whatというメソッドの動作を、それをオーバーライドすることによって変更しています。Tonboクラスの whatは、オーバーライドによって隠されている基底クラスの whatを、super

を使うことによって呼び出しています。

プログラムの例 tonbo.py

class Konchuu:def what(self):

return ’konchuu’

class Tonbo(Konchuu):def what(self):

return super().what() + ’/tonbo’

実行例>>> from tonbo import *>>> t = Tonbo()

Page 78: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

78 第 9章 例外

>>> t.what()’konchuu/tonbo’

初期化メソッドというのは__init__という識別子が束縛されているメソッドのことですから、派生クラスと基底クラスの両方で初期化メソッドを定義すると、派生クラスの初期化メソッドは基底クラスの初期化メソッドをオーバーライドすることになります。しかし、そのような場合でも、superを使えば、派生クラスの初期化メソッドから基底クラスの初期化メソッドを呼び出すことができます。次のプログラムは、まず Ningenというクラスを定義して、次に、それを基底クラスとする派

生クラスとして Rikishiというクラスを定義しています。Ningenクラスの初期化メソッドは Rikishiクラスの初期化メソッドによってオーバーライド

されていますが、Rikishiクラスの初期化メソッドは、namaeという属性を初期化するために、superを使って Ningenクラスの初期化メソッドを呼び出しています。

プログラムの例 rikishi2.py

class Ningen:def __init__(self, namae):

self.namae = namae

class Rikishi(Ningen):def __init__(self, namae, shikona):

super().__init__(namae)self.shikona = shikona

実行例>>> from rikishi2 import *>>> r = Rikishi(’Yamanaka’, ’Hogenoumi’)>>> r.namae’Yamanaka’>>> r.shikona’Hogenoumi’

第9章 例外

9.1 例外の基礎

9.1.1 例外とは何かPytionの処理系は、プログラムの解釈中や実行中に不都合な事象が起きた場合、「例外」(ex-

ception)と呼ばれるオブジェクトを発生 (raise)させます。たとえば、/または //という演算子によってあらわされる除算という動作を実行したとき、右

側の数値(割る数)が 0だった場合、処理系は例外を発生させます。例外は、「例外クラス」(exception class)と呼ばれるクラスから生成されるオブジェクトです。

例外クラスは、ユーザーが定義することもできますが、Pythonの処理系にも、さまざまな例外クラスが組み込まれています。処理系に組み込まれている例外クラスは、「組み込み例外型」(built-inexception type)と呼ばれます。たとえば、0による除算を実行した場合に処理系が発生させる例外は、 ZeroDivisionError

という組み込み例外型から生成されます。演算子や関数の多くは、処理の対象が特定のクラスのデータに限定されています。処理の対象

ではないクラスのデータが演算子や関数に与えられた場合、処理系は TypeErrorというクラスの例外を発生させます。

9.1.2 例外による関数の終了処理系が例外を発生させると、その例外は、原則的には実行中の関数をすべて終了させます。それでは、次のプログラムを使って、例外は実行中の関数を終了させるということを確認して

みましょう。

プログラムの例 exception.py

Page 79: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

9.2. 例外の捕獲 79

def func3(a, b):print(’beginning of func3’)print(a//b)print(’ending of func3’)

def func2(a, b):print(’beginning of func2’)func3(a, b)print(’ending of func2’)

def func1(a, b):print(’beginning of func1’)func2(a, b)print(’ending of func1’)

このプログラムは、func1、func2、func3という三つの関数から構成されています。func1

は func2を呼び出して、func2は func3を呼び出します。func3は、その中で除算を実行しますので、そこで例外が発生する可能性があります。このプログラムの func1を、2回、呼び出してみましょう。1回目は例外が発生しない引数を、

2回目は例外が発生する引数を与えます。

実行例>>> from exception import *>>> func1(20, 3)beginning of func1beginning of func2beginning of func36ending of func3ending of func2ending of func1>>> func1(20, 0)beginning of func1beginning of func2beginning of func3Traceback (most recent call last):File "<stdin>", line 1, in <module>File ".\exception.py", line 18, in func1func2(a, b)

File ".\exception.py", line 13, in func2func3(a, b)

File ".\exception.py", line 8, in func3print(a//b)

ZeroDivisionError: integer division or modulo by zero>>>

このように、例外が発生した場合は、func3も func2も func1も、その時点で実行が中断されるということが分かります。

9.2 例外の捕獲

9.2.1 例外処理第 9.1.2項で説明したように、例外が発生すると、原則的には実行中のすべての関数が終了さ

せられるのですが、場合によっては、ただ単に終了するのではなくて、発生した例外に対応した何らかの処理を実行したいということもあります。そのような、例外が発生した場合に実行される処理は、「例外処理」(exception processing)と呼ばれます。

9.2.2 try文例外処理を実行するためには、発生した例外を「捕獲する」(catch)ということが必要になりま

す。「捕獲する」というのは、関数を終了させるという例外の動作を停止させるということです。例外を捕獲するためには、「 try文」( try statement)と呼ばれる文を書く必要があります。try文は、基本的には、

Page 80: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

80 第 9章 例外

try:

ブロック1

except 例外クラス名:

ブロック2

と書きます。この中の「例外クラス名」のところには、捕獲したい例外のクラス名を書きます。この形の try文を実行すると、まずブロック1が実行されます。その実行中に例外が発生しな

かった場合、ブロック2 は実行されないで、 try文の実行は終了します。もしも、ブロック1 の実行中に例外が発生して、その例外のクラスが、 exceptの右側に書か

れたものだった場合、その例外は捕獲されて、例外処理としてブロック2 が実行されます。次のプログラムの中で定義されている divideという関数は、1個目の引数を 2個目の引数で

除算して、その商を戻り値として返します。ただし、 ZeroDivisionErrorというクラスの例外が発生した場合は dividion by zeroという文字列を戻り値として返します。

プログラムの例 divide.py

def divide(a, b):try:

return a//bexcept ZeroDivisionError:

return ’division by zero’

実行例>>> from divide import *>>> divide(20, 3)6>>> divide(20, 0)’division by zero’

9.2.3 複数の except節

try文の中にある、

except 例外クラス名:

ブロック

という部分は、「 except節」( except clause)と呼ばれます。except節は、1個の try文の中に何個でも書くことができます。それぞれの except節は、異

なる例外クラスを指定することができますので、発生した例外のクラスごとに、異なる例外処理を実行することができます。次のプログラムの中で定義されている divideという関数は、1個目の引数を 2個目の引数で

除算して、その商を戻り値として返します。ただし、 ZeroDivisionErrorというクラスの例外が発生した場合は dividion by zeroという文字列を、 TypeErrorというクラスの例外が発生した場合は unsupported typeという文字列を戻り値として返します。

プログラムの例 divide2.py

def divide(a, b):try:

return a//bexcept ZeroDivisionError:

return ’division by zero’except TypeError:

return ’unsupported type’

実行例>>> from divide2 import *>>> divide(20, 3)6>>> divide(20, 0)’division by zero’>>> divide(20, ’3’)’unsupported type’

Page 81: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

9.2. 例外の捕獲 81

9.2.4 例外クラスの階層派生クラスというのは、基底クラスを特殊化することによって作られたクラスのことです。つ

まり、派生クラスというのは基底クラスの一種だということです。したがって、except節の中に名前を書くことによって指定される例外クラスは、その名前を持つクラスだけではありません。それを特殊化したすべての派生クラスも、指定されたことになります。組み込み例外型のほとんどは、 Exceptionというクラスを特殊化することによって作られて

います。ですから、 except節で Exceptonを指定すると、ほとんどの例外を一網打尽にすることができます。次のプログラムの中で定義されている divideという関数は、1個目の引数を 2個目の引数で

除算して、その商を戻り値として返します。ただし、Exceptionというクラスの例外が発生した場合は exception is raisedという文字列を戻り値として返します。

プログラムの例 divide3.py

def divide(a, b):try:

return a//bexcept Exception:

return ’exception is raised’

実行例>>> from divide3 import *>>> divide(20, 3)6>>> divide(20, 0)’exception is raised’>>> divide(20, ’3’)’exception is raised’

9.2.5 finally節

try文の末尾には、「 finally節」( finally clause)と呼ばれるものを 1個だけ書くことができます。finally節は、

finally:

ブロック

と書きます。finally節の中のブロックは、例外が発生した場合も、例外が発生しなかった場合も、かなら

ず実行されます。ですから、例外が発生したかどうかにかかわらず、かならず実行されないといけない後始末などの処理は、 finally節の中に書いておくといいでしょう。次のプログラムの中で定義されている divideという関数は、1個目の引数を 2個目の引数で

除算して、その商を戻り値として返します。ただし、 ZeroDivisionErrorというクラスの例外が発生した場合は dividion by zeroという文字列を戻り値として返します。そして、例外が発生した場合も、発生しなかった場合も、 finally clauseという文字列を出力します。

プログラムの例 divide4.py

def divide(a, b):try:

return a//bexcept ZeroDivisionError:

return ’division by zero’finally:

print(’finally clause’)

実行例>>> from divide4 import *>>> divide(20, 3)finally clause6>>> divide(20, 0)

Page 82: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

82 第 9章 例外

finally clause’division by zero’

9.2.6 捕獲した例外に識別子を束縛する except節

except節は、捕獲した例外に識別子を束縛する、ということも可能です。そうすることによって、捕獲した例外を使って何らかの処理を実行する、ということができるようになります。捕獲した例外に識別子を束縛したいときは、

except 例外クラス名 as 識別子:

ブロック

という形の except節を書きます。そうすると、この中の「識別子」のところに書かれた識別子が、捕獲した例外に束縛されます。

9.2.7 例外の属性例外は、 argsという属性を持っていて、この属性はタプルに束縛されています。このタプル

の 0番目の要素は、通常、例外が発生した原因に関するメッセージです。次のプログラムの中で定義されている divideという関数は、1個目の引数を 2個目の引数で

除算して、その商を戻り値として返します。ただし、Exceptionというクラスの例外が発生した場合は、捕獲した例外の argsが束縛されているタプルを戻り値として返します。

プログラムの例 divide5.py

def divide(a, b):try:

return a//bexcept Exception as e:

return e.args

実行例>>> from divide5 import *>>> divide(20, 3)6>>> divide(20, 0)(’integer division or modulo by zero’,)>>> divide(20, ’3’)("unsupported operand type(s) for //: ’int’ and ’str’",)

9.3 例外の発生

9.3.1 生成と発生の違い第 9.1.1項で説明したように、「例外」というのは、「例外クラス」と呼ばれるクラスから生成

されたオブジェクトのことです。したがって、「例外を生成する」というのは、「例外クラスからオブジェクトを生成する」ということを意味しています。それでは、「例外を発生させる」ということと、「例外を生成する」ということは、何が違うの

でしょうか処理系が例外を発生させると、それを捕獲しない関数は終了するわけですが、例外というのは、

ただ単に生成されただけでは関数を終了させません。例外に関数を終了させるためには、関数を終了させるという、それが持っている動作を実行させる必要があるのです。したがって、「例外を発生させる」というのは、「例外クラスからオブジェクトを生成して、さ

らに、関数を終了させるという、それが持っている動作を実行させる」ということを意味しています。

9.3.2 例外の生成例外クラスは、任意の個数の引数を受け取ります。生成された例外が持っている argsは、そ

れらの引数から構成されるタプルに束縛されます。

Page 83: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

9.3. 例外の発生 83

9.3.3 raise文例外を発生させたいときは、「 raise文」と呼ばれる文を実行します。raise文は、

raise 式

と書きます。この中の「式」のところには、値として例外が得られる式を書きます。第 5.4.4項で、階乗を求める関数の定義を紹介しましたが、そのときに紹介した定義は、もしも

引数としてマイナスの整数を受け取った場合は、 return文を実行しないで終了することによって、戻り値として Noneを返す、というものでした。次のプログラムは、階乗を求める関数の定義を、引数がマイナスだった場合は ArithmeticError

という組み込み例外型の例外を発生させるように改良したものです。

プログラムの例 factorial2.py

def factorial(n):if n == 0:

return 1elif n >= 1:

return n * factorial(n-1)else:

raise ArithmeticError(’undefined for negative’)

実行例>>> from factorial2 import *>>> factorial(5)120>>> factorial(-5)Traceback (most recent call last):File "<stdin>", line 1, in <module>File ".\factorial2.py", line 7, in factorialraise ArithmeticError(’undefined for negative’)

ArithmeticError: undefined for negative

このプログラムで使われている ArithmeticErrorという組み込み例外型は、Exceptionの派生クラスです。 ZeroDivisionErrorは、このクラスの派生クラスのひとつです。

9.3.4 独自の例外クラスの定義例外クラスは、プログラムを書く人が独自のものを自由に作ることができます。既存の例外ク

ラス(たとえば組み込み例外型)の派生クラスを定義すると、それは独自の例外クラスになります。次のプログラムは、階乗を求める関数の定義を、引数がマイナスだった場合は FactorialError

という独自の例外を発生させるように改良したものです。

プログラムの例 factorial3.py

class FactorialError(ArithmeticError):pass

def factorial(n):if n == 0:

return 1elif n >= 1:

return n * factorial(n-1)else:

raise FactorialError(’undefined for negative’)

実行例>>> from factorial3 import *>>> factorial(5)120>>> factorial(-5)Traceback (most recent call last):File "<stdin>", line 1, in <module>

Page 84: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

84 第 10章 ファイル

File ".\factorial3.py", line 10, in factorialraise FactorialError(’undefined for negative’)

factorial3.FactorialError: undefined for negative

第10章 ファイル

10.1 オープンとクローズ

10.1.1 オープンとクローズの基礎この章では、ファイルに対する操作を実行するプログラムについて説明したいと思います。ファイルからデータを読み込んだり、ファイルにデータを書き込んだりするためには、それに

先立って、そのための準備をする必要があります。ファイルに対する読み書きのための準備をすることを、ファイルを「オープンする」(open)と言います。ファイルに対して読み書きを実行したときは、それが終わったのち、その後始末をする必要

があります。ファイルに対する読み書きが終わったのちにその後始末をすることを、ファイルを「クローズする」(close)と言います。

10.1.2 ファイルをオープンする組み込み関数ファイルは、openという組み込み関数を呼び出すことによってオープンすることができます。openは、1個目の引数として、オープンするファイルのパス名を受け取って、2個目の引数と

して、ファイルのオープンモードを指定する文字列を受け取ります。ファイルの「オープンモード」(open mode)というのは、どのような処理を実行するために

ファイルをオープンするのかということです。オープンモードは、次のような文字を組み合わせることによってできる文字列で指定します。

r 読み込みのためにオープンする。w 書き込みのためにオープンする。ファイルが存在しない場合は、空のファイルを作成する。すでにファイルが存在する場合は、そのファイルを空にする。

a 書き込みのためにオープンする。ファイルが存在しない場合は、空のファイルを作成する。すでにファイルが存在する場合は、その末尾にデータを追加する。

t テキストモードでオープンする(デフォルト)。b バイナリーモードでオープンする。

たとえば、wbは、書き込みのためにバイナリーモードでオープンするという意味になります。tは省略することができますので、 wは、書き込みのためにテキストモードでオープンするという意味になります。2個目の引数は、デフォルトが rtです。したがって、読み込みのためにテキストモードでオー

プンする場合、2個目の引数を渡す必要はありません。openは、戻り値として、「ファイルオブジェクト」(file object)と呼ばれるオブジェクトを返

します。ファイルに対する読み込みや書き込みは、このオブジェクトが持っているメソッドを呼び出すことによって実行されます。

10.1.3 ファイルをクローズする組み込み関数ファイルは、ファイルオブジェクトが持っている closeというメソッドを呼び出すことによっ

てクローズすることができます。closeには、引数を渡す必要はありません。

10.1.4 ストリーム位置ファイルに対する読み書きは、「ストリーム位置」(stream position)と呼ばれる位置に対して

実行されます。rでファイルをオープンした場合、オープンした直後のストリーム位置は、ファイルの先頭です。wでファイルをオープンした場合も、ファイルは空になっているわけですから、最初のストリー

ム位置はファイルの先頭です。それに対して、すでに存在するファイルを aでオープンした場合、最初のストリーム位置はファイルの末尾になります。

Page 85: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10.2. ファイルからの読み込み 85

データの読み書きをするメソッドは、ストリーム位置に対して読み書きを実行して、そののち、次に読み書きを実行するべき位置へストリーム位置を移動させます。ファイルの末尾というストリーム位置は、「ファイルの終わり」(end of file)と呼ばれます。

10.2 ファイルからの読み込み

10.2.1 ファイルからデータを読み込むメソッドファイルオブジェクトは、 readというメソッドを持っています。このメソッドは、引数を何

も渡さないで呼び出すと、ストリーム位置からファイルの終わりまでのデータをファイルから読み込んで、読み込んだデータを文字列として返します。次のプログラムの中で定義されている read_fileという関数は、パス名を受け取って、それに

よって指定されるテキストファイルの内容を出力します。

プログラムの例 readfile.py

def read_file(filename):f = open(filename)print(f.read(), end=’’)f.close()

テキストファイルの例 puellae.txt

Kaname MadokaAkemi HomuraMiki SayakaTomoe Mami

実行例>>> from readfile import *>>> read_file(’puellae.txt’)Kaname MadokaAkemi HomuraMiki SayakaTomoe Mami

引数としてプラスの整数 nを渡して readを呼び出すと、readは、nバイトのデータを読み込んで、ストリーム位置を nバイト先へ移動させて、読み込んだデータを文字列として返します。readは、ストリーム位置がファイルの終わりだった場合、空文字列を戻り値として返します。次のプログラムの中で定義されている space_to_dotという関数は、パス名を受け取って、そ

れによって指定されるテキストファイルの内容に含まれているすべての空白をドットに変換した結果を出力します。

プログラムの例 space2dot.py

def space_to_dot(filename):f = open(filename)eof = Falsewhile not eof:

c = f.read(1)if c == ’’:

eof = Trueelse:

if c != ’ ’:print(c, end=’’)

else:print(’.’, end=’’)

f.close()

実行例>>> from space2dot import *>>> space_to_dot(’puellae.txt’)Kaname.MadokaAkemi.Homura

Page 86: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

86 第 10章 ファイル

Miki.SayakaTomoe.Mami

練習問題 10.1 filenameをパス名とするとき、 insert_space(filename)という式で呼び出すと、 filenameによって指定されるテキストファイルの内容を、それぞれの文字(ただしキャリッジリターン (\r)と改行 (\n)は除く)の後ろに 1個の空白を挿入して出力する関数を定義してください。

実行例>>> from insertspace import *>>> insert_space(’puellae.txt’)K a n a m e M a d o k aA k e m i H o m u r aM i k i S a y a k aT o m o e M a m i

10.2.2 読み込んだデータをリストにして返すメソッドファイルオブジェクトは、readlinesというメソッドを持っています。このメソッドは、スト

リーム位置からファイルの終わりまでのデータをファイルから読み込んで、読み込んだデータを、それぞれの行(改行を含む)から構成されるリストにして返します。次のプログラムの中で定義されている linecountという関数は、パス名を受け取って、それに

よって指定されるテキストファイルの内容の行数を出力します。

プログラムの例 linecount.py

def linecount(filename):f = open(filename)lines = f.readlines()print(’行数は’ + str(len(lines)) + ’です。’)f.close()

実行例>>> from linecount import *>>> linecount(’puellae.txt’)行数は 4です。

練習問題 10.2 filenameをパス名とするとき、 reverse_line(filename)という式で呼び出すと、filenameによって指定されるテキストファイルの内容を、最後の行から最初の行へ、という順序で出力する関数を定義してください。

実行例>>> from reverseline import *>>> reverse_line(’puellae.txt’)Tomoe MamiMiki SayakaAkemi HomuraKaname Madoka

10.2.3 文字列の末尾にある改行を削除するメソッド

readlinesが返す文字列は、その末尾に改行を含んでいます。文字列の末尾にある改行は、そのあとの処理の邪魔になる場合があります。文字列が持っている rstripというメソッドは、文字列の末尾にある改行を削除したいという

ときに役に立ちます。rstripは、引数として文字列を受け取ります。引数は、文字列の末尾にある、削除したい部

分文字列を指定するものです。ただし、部分文字列として指定されるのは、引数それ自体ではなくて、引数を構成している文字のみから構成される任意の文字列です。たとえば、 abcという文字列を引数として渡したとすると、 a、 ba、 ccb、 bacb、 caba、

bbccacなどのさまざまな部分文字列が、削除の対象として指定されることになります。

>>> ’7438caba6205bbccac’.rstrip(’abc’)

Page 87: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10.2. ファイルからの読み込み 87

’7438caba6205’

文字列の末尾にある改行は、\r\nという文字列を引数として rstripに渡すことによって削除することができます。次のプログラムの中で定義されている bracketという関数は、パス名を受け取って、それに

よって指定されるテキストファイルの内容を、それぞれの行を角括弧で囲んで出力します。

プログラムの例 bracket.py

def bracket(filename):f = open(filename)lines = f.readlines()for line in lines:

print(’[’ + line.rstrip(’\r\n’) + ’]’)f.close()

実行例>>> from bracket import *>>> bracket(’puellae.txt’)[Kaname Madoka][Akemi Homura][Miki Sayaka][Tomoe Mami]

練習問題 10.3 filenameをパス名とするとき、 reverse_char(filename)という式で呼び出すと、 filenameによって指定されるテキストファイルを構成しているそれぞれの行について、それを構成しているそれぞれの文字を、末尾の文字から先頭の文字へ、という順序で出力する関数を定義してください。

実行例>>> from reversechar import *>>> reverse_char(’puellae.txt’)akodaM emanaKarumoH imekAakayaS ikiMimaM eomoT

10.2.4 データを 1行だけ読み込むメソッドファイルオブジェクトは、 readlineというメソッドを持っています。このメソッドは、スト

リーム位置から行末までのデータをファイルから読み込んで、ストリーム位置を次の行の先頭へ移動させて、読み込んだデータ(改行を含む)を文字列として返します。readlineは、 readと同じように、ストリーム位置がファイルの終わりだった場合、空文字

列を戻り値として返します。次のプログラムの中で定義されている quoteという関数は、パス名を受け取って、それによっ

て指定されるテキストファイルの内容を構成しているそれぞれの行の先頭に大なり ( > )と空白を挿入した結果を出力します。

プログラムの例 quote.py

def quote(filename):f = open(filename)eof = Falsewhile not eof:

line = f.readline()if line == ’’:

eof = Trueelse:

print(’> ’ + line, end=’’)f.close()

実行例>>> from quote import *>>> quote(’puellae.txt’)

Page 88: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

88 第 10章 ファイル

> Kaname Madoka> Akemi Homura> Miki Sayaka> Tomoe Mami

10.2.5 for文による読み込みの繰り返しファイルオブジェクトは、繰り返し可能オブジェクトです。ということは、for文を使うこと

によって、それに対する繰り返しを実行することができるということです。for文を使ってファイルオブジェクトに対する繰り返しを実行すると、繰り返しのたびに、ファ

イルオブジェクトから 1個の行が読み込まれて、識別子がそれに束縛されます。次のプログラムの中で定義されている line_numberという関数は、パス名を受け取って、そ

れによって指定されるテキストファイルの内容を構成しているそれぞれの行の先頭に行番号を挿入した結果を出力します。

プログラムの例 linenumber.py

def line_number(filename):n = 0f = open(filename)for line in f:

n += 1print(str(n) + ’: ’ + line, end=’’)

f.close()

実行例>>> from linenumber import *>>> line_number(’puellae.txt’)1: Kaname Madoka2: Akemi Homura3: Miki Sayaka4: Tomoe Mami

練習問題 10.4 filenameをパス名、 sを文字列とするとき、 find_line(filename, s)という式で呼び出すと、 filenameによって指定されるテキストファイルの内容のうちで、 sを部分文字列として含む行のみを出力する関数を定義してください。

実行例>>> from findline import *>>> find_line(’puellae.txt’, ’om’)Akemi HomuraTomoe Mami

10.3 ファイルへの書き込み

10.3.1 ファイルにデータを書き込むメソッドファイルオブジェクトは、writeというメソッドを持っています。このメソッドは、引数とし

て受け取った文字列をストリーム位置に書き込んで、ストリーム位置をその直後へ移動させます。次のプログラムの中で定義されている write_fileという関数は、1個目の引数としてパス名、

2個目の引数として文字列を受け取って、そのパス名で指定されたテキストファイルに、その文字列と改行を書き込みます。

プログラムの例 writefile.py

def write_file(filename, s):f = open(filename, ’w’)f.write(s + ’\n’)f.close()

実行例>>> from writefile import *>>> write_file(’shell.txt’, ’Kusanagi Motoko’)

Page 89: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10.4. モジュール 89

書き込んだファイル shell.txt

Kusanagi Motoko

10.3.2 printによるファイルへの書き込みファイルオブジェクトが持っているメソッドではなくて、printを使うことによって文字列を

ファイルへ書き込むことも可能です。printを使ってファイルに文字列を書き込みたいときは、そのファイルをオープンすることに

よって得られたファイルオブジェクトを、 fileというキーワード引数で printに渡します。次のプログラムの中で定義されている print_fileという関数は、1個目の引数としてパス名、

2個目の引数として文字列を受け取って、そのパス名で指定されたテキストファイルに、その文字列と改行を書き込みます。

プログラムの例 printfile.py

def print_file(filename, s):f = open(filename, ’w’)print(s, file=f)f.close()

実行例>>> from printfile import *>>> print_file(’eden.txt’, ’Morimi Saki’)

書き込んだファイル eden.txt

Morimi Saki

練習問題 10.5 filenameをパス名、 nをプラスの整数とするとき、

print_divisor(filename, n)

という式で呼び出すと、filenameによって指定されるテキストファイルに、nのすべての約数を出力する関数を定義してください。なお、それぞれの約数の後ろに 1個の空白を出力して、すべての約数を出力したのちに 1個の改行を出力するようにしてください。

実行例>>> from printdivisor import *>>> print_divisor(’divisor.txt’, 96)

書き込んだファイル divisor.txt

1 2 3 4 6 8 12 16 24 32 48 96

10.4 モジュール

10.4.1 モジュールの基礎処理系の中に取り込んで使うことのできる、処理系の外部にある機能は、「ライブラリー」

(library) と呼ばれます。そして、処理系とともに配布されるライブラリーは、「標準ライブラリー」(standard library)と呼ばれます。Pythonのライブラリーは、「モジュール」(module)と呼ばれるものから構成されています。処

理系の中にモジュールを取り込むことを、モジュールを「インポートする」(import)と言います。モジュールをインポートしたいときは、次の 2種類の文のうちのどちらかを書きます。

• from文 ( from statement)

• import文 ( import statement)

Page 90: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

90 第 10章 ファイル

10.4.2 from文「 from文」( import statement)と呼ばれる文を書くことによって、モジュールをインポートすることができます。第 1.3.6項で、インタラクティブシェルを使ってファイルに保存されているプログラムをイン

タプリタに実行させたいときは、

from モジュール名 import *

という文をインタラクティブシェルに入力すればいい、と説明しましたが、この文が from文です。つまり、Pythonでは、ファイルに保存されているプログラムというのは、すべてモジュールとして扱われるのです。標準ライブラリーの中にある mathというモジュールは、数学で使われるさまざまな浮動小数

点数や関数を定義しています。たとえば、このモジュールは、 piという識別子を円周率に束縛しています。

>>> from math import *>>> pi3.141592653589793

from文をプログラムの先頭に書いておくと、そのプログラムの中で、from文によってインポートされたものを利用することができるようになります。次のプログラムの中で定義されている areaOfCircleという関数は、円の半径を受け取って、

その円の面積を返します。

プログラムの例 areaofcircle.py

from math import *

def areaOfCircle(radius): return pi * radius * radius

実行例>>> from areaofcircle import *>>> areaOfCircle(5)78.53981633974483

from文の末尾には、これまで、アスタリスク ( * )を書いてきました。このアスタリスクは、モジュールの中で定義されているすべてのオブジェクトをインポートするという意味です。すべてのオブジェクトではなくて、特定のオブジェクトだけをインポートしたいときは、アスタリスクの代わりに、インポートしたいオブジェクトの名前をコンマ ( , )で区切って並べたものを書きます。たとえば、

from math import sin, cos, tan

という from文は、mathの中で定義されているオブジェクトのうちの、sin、cos、tanという三つの関数だけをインポートします。

10.4.3 import文複数のモジュールをインポートすると、しばしば、それぞれのモジュールの中で、同じ識別

子が異なるものに束縛されているために、名前の競合が起きてしまうことがあります。名前の競合は、モジュールを修飾付きでインポートすることによって避けることができます。

モジュールを修飾付きでインポートしたいときは、from文ではなくて、「 import文」( importstatement)と呼ばれる文を書きます。import文は、

import モジュール名

と書きます。そうすると、「モジュール名」のところに書かれた名前のモジュールが修飾付きでインポートされます。モジュールを修飾付きでインポートした場合、そのモジュールの中で定義されたものは、識別

子をモジュール名で修飾した名前を使わなければ指定することができません。名前にモジュール名が含まれるということは、たとえ別のモジュールで同じ識別子が使われていたとしても、名前の競合が起きる心配はないということです。識別子をモジュール名で修飾した名前は、

Page 91: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

10.5. ファイルに対するその他の処理 91

モジュール名 . 識別子

と書きます。たとえば、

import math

という import文で mathをインポートした場合、 piを使うためには、

math.pi

という名前を書く必要があります。

>>> import math>>> math.pi3.141592653589793

10.5 ファイルに対するその他の処理

10.5.1 この節について標準ライブラリーの中にある osというモジュールと os.pathというモジュールは、ファイル

に対する処理を実行するさまざまな関数を定義しています。この節では、それらのモジュールの中で定義されている関数のうちのいくつかを紹介したいと

思います。

10.5.2 osで定義されている関数まず、 osというモジュールの中で定義されている関数のうちのいくつかを紹介しましょう。osの中で定義されている関数としては、次のようなものがあります。

mkdir 引数としてパス名を受け取って、そのパス名で指定されたディレクトリを作成する。rmdir 引数としてパス名を受け取って、そのパス名で指定されたディレクトリを削除する。

ただし、そのディレクトリは空でないといけない。remove 引数としてパス名を受け取って、そのパス名で指定されたファイルを削除する。ディ

レクトリを削除することはできない。rename 引数として 2個のパス名を受け取って、1個目のパス名で指定されたファイルまたは

ディレクトリの名前を 2個目のパス名に変更する。listdir 引数としてパス名を受け取って、そのパス名で指定されたディレクトリの一覧(ディ

レクトリの中にあるものの名前から構成されるリスト)を戻り値として返す。引数を省略した場合は、カレントディレクトリの一覧を返す。

stat 引数としてパス名を受け取って、そのパス名で指定されたファイルまたはディレクトリの情報を持つオブジェクトを返す。戻り値のオブジェクトは、ファイルまたはディレクトリの情報に束縛される次のような属性を持っている。

st_size 大きさ(バイト数)。st_mtime 最終アクセス時刻。単位は秒、クラスは float。st_mtime_ns 最終アクセス時刻。単位はミリ秒、クラスは int。st_mtime 最終更新時刻。単位は秒、クラスは float。st_mtime_ns 最終更新時刻。単位はミリ秒、クラスは int。

utime 引数としてパス名を受け取って、そのパス名で指定されたファイルに対して、最終アクセス時刻と最終更新時刻を設定する。最終アクセス時刻と最終更新時刻は、times

または nsというキーワード引数で、

(最終アクセス時刻, 最終更新時刻)

というタプルの形で渡す。単位が秒の場合は times、単位がミリ秒の場合は nsを使う。どちらのキーワード引数でも時刻が渡されなかった場合は現在の時刻を設定する。

10.5.3 os.pathで定義されている関数次に、os.pathというモジュールの中で定義されている関数のうちのいくつかを紹介しましょう。os.pathの中で定義されている関数としては、次のようなものがあります。

Page 92: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

92 第 10章 ファイル

basename 引数としてパス名を受け取って、そのパス名の末尾の名前を返す。dirname 引数としてパス名を受け取って、そのパス名から末尾の名前を取り除いた残りの部

分を返す。split 引数としてパス名を受け取って、そのパス名から末尾の名前を取り除いた残りの部

分と、末尾の名前に分解して、それらから構成されるタプルを返す。join 引数として何個かの名前を受け取って、それらの名前を結合することによってでき

るパス名を返す。exists 引数としてパス名を受け取って、そのパス名で指定されたものが実在するならば

True、そうでなければ偽を返す。isfile 引数としてパス名を受け取って、そのパス名で指定されたものが実在するファイル

ならば True、そうでなければ偽を返す。isdir 引数としてパス名を受け取って、そのパス名で指定されたものが実在するディレク

トリならば True、そうでなければ偽を返す。

次のプログラムの中で定義されている sizelistという関数は、ディレクトリのパス名を受け取って、そのディレクトリの中にあるすべてのファイルについて、そのファイルの名前と大きさを出力します。

プログラムの例 sizelist.py

from os import *from os.path import *

def sizelist(dirname):for item in listdir(dirname):

name = join(dirname, item)if isfile(name):

st = stat(name)print(item + ’: ’ + str(st.st_size))

実行例>>> from sizelist import *>>> sizelist(’/home/hoge/text’)umiushi.txt: 370namako.txt: 603kamenote.txt: 228

10.5.4 ディレクトリの再帰的な処理ディレクトリは、その一部分の構造が全体と同じであるという再帰的な構造を持っています。

ですから、ディレクトリを処理する関数は、ディレクトリの中のディレクトリを再帰的に処理するように定義する、ということも可能です。たとえば、先ほど紹介した、ファイルの名前と大きさを出力する関数は、次のように書き直す

と、ディレクトリを再帰的に処理するようになります。

プログラムの例 recursivesizelist.py

from os import *from os.path import *

def recursive_sizelist(dirname):for item in listdir(dirname):

name = join(dirname, item)if isfile(name):

st = stat(name)print(item + ’: ’ + str(st.st_size))

elif isdir(name):print(’[’ + name + ’]’)recursive_sizelist(name)

実行例>>> from recursivesizelist import *

Page 93: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

93

>>> recursive_sizelist(’/home/hoge’)[/home/hoge/image]hitode.jpg: 87635kurage.jpg: 64013fujitsubo.jpg: 47590[/home/hoge/text]umiushi.txt: 370namako.txt: 603kamenote.txt: 228

練習問題 10.6 dirnameをパス名とするとき、

filecount(dirname)

という式で呼び出すと、dirnameによって指定されるディレクトリを再帰的に処理して、そこに含まれているすべてのファイルの個数を返す関数を定義してください。

実行例>>> from filecount import *>>> filecount(’/home/hoge’)6

練習問題 10.7 dirnameをパス名とするとき、

dirlist(dirname)

という式で呼び出すと、dirnameによって指定されるディレクトリを再帰的に処理して、そこに含まれているすべてのディレクトリの名前を出力する関数を定義してください。なお、ひとつのディレクトリの名前を 1行で出力して、階層が深いディレクトリほどインデントがより深くなるようにしてください。

実行例>>> from dirlist import *>>> dirlist(’/home’)hoge

textimage

mogehobbywork

secret

第11章 正規表現

11.1 正規表現の基礎

11.1.1 正規表現とは何か文字列を処理するときには、しばしば、その中に含まれている特定のパターン(構造)を探し

出す必要が生じます。そして、パターンを探し出すという処理を記述するためには、そのパターンそのものを記述する方法が必要になります。文字列を使うことによって、文字列のパターンを記述するということができます。文字列を

使って文字列のパターンを記述するための言語としては、「正規表現」(regular expression)と呼ばれるものがよく使われます。「正規表現」というのは言語の名前ですが、この言語を使って作られた文字列のことも、「正規表現」と呼ばれます。正規表現によってあらわされるパターンと文字列とが一致することを、正規表現(またはそれ

があらわしているパターン)と文字列とが「マッチする」(match)と言います(名詞は「マッチング」(matching)です)。プログラミング言語の多くは、正規表現を扱うことができます。それぞれのプログラミング言

語が扱う正規表現は、どのプログラミング言語についても、ほとんど同じです。したがって、どれかひとつのプログラミング言語が扱う正規表現を覚えておけば、別のプログラミング言語が扱

Page 94: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

94 第 11章 正規表現

う正規表現を書く場合にも、その知識がほとんどそのまま役に立つことになります。

11.1.2 1個の特定の文字1個の特定の文字というパターンをあらわす正規表現は、たいていの場合、その文字そのもの

です。たとえば、 Aという文字は、 Aという正規表現によってあらわされます。

11.1.3 連接特定のパターンのうしろに特定のパターンが続いているという構造のことを、「連接」(sequence)

と呼びます。連接は、正規表現と正規表現とをパターンの順番のとおりに並べることによって表現することができます。たとえば、piという正規表現は、pという文字のうしろに iという文字が続いているというパターン、つまり piという文字列をあらわします。ですから、たいていの場合、特定の文字列というパターンをあらわす正規表現は、それとまっ

たく同じ文字列になります。たとえば、kamomeという特定の文字列は、kamomeという正規表現によってあらわされます。

11.1.4 マッチした部分文字列を取得する関数標準ライブラリーの中にある reというモジュールは、正規表現を扱うさまざまな関数を定義

しています。reの中で定義されている findallという関数は、正規表現によってあらわされるパターンと

マッチした部分文字列を、文字列から取得します。findallには、1個目の引数として正規表現、2個目の引数として文字列を渡します。そうす

ると、2個目の引数から、それに含まれる、正規表現によってあらわされるパターンとマッチした部分文字列を取得して、それらから構成されるリストを返します。

>>> from re import *>>> findall(’nama’, ’namamuginamagomenamatamago’)[’nama’, ’nama’, ’nama’]

11.2 メタ文字

11.2.1 メタ文字の基礎正規表現を構成するそれぞれの文字は、基本的には、自分自身というパターンを意味していま

す。しかし、特定の文字列ではなくて、いくつかの文字列とマッチするようなパターンを表現するためには、自分自身ではない特別な意味をいくつかの文字に与える必要があります。正規表現を書くために使われる、自分自身ではなくて何か別のことを意味している文字は、「メ

タ文字」(metacharacter)と呼ばれます。メタ文字として使われるのは、

\ . [ ] - ^ $ * + ? { } ( ) |

というような文字で、それぞれのメタ文字の意味は、どのプログラミング言語でも同じです。

11.2.2 文字クラス文字の集合は、「文字クラス」(character class)と呼ばれます。正規表現は、指定された文字ク

ラスに属する任意の文字というパターンを表現することができます。

11.2.3 すべての文字すべての文字の集合という文字クラスに属する任意の文字というパターンは、ドット ( . )とい

うメタ文字によってあらわされます。たとえば、ma.ikoという正規表現は、maと ikoとのあいだに 1個の任意の文字がある、というパターンをあらわしています。

>>> findall(’ma.iko’, ’mamiko, mariko, ma@iko, machiko’)[’mamiko’, ’mariko’, ’ma@iko’]

11.2.4 文字の列挙文字を列挙することによって文字クラスを指定したいときは、角括弧 ( [ ] )というメタ文字を

使います。文字クラスに属する文字を角括弧の中に列挙したものは、その文字クラスに含まれる

Page 95: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

11.2. メタ文字 95

任意の文字というパターンをあらわす正規表現になります。たとえば、ma[mkr]ikoという正規表現は、maと ikoとのあいだに、m、k、rのうちのいずれかが 1個だけある、というパターンをあらわしています。

>>> findall(’ma[mkr]iko’, ’mamiko, makiko, mariko, magiko’)[’mamiko’, ’makiko’, ’mariko’]

11.2.5 文字コードの範囲文字を列挙することによって文字クラスを指定するのではなくて、文字コードの範囲を指定す

ることによって文字クラスを指定する、ということも可能です。文字コードの範囲で文字クラスを指定したいときは、マイナス ( - )というメタ文字を使いま

す。角括弧の中に、

文字 1 - 文字 2

という形のものを書くと、それは、文字 1から文字 2までという文字コードの範囲に含まれるすべての文字を列挙したことと同じ意味になります。たとえば、[a-z]という正規表現は、任意の英字の小文字というパターンをあらわします。

>>> findall(’ma[a-z]iko’, ’mamiko, magiko, maxiko, maMiko’)[’mamiko’, ’magiko’, ’maxiko’]

11.2.6 文字クラスに属さない文字文字クラスを指定する方法には、それに属する文字について記述するという方法のほかに、そ

れに属さない文字について記述するという方法もあります。それに属さない文字を記述することによって文字クラスを指定したいときは、サーカムフレッ

クス ( ^ )というメタ文字を使います。左角括弧の直後にサーカムフレックスを書くと、文字クラスは、それに属する文字によって記述されるのではなくて、それに属さない文字によって記述されることになります。たとえば、[^mkr]という正規表現は、mと kと rという文字を除いたすべての文字から構成される文字クラスに属する任意の文字、というパターンをあらわします。

>>> findall(’ma[^mkr]iko’, ’mamiko, makiko, magiko, maxiko’)[’magiko’, ’maxiko’]

サーカムフレックス ( ^ )とマイナス ( - )とを組み合わせることも可能です。

>>> findall(’ma[^a-z]iko’, ’mamiko, maMiko, ma8iko, ma@iko’)[’maMiko’, ’ma8iko’, ’ma@iko’]

11.2.7 パターンの繰り返しメタ文字を使うことによって、同じパターンがいくつも繰り返されている、というパターンを

あらわす正規表現を作ることも可能です。0回以上の繰り返しを表現したいときは、アスタリスク ( * )というメタ文字を使います。何ら

かの正規表現の直後にアスタリスクを書いたものは、その正規表現によってあらわされたパターンが 0回以上繰り返されたもの、というパターンを意味する正規表現になります。たとえば、m*

という正規表現は、長さが 0以上の mの列、というパターンをあらわします。

>>> findall(’mam*iko’, ’maiko, mamiko, mammiko, mammmiko’)[’maiko’, ’mamiko’, ’mammiko’, ’mammmiko’]

繰り返しの対象となる正規表現の範囲は、繰り返しをあらわす記述の直前にあるものだけ、という点に注意してください。つまり、mam*ikoという正規表現のうちで、繰り返しの対象になるのは、 mamではなくて、アスタリスクの直前の mだけだということです。ほとんどすべての正規表現は、繰り返しの対象にすることができます。たとえば、[mk]*とい

う正規表現は、 mまたは kから構成される、長さが 0以上の文字列とマッチします。

>>> findall(’ma[mk]*iko’, ’maiko, mamkmiko, makkmkmkkmmiko’)[’maiko’, ’mamkmiko’, ’makkmkmkkmmiko’]

1回以上の繰り返しとはマッチするけれども、繰り返しの回数が 0回のときはマッチしないようにしたい、というときは、アスタリスクの代わりにプラス ( + )というメタ文字を使います。たとえば、 m+という正規表現は、長さが 1以上の mの列、というパターンをあらわします。

Page 96: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

96 第 11章 正規表現

>>> findall(’mam+iko’, ’maiko, mamiko, mammiko, mammmiko’)[’mamiko’, ’mammiko’, ’mammmiko’]

0回と 1回の繰り返しだけとマッチする正規表現を書きたい、というときは、クエスチョンマーク ( ? )というメタ文字を使います。たとえば、 m?という正規表現は、 mの 0回または 1回の繰り返しというパターンをあらわします。

>>> findall(’mam?iko’, ’maiko, mamiko, mammiko, mammmiko’)[’maiko’, ’mamiko’]

繰り返しの回数を整数で指定したいときは、中括弧 ( { } )というメタ文字を使います。正規表現の直後に中括弧を書いて、その中に 10進数を書いたものは、中括弧の直前の正規表現があらわしているパターンを、10進数で指定された回数だけ繰り返したパターンをあらわす正規表現になります。たとえば、 m{3}という正規表現は、 mの 3回の繰り返しというパターンをあらわします。

>>> findall(’mam{3}iko’, ’mammiko, mammmiko, mammmmiko’)[’mammmiko’]

11.2.8 グループ化いくつかの正規表現から構成される列をひとつの正規表現にすることを、正規表現の列の「グ

ループ化」(group)と呼びます。丸括弧 ( ( ) )というメタ文字で正規表現の列を囲むと、その正規表現の列はグループ化されま

す。たとえば、 (mi)という正規表現は、 mという正規表現と iという正規表現から構成される列をグループ化します。findallは、1個目の引数として受け取った正規表現の中に、グループ化された正規表現の列

が含まれていた場合、その正規表現とマッチした部分文字列に含まれる、グループ化された列とマッチした部分文字列から構成されるリストを返します。

>>> findall(’ma([0-9]*)iko’, ’maiko, ma832iko, ma8325iko’)[’’, ’832’, ’8325’]

findallは、1個目の引数として受け取った正規表現の中に、グループ化された正規表現の列が 2個以上含まれていた場合は、それらの列とマッチした部分文字列を、正規表現とマッチした部分文字列ごとにタプルにまとめたものから構成されるリストを返します。

>>> findall(’ma([0-9]*)([a-z]*)’, ’ma364miko, ma2738nami’)[(’364’, ’miko’), (’2738’, ’nami’)]

第 11.2.7項で、「繰り返しの対象となる正規表現の範囲は、繰り返しをあらわす記述の直前にあるものだけ、という点に注意してください」と書きましたが、もしも、繰り返しをあらわす記述の直前に、正規表現の列をグループ化したものがある場合は、グループ化された列の全体が「直前にあるもの」である、ということになります。たとえば、(mi)+という正規表現は、miというパターンを 1回以上繰り返したもの、というパターンをあらわします。

>>> findall(’(ma(mi)+ko)’, ’mamiko, mamiiiko, mamimimiko’)[(’mamiko’, ’mi’), (’mamimimiko’, ’mi’)]

11.2.9 パターンの選択二つのパターンのうちのどちらか、というパターンの選択を表現したいときは、縦棒 ( | )とい

うメタ文字を使います。縦棒を使って選択を記述したいときは、

正規表現の列 | 正規表現の列

という形の正規表現を書きます。そうすると、縦棒の左右に書かれたそれぞれの正規表現の列があらわしているパターンのどちらか、という意味の正規表現になります。たとえば、a|bという正規表現は、aまたは bのどちらか、というパターンをあらわします。選択の対象がさらに選択であってもかまいませんので、a|b|cという正規表現を書くことによって、aまたは bまたは c

のいずれか、というパターンをあらわすことも可能です。縦棒による選択の範囲は、その直前と直後の正規表現だけではなくて、そのさらに左や右にも

及ぶ、という点に注意してください。つまり、ab|cdという正規表現は、abdまたは acdという

Page 97: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

11.2. メタ文字 97

パターンをあらわしているのではなくて、abまたは cdというパターンをあらわしているのだということです。選択の対象となる正規表現の範囲を狭く限定したいときは、その範囲を、丸括弧 ( ( ) )を使っ

てグループ化します。たとえば、a(b|c)dという正規表現は、abdまたは acdというパターンをあらわします。同じように、 ma(ri|sa)koという正規表現は、 marikoまたは masakoというパターンをあらわします。

>>> findall(’(ma(ri|sa)ko)’, ’mariko, masako, mamiko, mako’)[(’mariko’, ’ri’), (’masako’, ’sa’)]

11.2.10 アンカーパターンが文字列の中の特定の位置にあるときだけマッチする正規表現を書きたいときは、文

字列の中の特定の位置にマッチする正規表現を使います。そのような正規表現は、「アンカー」(anchor)と呼ばれます。サーカムフレックス ( ^ )というメタ文字は、文字列の先頭という位置とマッチするアンカー

です。また、ドルマーク ( $ )というメタ文字は、文字列の末尾という位置とマッチするアンカーです。

>>> findall(’[0-9]+’, ’123xxxxxxx456xxxxxxx789’)[’123’, ’456’, ’789’]>>> findall(’^[0-9]+’, ’123xxxxxxx456xxxxxxx789’)[’123’]>>> findall(’[0-9]+$’, ’123xxxxxxx456xxxxxxx789’)[’789’]

11.2.11 エスケープところで、メタ文字自身をあらわす正規表現、つまり特定のメタ文字だけとマッチする正規表

現は、どのように書けばいいのでしょうか。たとえば、ドット ( . )というメタ文字とマッチする正規表現というのは、いったいどう書けばいいのでしょうか。メタ文字は、自分自身という意味を持っていませんので、メタ文字自身をあらわす正規表現を

書くためには、メタ文字が持っている本来の意味を、その文字自身という意味に変更しないといけません。文字が持っている本来の意味を別の意味に変更するすることを、文字を「エスケープする」(escape)と言います。文字をエスケープしたいときは、バックスラッシュ( \ )というメタ文字を使います。バックス

ラッシュというのは、その直後に書かれた文字をエスケープするという意味を持つメタ文字です。バックスラッシュでメタ文字をエスケープすると、その文字の意味は、メタ文字としての意味

から、その文字自身という意味に変更されます。たとえば、ドット ( . )というのはメタ文字ですので、ドット自身ではなくてメタ文字としての意味を持っています。しかし、\.というように、バックスラッシュの右側にドットを書くと、その 2文字は、ドット自身をあらわす正規表現になります。普通の文字列リテラルの中では、バックスラッシュはエスケープシーケンスの 1文字目と解釈

されます。ですから、バックスラッシュを含む正規表現を書く場合は、未加工文字列リテラルを使うとよいでしょう。

>>> findall(r’ma\.iko’, ’mamiko, makiko, mariko, ma.iko’)[’ma.iko’]

ちなみに、バックスラッシュ自身もメタ文字ですから、バックスラッシュ自身をあらわす正規表現は、 \\と書く必要があります。

>>> findall(r’ma\\iko’, r’mamiko, makiko, mariko, ma\iko’)[’ma\\iko’]

文字クラスを指定する角括弧 ( [ ] )の中では、ほとんどのメタ文字は、エスケープしなくても自分自身をあらわします。例外は、マイナス ( - )とサーカムフレックス ( ^ )とバックスラッシュ( \ )です。これらの文字を含む文字クラスを指定するためには、それらをエスケープする必要があります。

>>> findall(’[.*+]’, ’namako.umiushi*hitode+kurage’)[’.’, ’*’, ’+’]>>> findall(r’[\-\^\\]’, r’namako-umiushi^hitode\kurage’)[’-’, ’^’, ’\\’]

Page 98: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

98 第 11章 正規表現

11.2.12 文字クラスの略記法バックスラッシュ( \ )を使って、メタ文字ではない文字をエスケープすることもあります。そ

れは、文字クラスの略記法を使う場合です。文字クラスの略記法というのは、使われる頻度が高い文字クラスを、短く書きあらわす方法の

ことです。文字クラスの略記法には、次のようなものがあります。略記法 もとの正規表現 説明

\d [0-9] 数字

\D [^0-9] 数字以外

\w [0-9A-Za-z] 英数字

\W [^0-9A-Za-z] 英数字以外

\s [ \t\n\r\f] ホワイトスペース

\S [^ \t\n\r\f] ホワイトスペース以外

>>> findall(r’ma\diko’, ’mamiko, maMiko, ma8iko, ma@iko’)[’ma8iko’]>>> findall(r’ma\Diko’, ’mamiko, maMiko, ma8iko, ma@iko’)[’mamiko’, ’maMiko’, ’ma@iko’]>>> findall(r’ma\wiko’, ’mamiko, maMiko, ma8iko, ma@iko’)[’mamiko’, ’maMiko’, ’ma8iko’]>>> findall(r’ma\Wiko’, ’mamiko, maMiko, ma8iko, ma@iko’)[’ma@iko’]

11.3 正規表現を扱う関数

11.3.1 この節について第 11.1.4項で説明したように、標準ライブラリーの中にある reというモジュールは、正規表

現を扱うさまざまな関数を定義しています。 findallという関数は、そのひとつです。この節では、 reの中で定義されている、 findall以外の関数のうちのいくつかを紹介したい

と思います。

11.3.2 マッチした部分文字列で文字列を分解する関数

splitという関数は、正規表現によってあらわされるパターンとマッチした部分文字列によって文字列を分解します。splitには、1個目の引数として正規表現、2個目の引数として文字列を渡します。そうする

と、2個目の引数を、正規表現によってあらわされるパターンとマッチした部分文字列で分解して、それぞれの部分から構成されるリストを返します。

>>> split(’[0-9]+’, ’namako834umiushi72hitode5031kurage’)[’namako’, ’umiushi’, ’hitode’, ’kurage’]

11.3.3 マッチした部分文字列を置換する関数

subという関数は、正規表現によってあらわされるパターンとマッチした部分文字列を、別の文字列に置換します。subには、1個目の引数として正規表現、2個目と 3個目の引数として文字列を渡します。そ

うすると、3個目の引数に含まれる、正規表現によってあらわされるパターンとマッチしたすべての部分文字列を、2個目の引数で置換して、その結果として得られた文字列を返します。

>>> sub(’[0-9]+’, ’, ’, ’namako834umiushi72hitode5031kurage’)’namako, umiushi, hitode, kurage’

11.3.4 部分文字列を検索する関数

searchという関数は、部分文字列を正規表現で検索します。searchには、1個目の引数として正規表現、2個目の引数として文字列を渡します。そうする

と、2個目の引数に含まれる、正規表現によってあらわされるパターンとマッチする部分文字列を、先頭から末尾へ向かって検索して、最初に見つかった部分文字列をあらわすオブジェクト

Page 99: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

11.3. 正規表現を扱う関数 99

を返します。文字列の末尾まで検索しても、マッチする部分文字列が見つからなかった場合は、Noneを返します。

>>> search(’[0-9]+’, ’namako54372umiushi4037hitode’)<_sre.SRE_Match object at 0x00C308A8>>>> search(’[0-9]+’, ’namakoumiushihitode’)>>>

マッチする部分文字列が見つかった場合に searchが返すオブジェクトは、「マッチオブジェクト」(match object)と呼ばれます。マッチオブジェクトは、マッチした部分文字列についてのさまざまな情報を持っています。そ

れらの情報は、マッチオブジェクトが持っている次のようなメソッドを呼び出すことによって取得することができます。

group マッチした部分文字列。start マッチした部分文字列の先頭の文字のインデックス。end マッチした部分文字列の末尾の次の文字のインデックス。span マッチした部分文字列の先頭の文字のインデックスと末尾の次の文字のインデックスか

ら構成されるタプル。

>>> match = search(’[0-9]+’, ’namako54372umiushi4037hitode’)>>> match.group()’54372’>>> match.start()6>>> match.end()11>>> match.span()(6, 11)

11.3.5 正規表現オブジェクトを生成する関数標準ライブラリーの中にある reというモジュールは、compileという関数を定義しています。引数として正規表現を渡して compileを呼び出すと、この関数は、「正規表現オブジェクト」

(regular expression object)と呼ばれるオブジェクトを返します。正規表現オブジェクトというのは、正規表現によって記述されたパターンをあらわしているオ

ブジェクトのことです。compileは、引数として受け取った正規表現を解析して、それと同じパターンをあらわしているオブジェクトを作って、それを戻り値として返します。正規表現を解析するためには、若干の時間がかかります。ですから、プログラムの中で同じ正

規表現を何回も使う場合は、あらかじめ正規表現オブジェクトを作っておいて、それを使い回しすれば、解析に要する時間を節約することができます。

11.3.6 正規表現オブジェクトが持っているメソッド正規表現オブジェクトは、findall、split、sub、searchなどの、正規表現を扱う関数と

同じ名前のメソッドを持っています。それらのメソッドの動作は、同じ名前の関数の動作と同じです。ただし、関数のほうは 1個目の引数として正規表現を受け取るわけですが、メソッドのほうはそれを受け取りません。

>>> regexp = compile(’[0-9]+’)>>> regexp.findall(’namako324umiushi5037hitode687kurage’)[’324’, ’5037’, ’687’]>>> regexp.split(’namako324umiushi5037hitode687kurage’)[’namako’, ’umiushi’, ’hitode’, ’kurage’]>>> regexp.sub(’, ’, ’namako324umiushi5037hitode687kurage’)’namako, umiushi, hitode, kurage’>>> match = regexp.search(’namako54372umiushi’)>>> match.span()(6, 11)

11.3.7 構文の正しさを判定する関数の定義

searchを使って、何らかの構文を持つ文字列が正しいかどうかを判定する関数を定義してみましょう。

Page 100: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

100 第 12章 GUIの基礎

次のプログラムの中で定義されている pathnameという関数は、文字列を受け取って、それが絶対パス名 (absolute path name)として正しいならば真、そうでなければ偽を返します(ただし、ディレクトリまたはファイルの名前を作るために使える文字を、英数字とドットとマイナスとアンダースコアに限定しています)。

プログラムの例 pathname.py

from re import *

def pathname(s):return search(r’^(/[a-zA-Z0-9.\-_]+)+$’, s) != None

実行例>>> from pathname import *>>> pathname(’/home/namako’)True>>> pathname(’home/namako’)False>>> pathname(’/home//namako’)False

練習問題 11.1 sを文字列とするとき、address(s)という式で呼び出すと、sがメールアドレスとして正しいならば真、そうでなければ偽を返す関数を定義してください。ただし、RFC 5322で定められているメールアドレスの厳密な仕様はかなり複雑ですので、こ

こでは、ローカル部についてもドメイン名についても、使える文字は英数字のみとします。

実行例>>> from address import *>>> address(’[email protected]’)True>>> address(’namako@[email protected]’)False>>> address(’[email protected]’)False

第12章 GUIの基礎

12.1 GUIの基礎の基礎

12.1.1 GUIとは何か機械などが持っている、人間に何かを報告したり人間からの指示を受け付けたりする部分のこ

とを、「ユーザーインターフェース」(user interface)と言います。コンピュータのプログラムも、たいていのものは何らかのユーザーインターフェースを持って

います。プログラムのユーザーインターフェースとしては、現在、CUIと GUIと呼ばれる 2種類のものが主流です。CUI(character user interface)というのは、文字列を媒介とするユーザーインターフェースの

ことです。CUIの場合、プログラムは文字列を出力することによって人間に何かを報告し、人間はキーボードから文字列を入力することによってプログラムに指示を与えます。それに対して、GUI(graphical user interface)は、図形を媒介とするユーザーインターフェー

スです。GUIの場合、プログラムはモニターの画面に図形を表示することによって人間に何かを報告し、人間はマウスなどの装置を使ってその図形を操作することによってプログラムに指示を与えます。

12.1.2 Tk

Pythonは、その処理系にも、その標準ライブラリーにも、GUIを作る機能はありません。ですから、GUIを持つプログラムを Pythonで書くためには、Pythonの外部にある、GUIを作る機能を利用する必要があります。GUIを持つプログラムをPythonで書く場合に利用されるのは、Tkと呼ばれるものです。これ

Page 101: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

12.2. ウィジェット 101

は、John Ousterhoutさんという人が作ったGUIのライブラリーで、Tkという名前は、toolkitという単語を縮めたものです。Tkは、もともとは Tclというプログラミング言語で使うために作られたものですが、現在で

は Tclだけではなくて、Perlや Rubyや Pythonでもそれを使うことができます。

12.1.3 tkinter

Pythonのプログラムが Tkの機能を利用するためには、tkinterと呼ばれる、そのためのインターフェースが必要になります。tkinterは、標準ライブラリーに含まれている tkinterという名前のモジュールの中で、さま

ざまなクラスとして定義されています。ですから、Pythonのプログラムは、このモジュールをインポートして、その中で定義されているクラスを使うことによって、Tkを利用することができます。

12.2 ウィジェット

12.2.1 ウィジェットの基礎GUIは、画面の上に表示されるさまざまな部品から構成されます。そのような、GUIを作るた

めの部品は、「ウィジェット」(widget)と呼ばれます。ちなみに、widgetという単語は、windowgadgetという言葉を縮めたものだと言われています。ウィジェットには、ボタン、ラベル、キャンバス、エントリー、リストボックス、フレームなどのさまざまな種類があります。tkinterでは、ウィジェットは、「ウィジェットクラス」(widget class)と呼ばれるクラスから生

成されたオブジェクトによって表示されます。たとえば、ラベルという種類のウィジェットは、Labelというクラスから生成されたオブジェクトによって表示されます。なお、「ウィジェット」という言葉は、画面の上に表示される部品という意味だけではなくて、それを表示しているオブジェクトという意味でも使われます。

12.2.2 ルートウィジェットGUIを持つプログラムは、通常、1個以上のウィンドウを表示します。tkinterでは、それらの

ウィンドウのうちでもっとも中心となるウィンドウを、「ルートウィジェット」(root widget)と呼びます。tkinterでは、ルートウィジェットは、 Tkというウィジェットクラスから生成されます。

12.2.3 イベントループGUIを持つプログラムは、人間からの指示を受け取って、その指示に対応する処理を実行す

る、ということを何度も繰り返します。そのような繰り返しは、「イベントループ」(event loop)と呼ばれます。tkinterでは、ルートウィジェットが持っている mainloopというメソッドがイベントループに

なっています。tkinterを使って GUIを作るプログラムは、ウィジェットを生成したのちに、かならずこのメソッドを呼び出す必要があります(引数は不要です)。次のプログラムは、ルートウィジェットを生成して、イベントループを実行します。

プログラムの例 tk.py

from tkinter import *root = Tk()root.mainloop()

12.2.4 ウィンドウのタイトルウィンドウに対して、そのタイトルバーに表示するタイトルを設定したいときは、ウィンドウ

が持っている titleというメソッドを使います。このメソッドは、引数として文字列を受け取って、その文字列をタイトルとして自身に設定します。次のプログラムは、「私はこのウィンドウのタイトルです。」というタイトルがタイトルバーに

表示されたウィンドウを表示します。

プログラムの例 title.py

from tkinter import *root = Tk()

Page 102: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

102 第 12章 GUIの基礎

root.title(’私はこのウィンドウのタイトルです。’)root.mainloop()

12.2.5 ラベル文字列(テキスト)をその上に表示することを目的として使われるウィジェットは、「ラベル」

(label)と呼ばれます。ラベルは、 Labelというウィジェットクラスから生成されます。ルートウィジェット以外のウィジェットを生成するときには、そのウィジェットを生成するク

ラスに対して、そのウィジェットの親となるウィジェットを引数として渡す必要があります。たとえば、 rootという識別子が束縛されているルートウィジェットを親としてラベルを生成したいという場合は、

Label(root)

という呼び出しを書く必要があります。ウィジェットクラスに対しては、さまざまなキーワード引数を渡すことができます。ウィジェ

ットクラスは、受け取ったキーワード引数を、生成するウィジェットのさまざまな状態を設定するために使います。textというキーワード引数で文字列を Labelに渡すと、その文字列がラベルの上に表示され

たラベルが生成されます。たとえば、

Label(root, text=’私はラベルです。’)

という呼び出しで Labelを呼び出すと、「私はラベルです。」という文字列が表示されたラベルが生成されます。

12.2.6 ジオメトリーマネージャーウィンドウ以外のウィジェットは、単独では画面の上に表示されません。それを画面に表示す

るためには、それの親になっているウィジェットの上にそれを取り付ける必要があります。親のウィジェットの上にウィジェットを取り付けたいときは、「ジオメトリーマネージャー」

(geometry manager)と呼ばれるものを使います。ジオメトリーマネージャーというのは、ウィジェットが持っているメソッドで、自身の配置を管理するという動作をするもののことです。tkinterには、pack、grid、placeという 3種類のジオメトリーマネージャーがあります。そ

れらのうちで、もっともよく使われるのは、packというジオメトリーマネージャーです。pack

は、親のウィジェットを必要最小限に小さくして、その中に自身を詰め込む、という動作をします。次のプログラムは、ルートウィジェットを親としてラベルを生成して、そのラベルを packを

使って親の上に配置します。

プログラムの例 label.py

from tkinter import *root = Tk()label = Label(root, text=’私はラベルです。’)label.pack()root.mainloop()

ジオメトリーマネージャーについては、第 16章で、もう少し詳しく説明したいと思います。

12.3 フォント

12.3.1 フォント記述子ウィジェットの上に文字を表示するために使うフォントは、「フォント記述子」(font descriptor)

と呼ばれる文字列を書くによって、自由に指定することができます。フォント記述子の中には、最低限、Times、Helvetica、Courierというような、「フォント

ファミリー名」(font family name)と呼ばれる、フォントを識別するための名前を書く必要があります。ウィジェットクラスに対して、 fontというキーワード引数でフォント記述子を渡すと、生成

されたウィジェットは、それによって記述されたフォントを使って文字列を表示します。

Page 103: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

12.3. フォント 103

次のプログラムは、 Times、 Helvetica、 Courierというそれぞれのフォントを使って文字列を表示するラベルを生成します。

プログラムの例 family.py

from tkinter import *root = Tk()label1 = Label(root, text=’Times’, font=’Times’)label1.pack()label2 = Label(root, text=’Helvetica’, font=’Helvetica’)label2.pack()label3 = Label(root, text=’Courier’, font=’Courier’)label3.pack()root.mainloop()

12.3.2 フォントの大きさフォントの大きさを指定したいときは、

フォントファミリー名 大きさ

という形のフォント記述子を書きます。大きさは、ポイントを単位とする数字で記述します。次のプログラムは、30ポイント、60ポイント、120ポイントというそれぞれの大きさのフォン

トを使って文字列を表示するラベルを生成します。

プログラムの例 size.py

from tkinter import *root = Tk()label1 = Label(root, text=’30’, font=’Times 30’)label1.pack()label2 = Label(root, text=’60’, font=’Times 60’)label2.pack()label3 = Label(root, text=’120’, font=’Times 120’)label3.pack()root.mainloop()

12.3.3 スタイルフォントを太字にするとか、イタリック体にするという、フォントのスタイルを指定したいと

きは、

フォントファミリー名 大きさ スタイル

という形のフォント記述子を書きます。「スタイル」というところに書くことができるのは、次の 3種類です。

bold 太字。italic イタリック体。bold italic 太字でかつイタリック体。

次のプログラムは、太字、イタリック体、太字でかつイタリック体、というそれぞれのフォントを使って文字列を表示するラベルを生成します。

プログラムの例 style.py

from tkinter import *root = Tk()label1 = Label(root, text=’bold’, font=’Times 60 bold’)label1.pack()label2 = Label(root, text=’italic’, font=’Times 60 italic’)label2.pack()label3 = Label(root, text=’bold italic’,

font=’Times 60 bold italic’)label3.pack()root.mainloop()

Page 104: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

104 第 13章 イベント

12.4 色

12.4.1 色をあらわす文字列ウィジェットの前景色(文字の色)や背景色は、色をあらわす文字列を書くことによって指定

することができます。色は、光の三原色のそれぞれの明るさを、

#rgb

#rrggbb

#rrrgggbbb

という形で並べることによって記述されます。r、rr、rrrのところには赤の比率、g、gg、gggのところには緑の比率、b、bb、bbbのところには青の比率を、1桁から 3桁までの 16進数で記述します。たとえば、 #f00と書けば赤色、 #0ffと書けば水色、 #f80と書けばオレンジ色をあらわすことになります。

12.4.2 前景色ウィジェットクラスに対して、foregroundというキーワード引数で色の記述を渡すと、その

色を前景色(文字の色)とするウィジェットが生成されます。次のプログラムは、赤、ネイビー、オリーブというそれぞれの色を前景色とするラベルを生成

します。

プログラムの例 foreground.py

from tkinter import *root = Tk()label1 = Label(root, text=’red’, font=’Times 60’,

foreground=’#f00’)label1.pack()label2 = Label(root, text=’navy’, font=’Times 60’,

foreground=’#008’)label2.pack()label3 = Label(root, text=’olive’, font=’Times 60’,

foreground=’#880’)label3.pack()root.mainloop()

12.4.3 背景色ウィジェットクラスに対して、backgroundというキーワード引数で色の記述を渡すと、その

色を背景色とするウィジェットが生成されます。次のプログラムは、水色、黄色、黒というそれぞれの色を背景色とするラベルを生成します。

プログラムの例 background.py

from tkinter import *root = Tk()label1 = Label(root, text=’aqua’, font=’Times 60’,

background=’#0ff’)label1.pack()label2 = Label(root, text=’yellow’, font=’Times 60’,

background=’#ff0’)label2.pack()label3 = Label(root, text=’black’, font=’Times 60’,

foreground=’#fff’, background=’#000’)label3.pack()root.mainloop()

第13章 イベント

Page 105: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

13.1. イベントの基礎 105

13.1 イベントの基礎

13.1.1 バインディングGUIを持つプログラムは、それに対して人間が何らかの操作をしたときに、それに対応する

処理を実行します。GUIの上で何らかの操作が発生した、という出来事は、「イベント」(event)と呼ばれます。イベントが発生したときに実行される処理は、「イベント処理」(event processing)と呼ばれま

す。そして、イベント処理を実行する関数やメソッドは、「イベントハンドラー」(event handler)と呼ばれます。イベントに対してイベントハンドラーを割り当てることを、イベントにイベントハンドラーを

「バインドする」(bind)と言います(名詞形は「バインディング」(binding)です)。ウィジェットは、 bindというメソッドを持っています。このメソッドは、自身の上で発生す

るイベントに対してイベントハンドラーをバインドします。ウィジェットは、イベントが自分の上で発生した場合、 bindによってバインドされているイベントハンドラーを呼び出します。

13.1.2 イベントオブジェクトウィジェットは、イベントハンドラーを呼び出すときに、そのイベントハンドラーに 1個の引

数を渡します。ですから、イベントハンドラーは、1個の引数を受け取るように定義しておく必要があります。ウィジェットが引数としてイベントハンドラーに渡すオブジェクトは、「イベントオブジェク

ト」(event object)と呼ばれます。イベントオブジェクトは、どのようなイベントが発生したのかという情報を持っています。

13.1.3 イベントパターン

bindは、2個の引数を受け取ります。1個目の引数は、「イベントパターン」(event pattern)と呼ばれる、イベントの種類を指定する文字列です。そして 2個目の引数は、イベントハンドラーです。イベントパターンは、

<修飾子-タイプ-詳細>

という形式で書きます。ただし、最低限必要なのは「タイプ」という部分だけです。「タイプ」の部分には、「イベントタイプ」(event type)と呼ばれる、イベントの概略を示す文字列を書きます。たとえば、Buttonという文字列は、「マウスのボタンが押された」というイベントを示すイベントタイプで、ButtonReleaseという文字列は、「マウスのボタンが離された」というイベントを示すイベントタイプです。次のプログラムが表示するウィンドウは、マウスポインターが自身の上にあるとき、マウスの

ボタンが押されると、「マウスのボタンが押されました。」という文字列を出力して、マウスのボタンが離されると、「マウスのボタンが離されました。」という文字列を出力します。

プログラムの例 bind.py

from tkinter import *

def pressed(event):print(’マウスのボタンが押されました。’)

def released(event):print(’マウスのボタンが離されました。’)

root = Tk()root.bind(’<Button>’, pressed)root.bind(’<ButtonRelease>’, released)root.mainloop()

13.1.4 ウィジェットの状態の変更第 12.2.5項で説明したように、ウィジェットクラスはさまざまなキーワード引数を受け取るこ

とができて、それらのキーワード引数は、ウィジェットの状態を設定するために使われます。

Page 106: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

106 第 13章 イベント

タイプ 説明

Button マウスのボタンが押された。

ButtonPress Buttonと同じ。

ButtonRelease マウスのボタンが離された。

Motion マウスが移動した。

Enter マウスポインターが重なった。

Leave マウスポインターが離れた。

表 13.1: マウスのイベントタイプ

ウィジェットの状態は、生成されたのちも、自由に変更することが可能です。ウィジェットの状態を変更したいときは、そのウィジェットが持っている configというメソッドを呼び出します。ウィジェットクラスに渡すものと同じキーワード引数を configに渡すと、それによってウィジェットの状態が変更されます。次のプログラムが表示するラベルは、マウスポインターが自身の上にあるときにマウスのボタ

ンが押されると色を反転させて、ボタンが離されると、色を元に戻して、表示している整数を 1だけ増加させます。

プログラムの例 config.py

from tkinter import *

def pressed(event):label.config(foreground=’#0ff’, background=’#008’)

def released(event):global countcount += 1label.config(text=str(count), foreground=’#008’,

background=’#0ff’)

count = 0root = Tk()label = Label(root, text=’0’, font=’Times 180’,

foreground=’#008’, background=’#0ff’)label.bind(’<Button>’, pressed)label.bind(’<ButtonRelease>’, released)label.pack()root.mainloop()

13.2 マウスによるイベント

13.2.1 マウスのイベントタイプマウスによるイベントをバインドするためのイベントパターンは、表 13.1のイベントタイプを

使うことによって書くことができます。

13.2.2 マウスの特定のボタンに限定したバインディングマウスの特定のボタンによるイベントに限定してイベントハンドラーをバインドしたいと

きは、

<タイプ-番号>

という形式のイベントパターンを書きます。この中の「番号」というところには、マウスのボタンを指定する番号を書きます。3個のボタンを持つマウスの場合、それぞれのボタンには、左から順番に、1、2、3、という番

号が与えられています。ボタンが 2個しかないマウスの場合は、左が 1で右が 3です。次のプログラムによって表示される数字は、マウスの左ボタンでクリックすると 1だけ増加し

て、右ボタンでクリックすると 1だけ減少します。

Page 107: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

13.2. マウスによるイベント 107

プログラムの例 button.py

from tkinter import *

def increase(event):global countcount += 1label.config(text=str(count))

def decrease(event):global countcount -= 1label.config(text=str(count))

count = 0root = Tk()label = Label(root, text=’0’, font=’Times 180’)label.bind(’<ButtonRelease-1>’, increase)label.bind(’<ButtonRelease-3>’, decrease)label.pack()root.mainloop()

13.2.3 マウスのイベント修飾子第 13.1.3項で説明したように、イベントパターンというのは、

<修飾子-タイプ-詳細>

という形式を持つ文字列のことです。この中の「修飾子」のところに書くことのできる文字列は、「イベント修飾子」(event modifier)と呼ばれます。イベント修飾子というのは、いくつかの操作の組み合わせであるようなイベントを指定したいときに書く文字列です。Button1、Button2、Button3という文字列のそれぞれは、マウスの左ボタン、真ん中ボタン、

右ボタンが押されているときに発生するイベントを指定するイベント修飾子です。たとえば、

<Button1-Motion>

というイベントパターンを書くことによって、マウスの左ボタンでドラッグされるというイベントを指定することができます。次のプログラムによって表示される数字は、マウスの左ボタンでドラッグすると、それに応じ

て増えていきます。

プログラムの例 drag.py

from tkinter import *

def increase(event):global countcount += 1label.config(text=str(count))

count = 0root = Tk()label = Label(root, text=’0’, font=’Times 180’)label.bind(’<Button1-Motion>’, increase)label.pack()root.mainloop()

13.2.4 マウスポインターの座標第 13.1.2項で説明したように、イベントハンドラーは、「イベントオブジェクト」と呼ばれる

オブジェクトを引数として受け取ります。イベントオブジェクトは、発生したイベントについてのさまざまな情報を持っています。イベントオブジェクトは、xと yという属性を持っています。これらの属性は、イベントが発

生したときのマウスポインターの位置を示す座標に束縛されています。xは x座標、yは y座標です。ウィジェットの座標系は、左上の隅に原点があって、x軸は右向き、y軸は下向き、そして単

位はピクセルです。

Page 108: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

108 第 13章 イベント

次のプログラムが生成するラベルは、その上にマウスポインターがあるときにマウスを移動させると、そのときのマウスポインターの座標を表示します。

プログラムの例 coordinate.py

from tkinter import *

def show_coordinate(event):label.config(

text = ’(’ + str(event.x) + ’, ’ + str(event.y) + ’)’)

root = Tk()label = Label(root, text=’(0, 0)’, font=’Times 100’)label.bind(’<Motion>’, show_coordinate)label.pack()root.mainloop()

13.3 キーボードによるイベント

13.3.1 キーボードのイベントタイプキーボードによるイベントをバインドするためのイベントパターンは、次のイベントタイプを

使うことによって書くことができます。

Key キーボードのキーが押された。KeyPress Keyと同じ。KeyRelease キーボードのキーが離された。

次のプログラムは、キーボードのキーが押されると、「キーボードのキーが押されました。」という文字列を出力して、キーボードのキーが離されると、「キーボードのキーが離されました。」という文字列を出力します。

プログラムの例 key.py

from tkinter import *

def pressed(event):print(’キーボードのキーが押されました。’)

def released(event):print(’キーボードのキーが離されました。’)

root = Tk()root.bind(’<Key>’, pressed)root.bind(’<KeyRelease>’, released)root.mainloop()

13.3.2 キーボードの特定のキーに限定したバインディングキーボードの特定のキーによるイベントに限定してイベントハンドラーをバインドしたいと

きは、

<タイプ-キーシム>

という形式のイベントパターンを書きます。「キーシム」(keysym)というのは、キーボードの上にあるそれぞれのキーを識別するための

文字列のことです。たとえば、スペースは space、コンマは comma、スラッシュは slash、エンターは Enter、右のシフトは Shift_R、上向き矢印は Up、下向き矢印は Down、というキーシムによって識別されます。なお、数字と英字のキーについては、そのキーの文字がそのままキーシムになっています。次のプログラムによって表示される数字は、上向き矢印キーを押すと 1だけ増加して、下向き

矢印キーを押すと 1だけ減少します。

プログラムの例 updown.py

from tkinter import *

Page 109: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

13.3. キーボードによるイベント 109

def increase(event):global countcount += 1label.config(text=str(count))

def decrease(event):global countcount -= 1label.config(text=str(count))

count = 0root = Tk()root.bind(’<Key-Up>’, increase)root.bind(’<Key-Down>’, decrease)label = Label(root, text=’0’, font=’Times 180’)label.pack()root.mainloop()

13.3.3 キーボードのイベント修飾子

Shift、Control、Altという文字列のそれぞれは、シフトキー、コントロールキー、オルトキーが押されているときに発生するイベントを指定するイベント修飾子です。たとえば、

<Control-Key-space>

というイベントパターンを書くことによって、コントロールキーが押されているときにスペースキーが押されるというイベントを指定することができます。次のプログラムは、コントロールキーが押されているときにスペースキーが押されると、「コ

ントロール+スペースが押されました。」という文字列を出力して、コントロールキーが押されているときにスペースキーが離されると、「コントロール+スペースが離されました。」という文字列を出力します。

プログラムの例 control.py

from tkinter import *

def pressed(event):print(’コントロール+スペースが押されました。’)

def released(event):print(’コントロール+スペースが離されました。’)

root = Tk()root.bind(’<Control-Key-space>’, pressed)root.bind(’<Control-KeyRelease-space>’, released)root.mainloop()

13.3.4 イベントを発生させたキーのキーシムイベントオブジェクトは、 keysymという属性を持っています。この属性は、キーボードによ

るイベントをあらわすイベントオブジェクトでは、イベントを発生させたキーのキーシムに束縛されています。次のプログラムは、キーボードのキーが押されると、押されたキーのキーシムを出力します。

プログラムの例 keysym.py

from tkinter import *

def pressed(event):print(’keysym = ’ + event.keysym)

root = Tk()root.bind(’<Key>’, pressed)root.mainloop()

Page 110: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

110 第 14章 キャンバス

第14章 キャンバス

14.1 キャンバスの基礎

14.1.1 キャンバスとは何かtkinterは、「キャンバス」(canvas)と呼ばれるウィジェットを扱う機能を持っています。キャンバスは、その上にグラフィックスを描画するという目的で使われるウィジェットです。

14.1.2 キャンバスの生成キャンバスは、 Canvasというウィジェットクラスから生成されます。Canvasを呼び出してキャンバスを生成する方法は、 Labelを呼び出してラベルを生成する方

法と同じです。1個目の引数としてウィジェットを渡して、さらにいくつかのキーワード引数を渡すと、1個目のウィジェットを親とするキャンバスが生成されて、キーワード引数がそれの状態として設定されます。Canvasには、通常、次のようなキーワード引数を渡します。

width 横の長さ。単位はピクセル。height 縦の長さ。単位はピクセル。background 背景色。

次のプログラムは、横の長さが 640ピクセル、縦の長さが 480ピクセルで、背景色がオレンジ色のキャンバスを生成します。

プログラムの例 canvas.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480, background=’#f80’)canvas.pack()root.mainloop()

14.1.3 長方形キャンバスはさまざまなメソッドを持っています。それらの中には、キャンバスの上にグラフィ

ックスを描画するメソッドもあります。たとえば、キャンバスが持っている create_rectangleというメソッドを呼び出すことによっ

て、キャンバスの上に長方形を描画することができます。長方形の位置と形状は、次の 4個の引数を create_rectangleに渡すことによって指定します。

1個目 左上の頂点の x座標。2個目 左上の頂点の y座標。3個目 右下の頂点の x座標。4個目 右下の頂点の y座標。

次のプログラムは、左上の頂点が (80, 80)で右下の頂点が (560, 400)の長方形を描画します。

プログラムの例 rectangle.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_rectangle(80, 80, 560, 400)canvas.pack()root.mainloop()

長方形以外のグラフィックスをキャンバスの上に描画するメソッドについては、第 14.2節で紹介することにしたいと思います。

14.1.4 描画のキーワード引数キャンバスの上にグラフィックスを描画するメソッドの多くは、次のようなキーワード引数を

受け取ります。

Page 111: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

14.2. グラフィックスの描画 111

width 線の幅。outline 線の色。fill 塗りつぶしの色。

次のプログラムは、線の幅が 20ピクセル、線の色がネイビー、塗りつぶしの色が水色の長方形を描画します。

プログラムの例 rectcolor.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_rectangle(80, 80, 560, 400, width=20,

outline=’#008’, fill=’#0ff’)canvas.pack()root.mainloop()

outlineと fillで、色をあらわす文字列として空文字列を渡した場合、それは、透明な色が指定されたと解釈されます。ちなみに、 fillは、デフォルトが透明な色です。次のプログラムは、線が透明で、内部が赤紫で塗りつぶされた長方形を描画します。

プログラムの例 transparent.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_rectangle(80, 80, 560, 400, width=20,

outline=’’, fill=’#f0f’)canvas.pack()root.mainloop()

14.2 グラフィックスの描画

14.2.1 この節について第 14.1.3項で説明したように、キャンバスはさまざまなメソッドを持っていて、それらの中に

は、キャンバスの上にグラフィックスを描画するものもあります。この節では、キャンバスの上にグラフィックスを描画するメソッドを紹介したいと思います。

ただし、長方形を描画するメソッドについては、すでに第 14.1.3項で紹介しましたので、そちらを参照してください。

14.2.2 楕円キャンバスは、create_ovalというメソッドを持っています。このメソッドは、キャンバスの

上に楕円を描画します。create_ovalは、楕円に外接する長方形の位置と形状を示す次の 4個の引数を受け取ります。

1個目 外接する長方形の左上の頂点の x座標。2個目 外接する長方形の左上の頂点の y座標。3個目 外接する長方形の右下の頂点の x座標。4個目 外接する長方形の右下の頂点の y座標。

次のプログラムは、外接する長方形の左上の頂点が (80, 80)で右下の頂点が (560, 400)の楕円を描画します。

プログラムの例 oval.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_oval(80, 80, 560, 400, width=10,

outline=’#090’, fill=’#6f6’)canvas.pack()root.mainloop()

Page 112: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

112 第 14章 キャンバス

14.2.3 円弧キャンバスは、create_arcというメソッドを持っています。このメソッドは、キャンバスの

上に円弧を描画します。create_arcは、create_ovalと同じように、円弧に外接する長方形の位置と形状を示す 4個

の引数を受け取ります。ただし、円弧の場合、それらの引数だけでは形状を完全に指定することができませんので、それらに加えて、さらに次のキーワード引数を渡す必要があります。

start 円弧の開始点の角度(単位は度)。角度は、中心から見て右方向が 0度で、反時計回りに大きくなる。

extent 円弧の開始点から終了点までの角度(単位は度)。プラスの数値が指定された場合は開始点から終了点に向かって反時計回りに円弧を描画し、マイナスの数値が指定された場合は時計回りに円弧を描画する。

style 円弧のスタイル。次の識別子で指定する。

ARC 円弧のみ。fillで渡された色は無視する。CHORD 開始点と終了点をつなぐ直線を追加する。PIESLICE 中心と開始点、中心と終了点をつなぐ直線を追加する。

次のプログラムは、4個の円弧を描画します。スタイルは、上の二つが ARC、左下が CHORD、右下が PIESLICEです。

プログラムの例 arc.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_arc(60, 50, 310, 220, start=45, extent=270,

style=ARC, width=10, outline=’#900’, fill=’#f66’)canvas.create_arc(330, 50, 580, 220, start=-225, extent=-270,

style=ARC, width=10, outline=’#900’, fill=’#f66’)canvas.create_arc(60, 260, 310, 430, start=45, extent=270,

style=CHORD, width=10, outline=’#900’, fill=’#f66’)canvas.create_arc(330, 260, 580, 430, start=-225, extent=-270,

style=PIESLICE, width=10, outline=’#900’, fill=’#f66’)canvas.pack()root.mainloop()

14.2.4 折れ線キャンバスは、create_lineというメソッドを持っています。このメソッドは、キャンバスの

上に折れ線を描画します。create_lineは、折れ線を構成する個々の頂点の座標を引数として受け取ります。たとえば、

x1, y1, x2, y2,..., xn, yn

という引数を渡すと、 create_lineは、

(x1, y1), (x2, y2),..., (xn, yn)

という座標の点を順番に直線で連結することによってできる折れ線を描画します。多くのグラフィックスは、outlineというキーワード引数で線の色を指定するわけですが、折

れ線は、ほかのグラフィックスとは違って、 outlineではなくて fillで線の色を指定します。次のプログラムは、(80, 80)、(80, 400)、(560, 80)、(560, 400)という座標の点を順番に直線で

連結することによってできる折れ線を描画します。

プログラムの例 line.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_line(80, 80, 80, 400, 560, 80, 560, 400,

width=10, fill=’#060’)canvas.pack()root.mainloop()

Page 113: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

14.2. グラフィックスの描画 113

14.2.5 多角形キャンバスは、create_polygonというメソッドを持っています。このメソッドは、キャンバ

スの上に多角形を描画します。create_polygonは、create_lineと同じように、多角形を構成する個々の頂点の座標を引数

として受け取ります。たとえば、

x1, y1, x2, y2,..., xn, yn

という引数を渡すと、 create_polygonは、

(x1, y1), (x2, y2),..., (xn, yn)

という座標の点を順番に直線で連結して、さらに (xn, yn)と (x1, y1)を直線で連結することによってできる多角形を描画します。次のプログラムは、(80, 80)、(80, 400)、(560, 80)、(560, 400)という座標の点を順番に直線で連

結して、さらに (560, 400)と (80, 80)を直線で連結することによってできる多角形を描画します。

プログラムの例 polygon.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_polygon(80, 80, 80, 400, 560, 80, 560, 400,

width=10, outline=’#009’, fill=’#66f’)canvas.pack()root.mainloop()

14.2.6 文字列キャンバスは、create_textというメソッドを持っています。このメソッドは、キャンバスの

上に文字列を描画します。create_textは、文字列を描画する位置の座標を引数として受け取ります。文字列は、座標で

指定された点を中心とする位置に描画されます。さらに create_textは、次のようなキーワード引数を受け取ります。

text 描画する文字列。font 文字列を描画するために使うフォント。fill 文字列の色。

次のプログラムは、「私は文字列です。」という文字列を描画します。

プログラムの例 text.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)canvas.create_text(320, 240, text=’私は文字列です。’,

font=’Times 40’, fill=’#600’)canvas.pack()root.mainloop()

14.2.7 ウィジェットキャンバスは、 create_windowというメソッドを持っています。このメソッドは、キャンバ

スの上にウィジェットを描画します。ただし、描画するウィジェットは、描画に先立ってあらかじめ生成しておく必要があります。create_windowは、ウィジェットを描画する位置の座標を引数として受け取ります。ウィジェ

ットは、座標で指定された点を中心とする位置に描画されます。create_windowは、描画するウィジェットを、window というキーワード引数で受け取ります。次のプログラムは、ラベルをキャンバスの上に描画します。

プログラムの例 widget.py

from tkinter import *root = Tk()canvas = Canvas(root, width=640, height=480)

Page 114: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

114 第 14章 キャンバス

label = Label(root, text=’私はラベルです。’, font=’Times 40’,foreground=’#066’, background=’#6ff’)

canvas.create_window(320, 240, window=label)canvas.pack()root.mainloop()

14.3 グラフィックスの操作

14.3.1 グラフィックスの ID

キャンバスの上にグラフィックスを描画するメソッドは、戻り値として整数を返します。この整数は、描画されたグラフィックスを識別することのできる IDです。キャンバスの上に描画されたグラフィックスに対しては、その IDを指定することによって、さまざまな操作をすることができます。

14.3.2 グラフィックスのバインディングキャンバスは、 tag_bindというメソッドを持っています。このメソッドは、キャンバスの上

に描画されたグラフィックスの上で発生したイベントに対してイベントハンドラーをバインドします。tag_bindは、次の 3個の引数を受け取ります。

1個目 イベントハンドラーをバインドするグラフィックスの ID。2個目 イベントの種類を指定するイベントパターン。3個目 グラフィックスにバインドするイベントハンドラー。

次のプログラムは、2個の楕円を描画します。そして、左の楕円がクリックされると、「左の楕円がクリックされました。」と出力して、右の楕円がクリックされると、「右の楕円がクリックされました。」と出力します。

プログラムの例 bindoval.py

from tkinter import *

def left_released(event):print(’左の楕円がクリックされました。’)

def right_released(event):print(’右の楕円がクリックされました。’)

root = Tk()canvas = Canvas(root, width=640, height=480)oval1 = canvas.create_oval(80, 80, 300, 400, width=10,

outline=’#900’, fill=’#f66’)canvas.tag_bind(oval1, ’<ButtonRelease>’, left_released)oval2 = canvas.create_oval(340, 80, 560, 400, width=10,

outline=’#009’, fill=’#66f’)canvas.tag_bind(oval2, ’<ButtonRelease>’, right_released)canvas.pack()root.mainloop()

次のプログラムは、12個の楕円を描画します。そして、楕円のどれかがクリックされると、クリックされた楕円の IDを出力します。

プログラムの例 bindoval2.py

from tkinter import *

class Oval:def __init__(self, x):

self.id = canvas.create_oval(x, 120, x+30, 360,width=10, outline=’#0f9’, fill=’#9fc’)

canvas.tag_bind(self.id, ’<ButtonRelease>’,self.released)

def released(self, event):print(’私の IDは’ + str(self.id) + ’です。’)

Page 115: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

14.3. グラフィックスの操作 115

root = Tk()canvas = Canvas(root, width=640, height=480)for x in range(80, 560, 40):

Oval(x)canvas.pack()root.mainloop()

14.3.3 グラフィックスの消去キャンバスは、 deleteというメソッドを持っています。このメソッドは、キャンバスの上に

描画されたグラフィックスを消去します。deleteは、消去するグラフィックスの IDを引数として受け取ります。次のプログラムは、多数の楕円を描画します。そして、楕円のどれかがクリックされると、ク

リックされた楕円を消去します。

プログラムの例 delete.py

from tkinter import *

class Oval:def __init__(self, x1, y1):

self.id = canvas.create_oval(x1, y1, x1+20, y1+20,outline=’’, fill=’#009’)

canvas.tag_bind(self.id, ’<ButtonRelease>’,self.released)

def released(self, event):canvas.delete(self.id)

root = Tk()canvas = Canvas(root, width=640, height=480)for x in range(80, 560, 20):

for y in range(80, 380, 20):Oval(x, y)

canvas.pack()root.mainloop()

14.3.4 グラフィックスの状態の変更キャンバスは、 itemconfigureというメソッドを持っています。このメソッドは、キャンバ

スの上に描画されたグラフィックスの状態を変更します。itemconfigureは、状態を変更するグラフィックスの IDを 1個目の引数として受け取って、

さらに、状態をどのように変更するのかということを意味するキーワード引数を受け取ります。渡すことのできるキーワード引数は、グラフィックスを描画するメソッドに渡すことのできるキーワード引数と同じです。次のプログラムが表示するキャンバスは、マウスポインターが自身の上にあるときにマウスの

ボタンが押されると、その上に描画されている整数の色を赤に変更して、ボタンが離されると、整数を 1だけ増加させて、その色を元に戻します。

プログラムの例 itemconfigure.py

from tkinter import *

def pressed(event):canvas.itemconfigure(number, text=str(count), fill=’#f00’)

def released(event):global countcount += 1canvas.itemconfigure(number, text=str(count), fill=’#009’)

count = 0root = Tk()canvas = Canvas(root, width=640, height=480)canvas.bind(’<Button>’, pressed)canvas.bind(’<ButtonRelease>’, released)

Page 116: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

116 第 14章 キャンバス

number = canvas.create_text(320, 240, text=’0’,font=’Times 120’, fill=’#009’)

canvas.pack()root.mainloop()

14.3.5 グラフィックスの移動キャンバスは、 moveというメソッドを持っています。このメソッドは、キャンバスの上に描

画されたグラフィックスを移動させます。moveは、次の 3個の引数を受け取ります。

1個目 移動させるグラフィックスの ID。2個目 x軸方向の移動距離。3個目 y軸方向の移動距離。

次のプログラムは、1個の楕円を描画します。そして、キーボードの矢印キーが押されると、上下左右のそれぞれの方向へ楕円を移動させます。

プログラムの例 move.py

from tkinter import *

def move(event):if event.keysym == ’Up’:

canvas.move(oval, 0, -step)elif event.keysym == ’Down’:

canvas.move(oval, 0, step)elif event.keysym == ’Left’:

canvas.move(oval, -step, 0)elif event.keysym == ’Right’:

canvas.move(oval, step, 0)

step = 10root = Tk()root.bind(’<Key>’, move)canvas = Canvas(root, width=640, height=480)oval = canvas.create_oval(300, 220, 340, 260,

outline=’’, fill=’#090’)canvas.pack()root.mainloop()

次のプログラムは、8個の楕円を描画します。そして、楕円のどれかがドラッグされると、ドラッグされた楕円を移動させます。

プログラムの例 dragoval.py

from tkinter import *

class Oval:def __init__(self, x):

self.id = canvas.create_oval(x, 220, x+40, 260,outline=’’, fill=’#069’)

canvas.tag_bind(self.id, ’<Button-1>’,self.pressed)

canvas.tag_bind(self.id, ’<Button1-Motion>’,self.dragging)

def pressed(self, event):self.x = event.xself.y = event.y

def dragging(self, event):canvas.move(self.id, event.x-self.x, event.y-self.y)self.x = event.xself.y = event.y

root = Tk()canvas = Canvas(root, width=640, height=480)for x in range(80, 560, 60):

Oval(x)

Page 117: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

14.3. グラフィックスの操作 117

canvas.pack()root.mainloop()

14.3.6 タグキャンバスの上に描画されたグラフィックスは、IDによって識別することができるわけです

が、IDだけではなくて、「タグ」(tag)と呼ばれる文字列によって識別することも可能です。グラフィックスを描画するメソッドに、 tagsというキーワード引数で文字列を渡すと、その

文字列は、そのメソッドによって描画されたグラフィックスを識別するタグになります。たとえば、

canvas.create_oval(50, 50, 200, 200, tags=’ovals’)

という呼び出しで楕円を描画したとすると、その楕円は、ovalsというタグによって識別することができます。キャンバスが持っている、グラフィックスを操作するメソッドは、1個目の引数として、操作の

対象となるグラフィックスの IDを受け取るわけですが、IDの代わりにタグを渡すこともできます。その場合は、そのタグで識別されるグラフィックスが操作の対象となります。たとえば、

canvas.move(’ovals’, 40, 30)

と書くことによって、ovalsというタグによって識別されるグラフィックスを移動させることができます。IDは、個々のグラフィックスごとに異なる整数が与えられます。しかし、タグは IDとは違っ

て、個々のグラフィックスごとに異なっている必要はありません。複数のグラフィックスに対して同一の文字列をタグとして与えることもできます。複数のグラフィックスに対して同一の文字列をタグとして与えると、そのタグが与えられたす

べてのグラフィックスに対して一斉に同一の操作を加えることが可能になります。次のプログラムは、8個の楕円を描画します。そして、楕円のどれかがドラッグされると、す

べての楕円を移動させます。

プログラムの例 tags.py

from tkinter import *

class Oval:def __init__(self, x):

canvas.create_oval(x, 220, x+40, 260,outline=’’, fill=’#096’, tags=’ovals’)

def pressed(event):global x, yx = event.xy = event.y

def dragging(event):global x, ycanvas.move(’ovals’, event.x-x, event.y-y)x = event.xy = event.y

x = 0y = 0root = Tk()canvas = Canvas(root, width=640, height=480)for x in range(80, 560, 60):

Oval(x)canvas.tag_bind(’ovals’, ’<Button-1>’, pressed)canvas.tag_bind(’ovals’, ’<Button1-Motion>’, dragging)canvas.pack()root.mainloop()

Page 118: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

118 第 14章 キャンバス

14.4 アニメーション

14.4.1 アフター時間の経過とともに変化するグラフィックスは、「アニメーション」(animation)と呼ばれます。アニメーションを作るためには、一定の時間ごとに何らかの動作を実行する仕組みが必要です。

tkinterでは、「アフター」(after)と呼ばれる仕組みを使うことによって、一定の時間ごとに何らかの動作を実行することができます。アフターを使うためには、それを設定する必要があります。アフターを設定したいときは、ウィ

ジェットが持っている afterという関数を使います。afterは、次の 2個の引数を受け取ります。

1個目 2個目の引数として受け取った関数を実行する間隔。単位はミリ秒。2個目 関数。

次のプログラムは、キャンバスの上に描画された数値を 100ミリ秒ごとにカウントアップさせます。

プログラムの例 after.py

from tkinter import *

def countup():global countcount += 1canvas.itemconfigure(number, text=str(count))root.after(100, countup)

count = 0root = Tk()canvas = Canvas(root, width=640, height=480)number = canvas.create_text(320, 240, text=’0’,

font=’Times 120’, fill=’#090’)canvas.pack()countup()root.mainloop()

14.4.2 移動のアニメーションそれでは、アフターを使って、グラフィックスを移動させるアニメーションを作ってみましょう。グラフィックスを移動させるアニメーションを作ろうとすると、その多くの場合には、移動さ

せるグラフィックスの現在位置を取得することが必要になります。グラフィックスの現在位置は、キャンバスが持っている bboxというメソッドを呼び出すことによって取得することができます。bboxは、グラフィックスの IDを受け取って、そのグラフィックスを取り囲む長方形を示す、

(x1, y1, x2, y2)

という形のタプルを戻り値として返します。(x1, y1)というのが長方形の左上の頂点で、(x2, y2)というのが長方形の右下の頂点です。次のプログラムは、キャンバスの上に描画された楕円を左右に移動させます。

プログラムの例 rightleft.py

from tkinter import *

def rightleft():global directionx = canvas.bbox(oval)[0]if x > 550:

direction = 1 # leftelif x < 50:

direction = 0 # rightif direction == 0:

canvas.move(oval, step, 0)else:

canvas.move(oval, -step, 0)root.after(10, rightleft)

Page 119: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

119

direction = 0 # rightstep = 5root = Tk()canvas = Canvas(root, width=640, height=480)oval = canvas.create_oval(50, 220, 90, 260,

outline=’’, fill=’#690’)canvas.pack()rightleft()root.mainloop()

14.4.3 インタラクティブなアニメーション次に、インタラクティブなアニメーション、つまり、ユーザーが操作することのできるアニメー

ションを作ってみましょう。次のプログラムは、矢印のキーを押すことによって、楕円が移動する方向を変更することがで

きます。

プログラムの例 direction.py

from tkinter import *

def change_direction(event):global directionif event.keysym == ’Up’:

direction = 0elif event.keysym == ’Down’:

direction = 1elif event.keysym == ’Left’:

direction = 2elif event.keysym == ’Right’:

direction = 3

def move_oval():if direction == 0: # up

canvas.move(oval, 0, -step)elif direction == 1: # down

canvas.move(oval, 0, step)elif direction == 2: # left

canvas.move(oval, -step, 0)else:

canvas.move(oval, step, 0)root.after(10, move_oval)

direction = 3 # rightstep = 5root = Tk()root.bind(’<Key>’, change_direction)canvas = Canvas(root, width=640, height=480)oval = canvas.create_oval(50, 220, 90, 260,

outline=’’, fill=’#096’)canvas.pack()move_oval()root.mainloop()

第15章 ボタンとメニュー

15.1 ボタンの基礎

15.1.1 ボタンとは何かクリックされたときに何らかの動作を実行したり、自身の状態を変更したりするウィジェット

は、「ボタン」(button)と呼ばれます。

Page 120: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

120 第 15章 ボタンとメニュー

15.1.2 ボタンの分類tkinterには、次のような 3種類のボタンがあります。

• プッシュボタン (push button)

• チェックボタン (check box)

• ラジオボタン (radio button)

「ボタン」という言葉は、本来はこれらのウィジェットの総称ですが、プッシュボタンのことを単に「ボタン」と呼ぶこともあります。チェックボタンは、「チェックボックス」と呼ばれることもあります。

15.2 プッシュボタン

15.2.1 プッシュボタンの基礎クリックされたときに何らかの動作を実行するボタンは、「プッシュボタン」(push button)ま

たは単に「ボタン」と呼ばれます。

15.2.2 プッシュボタンの生成プッシュボタンは、 Buttonというウィジェットクラスから生成されます。Buttonには、1個目の引数として親のウィジェットを渡して、さらに次のようなキーワード引

数を渡します。

text プッシュボタンの上に表示する文字列。command プッシュボタンがクリックされたときに実行される関数またはメソッド。

次のプログラムが表示するプッシュボタンは、クリックされると、「ボタンがクリックされました。」と出力します。

プログラムの例 button.py

from tkinter import *

def clicked():print(’ボタンがクリックされました。’)

root = Tk()button = Button(root, text=’私はボタンです。’,

command=clicked, font=’Times 20’)button.pack()root.mainloop()

15.3 チェックボタン

15.3.1 チェックボタンの基礎オンの状態(チェックが入っている状態)とオフの状態(チェックが入っていない状態という

二通りの状態を持っていて、クリックすることによってそれらの状態を切り替えることのできるボタンは、「チェックボタン」(check button)と呼ばれます。

15.3.2 制御変数チェックボタンの状態は、「制御変数」(control variable)と呼ばれるオブジェクトによって保

持されます。制御変数というのは、ウィジェットが扱うことのできる、1個のオブジェクトを保持することのできるオブジェクトのことです。制御変数は、次のようなクラスから生成することができます。

IntVar 1個の整数を保持することのできる制御変数を生成する。StringVar 1個の文字列を保持することのできる制御変数を生成する。

制御変数は、次のようなメソッドを持っています。

set 引数を自身に設定する。

Page 121: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

15.4. ラジオボタン 121

get 自身が保持しているオブジェクトを返す。

15.3.3 チェックボタンの生成チェックボタンは、 Checkbuttonというウィジェットクラスから生成されます。Checkbuttonには、1個目の引数として親のウィジェットを渡して、さらに次のようなキーワー

ド引数を渡します。

text チェックボタンの上に表示する文字列。variable チェックボタンの状態として整数を保持する制御変数。

チェックボタンの初期状態は、制御変数の初期値によって決定されます。制御変数の初期値が0ならばチェックボタンの初期状態はオフで、1ならばオンです。そして、チェックボタンは、オフからオンに切り替わったときに制御変数に 1を設定して、オンからオフに切り替わったときに制御変数に 0を設定します。次のプログラムは、「状態の出力」というボタンがクリックされると、そのときのチェックボ

タンの状態を出力します。

プログラムの例 checkbutton.py

from tkinter import *

def clicked():print(’状態は’ + str(var.get()) + ’です。’)

root = Tk()var = IntVar()var.set(0)check = Checkbutton(root, text=’私はチェックボタンです。’,

variable=var, font=’Times 20’)check.pack()button = Button(root, text=’状態の出力’, command=clicked,

font=’Times 20’)button.pack()root.mainloop()

15.4 ラジオボタン

15.4.1 ラジオボタンの基礎「ラジオボタン」(radio button)と呼ばれるボタンは、チェックボタンと同じように、オンの状態(チェックが入っている状態)とオフの状態(チェックが入っていない状態という二通りの状態を持っていて、クリックすることによってそれらの状態を切り替えることができます。ラジオボタンとチェックボタンとの相違点は、前者はグループで使われるというところにあります。一つのグループを構成している 2個以上のラジオボタンは、それらのうちのどれかをクリック

すると、それがオンの状態になって、それまでオンの状態だったラジオボタンは、それと同時にオフになります。ですから、ラジオボタンは、いくつかの選択肢の中のうちのひとつを人間に選択させたい、というときに使うことができます。

15.4.2 ラジオボタンの生成ラジオボタンは、 Ratiobuttonというウィジェットクラスから生成されます。Ratiobuttonには、1個目の引数として親のウィジェットを渡して、さらに次のようなキーワー

ド引数を渡します。

text ラジオボタンの上に表示する文字列。variable ラジオボタンの状態を保持する制御変数。このキーワード引数で同一の制御変数

が設定されている複数のラジオボタンは、ひとつのグループとして動作する。value ラジオボタンを識別するオブジェクト(整数または文字列)。制御変数には、選

択されているラジオボタンを識別するオブジェクトが設定される。

ラジオボタンの状態は、制御変数に設定されているオブジェクトによって決定されます。制御変数の値と、valueで設定されたオブジェクトとが等しいならば、そのラジオボタンの状態はオ

Page 122: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

122 第 15章 ボタンとメニュー

ンで、等しくないならばオフです。そして、ラジオボタンは、自分がクリックされたときに、自分を識別するオブジェクトを制御変数に設定します。次のプログラムは、「選択結果の出力」というボタンがクリックされると、そのときにオンに

なっているラジオボタンを識別する文字列を出力します。

プログラムの例 radiobutton.py

from tkinter import *

def clicked():print(’選択結果は’ + str(var.get()) + ’です。’)

root = Tk()var = StringVar()var.set(’カツ丼’)yakisoba = Radiobutton(root, text=’焼きそば’, value=’焼きそば’,

variable=var, font=’Times 20’)yakisoba.pack()yudoufu = Radiobutton(root, text=’湯豆腐’, value=’湯豆腐’,

variable=var, font=’Times 20’)yudoufu.pack()katsudon = Radiobutton(root, text=’カツ丼’, value=’カツ丼’,

variable=var, font=’Times 20’)katsudon.pack()button = Button(root, text=’選択結果の出力’, command=clicked,

font=’Times 20’)button.pack()root.mainloop()

15.5 メニュー

15.5.1 メニューの基礎クリックされたときに選択肢を表示して、それらの選択肢のひとつがクリックされると、何ら

かの動作をする、というウィジェットは、「メニュー」(menu)と呼ばれます。メニューを構成している個々の選択肢は、「メニュー項目」(menu item)と呼ばれます。

15.5.2 メニューの生成メニューは、 Menuというウィジェットクラスから生成されます。Menuには、引数として親のウィジェットを渡します。

15.5.3 メニュー項目の追加メニューは、add_commandというメソッドを持っています。このメソッドは、メニュー項目を

メニューに追加します。add_commandには、次のようなキーワード引数を渡すことができます。

label メニュー項目の上に表示する文字列。command メニュー項目がクリックされたときに呼び出される関数またはメソッド。

15.5.4 メニューバーウィンドウのタイトルバーの下に取り付けられたメニューは、「メニューバー」(menu bar)と

呼ばれます。ウィンドウが持っている configを呼び出して、menuというキーワード引数で、そのメソッド

にメニューを渡すと、そのメニューは、そのウィンドウのメニューバーになります。次のプログラムは、メニューバーが取り付けられたウィンドウを表示します。

プログラムの例 menubar.py

from tkinter import *

def yakisoba():print(’焼きそばがクリックされました。’)

Page 123: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

15.5. メニュー 123

def katsugon():print(’カツ丼がクリックされました。’)

root = Tk()menubar = Menu(root)menubar.add_command(label=’焼きそば’, command=yakisoba)menubar.add_command(label=’カツ丼’, command=katsugon)root.config(menu=menubar)root.mainloop()

15.5.5 サブメニューメニューは、何重にでも入れ子にすることができます。メニューの中に含まれているメニュー

は、「サブメニュー」(submenu)と呼ばれます。サブメニューも、 Menuというウィジェットクラスから生成されるウィジェットです。サブメ

ニューを生成する場合、 Menuには、親になるメニューを引数として渡します。サブメニューは、メニューバーから切り離して、独立したウィンドウにする、ということも可

能です。デフォルトでは、サブメニューは切り離しが可能なように設定されています。もしも切り離しができないように設定したいときは、Menuに対して、tearoffというキーワード引数で0という整数を渡します。メニューが持っている add_cascadeというメソッドを呼び出して、サブメニューを引数とし

て渡すと、そのサブメニューがメニューに追加されます。add_cascadeには、次のようなキーワード引数を渡すことができます。

label サブメニューの上に表示する文字列。menu サブメニューとして追加するメニュー。

メニューが持っている add_separatorというメソッドは、サブメニューに対して、メニュー項目とメニュー項目とのあいだの区切りを追加します。次のプログラムは、サブメニューを持つメニューバーが取り付けられたウィンドウを表示し

ます。

プログラムの例 submenu.py

from tkinter import *

def yakisoba():print(’焼きそばがクリックされました。’)

def katsugon():print(’カツ丼がクリックされました。’)

def milk():print(’ミルクがクリックされました。’)

def coffee():print(’コーヒーがクリックされました。’)

def mizu():print(’水がクリックされました。’)

root = Tk()menubar = Menu(root)tabemono = Menu(menubar, tearoff=0)tabemono.add_command(label=’焼きそば’, command=yakisoba)tabemono.add_command(label=’カツ丼’, command=katsugon)menubar.add_cascade(label=’食べ物’, menu=tabemono)nomimono = Menu(menubar, tearoff=0)nomimono.add_command(label=’ミルク’, command=milk)nomimono.add_command(label=’コーヒー’, command=coffee)nomimono.add_separator()nomimono.add_command(label=’水’, command=mizu)menubar.add_cascade(label=’飲み物’, menu=nomimono)root.config(menu=menubar)root.mainloop()

Page 124: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

124 第 15章 ボタンとメニュー

15.5.6 チェックボタンのメニュー項目メニューに追加することのできるメニュー項目としては、通常のもののほかに、チェックボタ

ンの機能を持つものや、ラジオボタンの機能を持つものがあります。メニューが持っている add_checkbuttonというメソッドは、チェックボタンの機能を持つメ

ニュー項目をメニューに追加します。add_checkbuttonには、次のようなキーワード引数を渡すことができます。

label メニュー項目の上に表示する文字列。variable チェックボタンの状態を保持する制御変数。

次のプログラムが表示するウィンドウは、チェックボタンの機能を持つメニュー項目を含むメニューを持っています。

プログラムの例 checkmenu.py

from tkinter import *

def condition():print(’状態は’ + str(var.get()) + ’です。’)

root = Tk()var = IntVar()var.set(0)menubar = Menu(root)checkmenu = Menu(menubar, tearoff=0)checkmenu.add_checkbutton(label=’チェックボタン’, variable=var)checkmenu.add_command(label=’状態の出力’, command=condition)menubar.add_cascade(label=’チェックボタンのあるメニュー’,

menu=checkmenu)root.config(menu=menubar)root.mainloop()

15.5.7 ラジオボタンのメニュー項目メニューが持っている add_radiobuttonというメソッドは、ラジオボタンの機能を持つメニュー

項目をメニューに追加します。add_radiobuttonには、次のようなキーワード引数を渡すことができます。

label メニュー項目の上に表示する文字列。variable ラジオボタンの状態を保持する制御変数。value ラジオボタンを識別するオブジェクト(整数または文字列)。

次のプログラムが表示するウィンドウは、ラジオボタンの機能を持つメニュー項目を含むメニューを持っています。

プログラムの例 radiomenu.py

from tkinter import *

def selected():print(’選択結果は’ + str(var.get()) + ’です。’)

root = Tk()var = StringVar()var.set(’カツ丼’)menubar = Menu(root)radiomenu = Menu(menubar, tearoff=0)radiomenu.add_radiobutton(label=’焼きそば’, value=’焼きそば’,

variable=var)radiomenu.add_radiobutton(label=’湯豆腐’, value=’湯豆腐’,

variable=var)radiomenu.add_radiobutton(label=’カツ丼’, value=’カツ丼’,

variable=var)radiomenu.add_separator()radiomenu.add_command(label=’選択結果の出力’, command=selected)

Page 125: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

125

menubar.add_cascade(label=’ラジオボタンのあるメニュー’,menu=radiomenu)

root.config(menu=menubar)root.mainloop()

第16章 ジオメトリーマネージャー

16.1 pack

16.1.1 packについての復習すでに第 12.2.6項で簡単に説明したように、ウィジェットが持っている、自身の配置を管理す

るメソッドは、「ジオメトリーマネージャー」(geometry manager)と呼ばれます。tkinterには、 pack、 grid、 placeという 3種類のジオメトリーマネージャーがあります。packは、親のウィジェットを必要最小限に小さくして、その中に自身を詰め込む、という動

作をするジオメトリーマネージャーです。

16.1.2 packが受け取る引数

packは、次のようなキーワード引数を受け取ることができます。

side ウィジェットを詰め込む方向。anchor 配置領域の中での位置。fill 引き伸ばしの指定。padx x軸方向の余白の大きさ。pady y軸方向の余白の大きさ。ipadx x軸方向の詰めものの大きさ。ipady y軸方向の詰めものの大きさ。

16.1.3 詰め込みの方向

packを使ってウィジェットを思ったとおりの位置に配置するためには、そのウィジェットを親に対してどういう方向へ詰め込むのかということを指定する必要があります。それを指定したいときは、 sideというキーワード引数で、方向を指定する文字列を packに渡します。sideで渡すことのできる文字列のそれぞれには、 TOP、 BOTTOM、 LEFT、 RIGHTという識別

子が束縛されています。それぞれの識別子は、親に対してウィジェットを詰め込む方向を示しています。デフォルトは TOPです。packによってウィジェットがどのように配置されのるかというのは、詰め込む順番に依存し

て決まります。指定された方向へウィジェットが詰め込まれると、それとは逆の方向に、仮想的な残りの領域ができます。そして、それ以降に詰め込まれるウィジェットは、その残りの領域を使うことになります。ですから、ウィジェットを詰め込む方向というのは、それ以降に詰め込むウィジェットの位置を決定するためのものだと考えるとわかりやすいでしょう。次のプログラムは、詰め込みの方向を指定して三つのプッシュボタンをウィンドウに詰め込み

ます。

プログラムの例 side.py

from tkinter import *root = Tk()button = Button(root, text=’1:LEFT’, font=’Times 20’)button.pack(side=LEFT)button = Button(root, text=’2:TOP’, font=’Times 20’)button.pack(side=TOP)button = Button(root, text=’3:LEFT’, font=’Times 20’)button.pack(side=LEFT)root.mainloop()

ひとつ目のプッシュボタンは左の方向へ詰め込まれていますので、それ以降に詰め込まれるウィジェットは、その右側の領域を使うことになります。そして、二つ目のプッシュボタンは上

Page 126: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

126 第 16章 ジオメトリーマネージャー

の方向へ詰め込まれていますので、それ以降に詰め込まれるウィジェットは、その下の領域を使うことになります。

16.1.4 配置領域の中での位置親の上に残されている、ウィジェットを詰め込むことのできる領域のことを、「配置領域」と

呼ぶことにしましょう。そして、詰め込まれるウィジェットそのものの領域のことを「表示領域」と呼ぶことにしましょう。表示領域が配置領域よりも小さい場合、ウィジェットは、デフォルトでは配置領域の中央に配

置されます。しかし、配置領域の中のそれ以外の位置にウィジェットを配置することも可能です。それをしたいときは、 anchorというキーワード引数で、ウィジェットを配置する位置を指定する文字列を packに渡します。anchorで渡すことのできる文字列には、次のような識別子が束縛されています。

NW N NE

W CENTER E

SW S SE

ちなみに、CENTERを除くそれぞれの識別子は、east、west、north、south、north east、southeast、north west、south westという、方位を示す言葉の頭字語です。次のプログラムは、「左右に長いプッシュボタン」というプッシュボタンの下に、左右の長さがそ

れよりも短い二つのプッシュボタンを配置します。「デフォルト」というプッシュボタンは anchor

がデフォルトで、「右寄せ」というプッシュボタンは、 Eという識別子が束縛されている文字列を anchorで渡しています。

プログラムの例 anchor.py

from tkinter import *root = Tk()button = Button(root, text=’左右に長いプッシュボタン’,

font=’Times 20’)button.pack()button = Button(root, text=’デフォルト’, font=’Times 20’)button.pack()button = Button(root, text=’右寄せ’, font=’Times 20’)button.pack(anchor=E)root.mainloop()

16.1.5 引き延ばしウィジェットの大きさというのは、基本的には、その内部に表示されるものの大きさによって

決まります。しかし、いくつかのウィジェットを並べて配置する場合には、それらの大きさをそろえないと、見栄えがよくありません。並んでいるいくつかのウィジェットの大きさをそろえたいときは、小さなウィジェットを大き

く引き延ばす、という技法を使います。ウィジェットの大きさを引き延ばしたいときは、 fill

というキーワード引数で、引き伸ばす方向を指定する文字列を packに渡します。fillで渡すことのできる文字列には、 NONE、 X、 Y、 BOTHという識別子が束縛されていま

す。NONEは引き延ばさない、Xは x軸方向にのみ引き延ばす、Yは y軸方向にのみ引き延ばす、BOTHはどちらの方向にも引き延ばすという意味で、デフォルトは NONEです。次のプログラムは、「左右に長いプッシュボタン」という文字列を表示するプッシュボタンの

下に、表示する文字列がそれよりも短い二つのプッシュボタンを配置します。「デフォルト」というプッシュボタンは fillがデフォルトで、「引き伸ばし」というプッシュボタンは、Xという識別子が束縛されている文字列を fillで渡しています。

プログラムの例 fill.py

from tkinter import *root = Tk()button = Button(root, text=’左右に長いプッシュボタン’,

font=’Times 20’)button.pack()button = Button(root, text=’デフォルト’, font=’Times 20’)button.pack()

Page 127: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

16.2. grid 127

button = Button(root, text=’引き伸ばし’, font=’Times 20’)button.pack(fill=X)root.mainloop()

16.1.6 余白ウィジェットの周囲に余白を作りたいときは、padxまたは padyというキーワード引数で、余

白の大きさを packに渡します。 padxを渡すことによって x軸方向の余白の大きさを、 padyを渡すことによって y軸方向の余白の大きさを指定することができます。余白の大きさの単位はピクセルです。次のプログラムは、二つのプッシュボタンをウィンドウに詰め込みます。上のプッシュボタン

は余白がデフォルトで、下のプッシュボタンには上下左右に 50ピクセルの余白が指定されています。

プログラムの例 pad.py

from tkinter import *root = Tk()button = Button(root, text=’デフォルト’, font=’Times 20’)button.pack()button = Button(root, text=’上下左右に余白’, font=’Times 20’)button.pack(padx=50, pady=50)root.mainloop()

16.1.7 詰めものウィジェットの上に表示されるテキストなどの周囲に詰めものを詰めることによってウィジェ

ットの大きさを大きくする、ということも可能です。それをしたいときは、ipadxまたは ipady

というキーワード引数で、詰め物の大きさを packに渡します。 ipadxを渡すことによって x軸方向の詰めものの大きさを、ipadyを渡すことによって y軸方向の詰めものの大きさを指定することができます。詰めものの大きさの単位はピクセルです。次のプログラムは、二つのプッシュボタンをウィンドウに詰め込みます。上のプッシュボタン

は詰めものがデフォルトで、下のプッシュボタンには上下左右に 50ピクセルの詰めものが指定されています。

プログラムの例 ipad.py

from tkinter import *root = Tk()button = Button(root, text=’デフォルト’, font=’Times 20’)button.pack()button = Button(root, text=’上下左右に詰めもの’,

font=’Times 20’)button.pack(ipadx=50, ipady=50)root.mainloop()

16.2 grid

16.2.1 gridの基礎

gridは、ウィジェットを 2次元の表の形に並べるジオメトリーマネージャーです。2次元の表を構成するそれぞれの部分は、「セル」(cell)と呼ばれます。そして、水平方向にセ

ルを並べたものは「行」(row)と呼ばれ、垂直方向にセルを並べたものは「列」(column)と呼ばれます。

16.2.2 gridが受け取る引数

gridは、次のようなキーワード引数を受け取ることができます。

row 行の番号(もっとも上の行は 0)。column 列の番号(もっとも左の列は 0)。rowspan 何行にまたがって配置するか。columnspan 何列にまたがって配置するか。

Page 128: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

128 第 16章 ジオメトリーマネージャー

sticky 配置領域の中にどのように配置するか。padx x軸方向の余白の大きさ。pady y軸方向の余白の大きさ。ipadx x軸方向の詰めものの大きさ。ipady y軸方向の詰めものの大きさ。

16.2.3 行と列の番号

gridを使ってウィジェットを配置するためには、最低限、何行目の何列目にそれを配置するのかという位置を指定する必要があります。位置の指定には、 rowと columnというキーワード引数を使います。 rowは行の番号で、もっ

とも上の行を 0と数えます。 columnは行の番号で、もっとも左の列を 0と数えます。次のプログラムは、 gridを使って、4行 3列の表の形にプッシュボタンを配置します。

プログラムの例 grid.py

from tkinter import *root = Tk()for i in range(4):

for j in range(3):button = Button(root,

text=str(i)+’行目の’+str(j)+’列目’, font=’Times 20’)button.grid(row=i, column=j)

root.mainloop()

16.2.4 複数のセルにまたがった配置

packは、垂直方向または水平方向に並んでいる連続した複数のセルにひとつのウィジェットを配置するということもできます。rowspanというキーワード引数でプラスの整数 nを渡すと、ウィジェットは、rowで指定され

た位置から下向きに n個の連続したセルに配置されます。同じように、columnspanというキーワード引数でプラスの整数 nを渡すと、ウィジェットは、

columnで指定された位置から右向きに n個の連続したセルに配置されます。次のプログラムは、4個のプッシュボタンをウィンドウの上に配置します。そのうちのひとつ

は垂直方向の二つのセルに配置され、別のひとつは水平方向の二つのセルに配置されます。

プログラムの例 span.py

from tkinter import *root = Tk()button = Button(root, text=’0行目と 1行目の 0列目’,

font=’Times 20’)button.grid(row=0, column=0, rowspan=2)button = Button(root, text=’0行目の 1列目’, font=’Times 20’)button.grid(row=0, column=1)button = Button(root, text=’0行目の 2列目’, font=’Times 20’)button.grid(row=0, column=2)button = Button(root, text=’1行目の 1列目と 2列目’,

font=’Times 20’)button.grid(row=1, column=1, columnspan=2)root.mainloop()

16.2.5 配置領域の中での表示方法

packの場合、配置領域の中での位置を指定するキーワード引数は anchorで、ウィジェットを引き伸ばす方向を指定するキーワード引数は fillでした。それに対して gridの場合は、配置領域の中での位置も、ウィジェットを引き伸ばす方向も、 stickyというひとつのキーワード引数を使って指定します。配置領域の中での位置を指定する方法は、packの anchorと同じです。N、NE、Eなどの方位

を示す識別子が束縛されている文字列を、stickyというキーワード引数で gridに渡すと、ウィジェットは、方位で指定された位置に表示されます。ウィジェットを引き伸ばす場合は、識別子が束縛されている文字列を次のように連結します。

Page 129: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

16.3. place 129

N+S 垂直方向に引き伸ばす。E+W 水平方向に引き伸ばす。N+E+S+W 垂直方向と水平方向の両方に引き伸ばす。

次のプログラムは、「左右に長いプッシュボタン」というプッシュボタンの下に、左右の長さがそれよりも短い三つのプッシュボタンを配置します。「デフォルト」というプッシュボタンは sticky

がデフォルトで、「右寄せ」というプッシュボタンは、 Eという識別子が束縛されている文字列を stickyで渡していて、「引き伸ばし」というプッシュボタンは、E+Wという二つの識別子のそれぞれに束縛されている文字列を連結したものを stickyで渡しています。

プログラムの例 sticky.py

from tkinter import *root = Tk()button = Button(root, text=’左右に長いプッシュボタン’,

font=’Times 20’)button.grid(row=0, column=0)button = Button(root, text=’デフォルト’, font=’Times 20’)button.grid(row=1, column=0)button = Button(root, text=’右寄せ’, font=’Times 20’)button.grid(row=2, column=0, sticky=E)button = Button(root, text=’引き伸ばし’, font=’Times 20’)button.grid(row=3, column=0, sticky=W+E)root.mainloop()

16.3 place

16.3.1 placeの基礎

placeは、指定された座標によってウィジェットを配置するジオメトリーマネージャーです。placeを使ってウィジェットを配置する場合には、配置するウィジェットの親となるウィジェ

ットの大きさを設定しておく必要があります。

16.3.2 ルートウィジェットの大きさウィジェットの大きさは、ウィジェットクラスに対して、widthというキーワード引数で横の

長さ、 heightというキーワード引数で縦の長さを渡すことによって指定することができるのですが、ルートウィジェットの大きさを指定する場合は、それらの引数を、ウィジェットクラスではなくて、生成されたルートウィジェットが持っている configに渡す必要があります。次のプログラムは、横の長さが 600ピクセル、縦の長さが 400ピクセルのルートウィジェット

を表示します。

プログラムの例 rootsize.py

from tkinter import *root = Tk()root.config(width=600, height=400)root.mainloop()

16.3.3 絶対的な座標によるウィジェットの配置親のウィジェットの上の位置を絶対的な座標で指定してウィジェットを配置したいときは、x

と yというキーワード引数で、絶対的な x座標と y座標を placeに渡します。次のプログラムは、絶対的な座標を指定して二つのプッシュボタンを配置します。

プログラムの例 xy.py

from tkinter import *root = Tk()root.config(width=600, height=400)button = Button(root, text=’(200, 100)’, font=’Times 20’)button.place(x=200, y=100)button = Button(root, text=’(300, 200)’, font=’Times 20’)button.place(x=300, y=200)root.mainloop()

Page 130: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

130 第 16章 ジオメトリーマネージャー

16.3.4 相対的な座標によるウィジェットの配置親のウィジェットの上の位置を相対的な座標で指定してウィジェットを配置したいしたいとき

は、relxと relyというキーワード引数で、相対的な x座標と y座標を placeに渡します。相対的な座標は、0から 1までの浮動小数点数です。次のプログラムは、相対的な座標を指定して二つのプッシュボタンを配置します。

プログラムの例 relxrely.py

from tkinter import *root = Tk()root.config(width=600, height=400)button = Button(root, text=’(0.333, 0.25)’, font=’Times 20’)button.place(relx=0.333, rely=0.25)button = Button(root, text=’(0.5, 0.5)’, font=’Times 20’)button.place(relx=0.5, rely=0.5)root.mainloop()

16.4 フレーム

16.4.1 フレームの基礎tkinterのウィジェットは、 pack、 grid、 placeという 3種類のジオメトリーマネージャー

を持っているわけですが、それらのうちで万能のものというのは存在しません。ですから、どのジオメトリーマネージャーを選んでも望みどおりにウィジェットを配置することができない、ということもしばしばあります。しかし、そのような問題の多くは、「フレーム」(frame)と呼ばれるウィジェットを使うことによって解決することができます。フレームというのは、その上にウィジェットを配置するということだけを機能として持つウィ

ジェットのことです。ウィンドウの上に複数のフレームを配置して、それらのフレームの上に複数のウィジェットを

配置することによって、どんなに複雑な配置でも可能になります。

16.4.2 フレームの生成フレームは、 Frameというウィジェットクラスから生成されます。Frameには、1個目の引数として親のウィジェットを渡して、さらに次のようなキーワード引

数を渡します。

width 横の長さ。height 縦の長さ。borderwidth 境界線の幅。デフォルトは 0。relief 境界線のスタイル。padx x軸方向の詰めものの大きさ。pady y軸方向の詰めものの大きさ。

次のプログラムは、二つのフレームを左右に並べて、左のフレームの上には 4行 3列でプッシュボタンを並べて、右のフレームの上には 3行 4列でプッシュボタンを並べています。

プログラムの例 frame.py

from tkinter import *root = Tk()left = Frame(root, padx=50, pady=50)left.pack(side=LEFT)right = Frame(root, padx=50, pady=50)right.pack()for i in range(4):

for j in range(3):button = Button(left, text=str(i)+’, ’+str(j),

font=’Times 20’)button.grid(row=i, column=j)

for i in range(3):

Page 131: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

131

for j in range(4):button = Button(right, text=str(i)+’, ’+str(j),

font=’Times 20’)button.grid(row=i, column=j)

root.mainloop()

16.4.3 境界線のスタイル

borderwidthというキーワード引数で Frameに 1以上の数値を渡すと、その数値を幅とする境界線が表示されます。境界線のスタイルは、reliefというキーワード引数で、次の識別子を Frameに渡すことによっ

て指定することができます。

FLAT RAISED SUNKEN GROOVE RIDGE

次のプログラムは、境界線のスタイルが異なる 5個のフレームを表示します。

プログラムの例 relief.py

from tkinter import *root = Tk()for relief in (FLAT, RAISED, SUNKEN, GROOVE, RIDGE):

frame = Frame(root, borderwidth=6, relief=relief)frame.pack(side=LEFT, padx=20, pady=20)label = Label(frame, text=relief, font=’Times 20’)label.pack()

root.mainloop()

16.4.4 ラベルフレームフレームを生成するウィジェットクラスとしては、Frameのほかに、LabelFrameというもの

もあります。LabelFrameが生成するフレームは、「ラベルフレーム」(label frame)と呼ばれます。ラベルフ

レームは、その名前のとおり、ラベルを表示することのできるフレームです。LabelFrameには、1個目の引数として親のウィジェットを渡して、さらに、ラベルにする文

字列とラベルの位置を次のキーワード引数で渡します。

text ラベルにする文字列。labelanchor ラベルの位置。nw、n、ne、en、e、esというような、方角を示す文字列で

指定する。

ちなみに、 Frameに渡すことのできるキーワード引数は、 LabelFrameにも渡すことができます。次のプログラムは、ラベルの位置が異なる 12個のラベルフレームを表示します。

プログラムの例 labelframe.py

from tkinter import *root = Tk()for anchor in (’nw’, ’n’, ’ne’, ’en’, ’e’, ’es’, ’se’,

’s’, ’sw’, ’ws’, ’w’, ’wn’):frame = LabelFrame(root, text=anchor, labelanchor=anchor)frame.pack(side=LEFT, padx=5, pady=5, ipadx=25, ipady=25)

root.mainloop()

第17章 文字列入力ウィジェット

17.1 文字列入力ウィジェットの基礎

17.1.1 エントリーとテキストウィジェットこの章では、人間がそれを使って文字列を入力したり編集したりすることのできるウィジェッ

トを紹介したいと思います。

Page 132: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

132 第 17章 文字列入力ウィジェット

tkinterには、文字列の入力や編集に使うことのできるウィジェットとして、次の二つのものがあります。

• エントリー (entry)

• テキストウィジェット (text widget)

17.1.2 フォーカスキーボードというのはひとつのコンピュータにひとつだけしかありませんので、表示されてい

るいくつかのウィジェットのうちで、キーボードから入力された文字を受け取ることができるものは、ひとつの時点ではひとつだけです。キーボードから入力された文字を受け取ることができる状態にあるウィジェットは、「フォーカス」(focus)が設定されている、と言われます。フォーカスの設定は、マウスやキーボードの操作によって切り替えることも可能ですが、プロ

グラムの側で特定のウィジェットにフォーカスを設定することも可能です。ウィジェットは、focus_setというメソッドを持っています。特定のウィジェットにフォーカ

スを設定したいときは、そのウィジェットが持っているこのメソッドを呼び出します。

17.2 エントリー

17.2.1 エントリーの基礎1行だけの文字列(つまり改行を含まない文字列)を人間から受け取るウィジェットは、「エン

トリー」(entry)と呼ばれます。

17.2.2 エントリーの生成エントリーは、 Entryというウィジェットクラスから生成されます。Entryには、1個目の引数として親のウィジェットを渡します。デフォルトでは、エントリーの横の長さは、20文字を表示することのできる長さに設定され

ています。それとは異なる長さを設定したいときは、widthというキーワード引数で、表示することのできる文字数を Entryに渡します。なお、入力することのできる文字列の長さは、エントリーの横の長さには制限されません。

17.2.3 エントリーからの文字列の取り出しエントリーに入力されている文字列を取り出したいときは、 getというメソッドを使います。

getは、エントリーに入力されている文字列を戻り値として返します。次のプログラムは、「転送」というプッシュボタンが押されると、そのときにエントリーに入

力されている文字列をラベルへ転送します。

プログラムの例 entry.py

from tkinter import *

def transfer():label.config(text=entry.get())

root = Tk()entry = Entry(root, width=30, font=’Times 20’)entry.pack()entry.focus_set()button = Button(root, text=’転送’, command=transfer,

font=’Times 20’)button.pack()label = Label(root, font=’Times 20’)label.pack()root.mainloop()

17.2.4 エンターキーのバインディング「エンターキーが押された」というイベントにイベントハンドラーをバインドしておくことによって、エンターキーが押されたときにエントリーに入力された文字列を処理する、ということもできます。

Page 133: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

17.3. テキストウィジェット 133

エンターキーのキーシムは Returnですので、「エンターキーが押された」というイベントをバインドするためのイベントパターンは、

<Key-Return>

と書くことができます。次のプログラムは、エンターキーが押されると、そのときにエントリーに入力されている文字

列をラベルへ転送します。

プログラムの例 enter.py

from tkinter import *

def transfer(event):label.config(text=entry.get())

root = Tk()entry = Entry(root, width=30, font=’Times 20’)entry.bind(’<Key-Return>’, transfer)entry.pack()entry.focus_set()label = Label(root, font=’Times 20’)label.pack()root.mainloop()

17.2.5 エントリーへの制御変数の設定

Entryに対しては、textvariableというキーワード引数で、文字列を保持することのできる制御変数を渡すことができます。そうすることによって制御変数をエントリーに設定しておくと、そのエントリーに入力された文字列は、制御変数の中に自動的に設定されます。Labelに対しても、Entryと同様に、textvariableというキーワード引数で、文字列を保持

することのできる制御変数を渡すことができます。制御変数が設定されたラベルは、その制御変数に設定されている文字列を表示することになります。次のプログラムは、エントリーに入力された文字列を、入力と同時にラベルに表示します。

プログラムの例 textvariable.py

from tkinter import *root = Tk()var = StringVar()entry = Entry(root, width=30, textvariable=var, font=’Times 20’)entry.pack()entry.focus_set()label = Label(root, textvariable=var, font=’Times 20’)label.pack()root.mainloop()

17.3 テキストウィジェット

17.3.1 テキストウィジェットの基礎改行を含む文字列、つまりいくつかの行から構成される文字列を人間から受け取るウィジェッ

トは、「テキストウィジェット」(text widget)と呼ばれます。

17.3.2 テキストウィジェットの生成テキストウィジェットは、 Textというウィジェットクラスから生成されます。Textには、1個目の引数として親のウィジェットを渡します。さらに Textは、次のようなキー

ワード引数を受け取ります。

width 横の長さ。1行のうちで表示することのできる文字数。height 縦の長さ。表示することのできる行数。wrap widthで設定した文字数よりも長い行を折り返すかどうかということを指定する文字

列。次の識別子を使うことができる。

Page 134: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

134 第 17章 文字列入力ウィジェット

CHAR 文字単位で折り返す。WORD 単語単位で折り返す。NONE 折り返さない(左右にスクロールして表示)。

次のプログラムは、テキストウィジェットを持つウィンドウを表示します。

プログラムの例 textwidget.py

from tkinter import *root = Tk()text = Text(root, width=30, height=10, wrap=WORD,

font=’Times 20’)text.pack()text.focus_set()root.mainloop()

17.3.3 テキストウィジェットからの文字列の取り出しテキストウィジェットに入力されている文字列を取り出したいときは、getというメソッドを

使います。 getは、テキストウィジェットに入力されている文字列を戻り値として返します。エントリーの getとは違って、テキストウィジェットの getには 2個の引数を渡す必要があり

ます。それらの引数は、取り出す文字列の範囲を指定するものです。1個目の引数は開始位置を示す文字列で、2個目の引数は終了位置を示す文字列です。文字列の中の位置を示す文字列は、行の番号と文字の番号をドット ( . )で区切って並べたもの

です。先頭の行は 1行目と数え、左端の文字は 0文字目と数えます。たとえば、5.8という文字列は、5行目の 8文字目という意味になります。文字列の末尾を指定したいときは、ENDという識別子が束縛されている文字列を指定します。次のプログラムは、「転送」というプッシュボタンが押されると、そのときにテキストウィジェ

ットに入力されている文字列の全体をラベルへ転送します。

プログラムの例 get.py

from tkinter import *

def transfer():label.config(text=text.get("1.0", END))

root = Tk()text = Text(root, width=30, height=5, wrap=CHAR,

font=’Times 20’)text.pack()text.focus_set()button = Button(root, text=’転送’, command=transfer,

font=’Times 20’)button.pack()label = Label(root, font=’Times 20’)label.pack()root.mainloop()

17.3.4 スクロールバーの生成ウィジェットをスクロールさせるために使われるウィジェットは、「スクロールバー」(scroll

bar)と呼ばれます。スクロールバーは、 Scrollbarというウィジェットクラスから生成されます。Scrollbarには、1個目の引数として親のウィジェットを渡して、さらに、orientというキー

ワード引数で、スクロールの方向を指定する文字列を渡します。次の識別子は、スクロールの方向を指定する文字列に束縛されています。

HORIZONTAL 水平方向。VERTICAL 垂直方向。

17.3.5 ウィジェットとスクロールバーの連動ウィジェットとスクロールバーとを連動させるためには、configを呼び出すことによって、そ

れぞれが持っているメソッドを相互に設定する必要があります。

Page 135: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

135

ウィジェットとスクロールバーとを連動させるためには、そのスクロールバーが持っている configを呼び出して、 commandというキーワード引数で、そのウィジェットが持っている次のメソッドを渡す必要があります。

xview 水平方向のスクロールバーに渡すメソッド。yview 垂直方向のスクロールバーに渡すメソッド。

ウィジェットとスクロールバーとを連動させるためには、さらに、そのウィジェットが持っている configを呼び出して、次のキーワード引数で、そのスクロールバーが持っている setというメソッドを渡す必要があります。

xscrollcommand 水平方向のスクロールバーの setを渡すキーワード引数。yscrollcommand 垂直方向のスクロールバーの setを渡すキーワード引数。

次のプログラムは、スクロールバーを使ってスクロールさせることのできるテキストウィジェットを持つウィンドウを表示します。

プログラムの例 scroll.py

from tkinter import *root = Tk()text = Text(root, width=30, height=5, wrap=NONE,

font=’Times 20’)text.grid(row=0, column=0)horizontal = Scrollbar(root, orient=HORIZONTAL)horizontal.config(command=text.xview)horizontal.grid(row=1, column=0, sticky=E+W)vertical = Scrollbar(root, orient=VERTICAL)vertical.config(command=text.yview)vertical.grid(row=0, column=1, sticky=N+S)text.config(xscrollcommand=horizontal.set)text.config(yscrollcommand=vertical.set)text.focus_set()root.mainloop()

第18章 定型的なダイアログボックス

18.1 定型的なダイアログボックスの基礎

18.1.1 ダイアログボックスとは何か人間との対話のためにプログラムが一時的に画面に表示するウィンドウは、「ダイアログボッ

クス」(dialog box)と呼ばれます。ダイアログボックスというのはウィンドウの一種ですので、ダイアログボックスも、ウィンド

ウを生成するウィジェットクラスを呼び出すことによって生成することができます。そのような方法によるダイアログボックスの作り方については、第 19.3節で説明することにしたいと思います。しかし、もっと簡単にダイアログボックスを表示する方法もあります。頻繁に使われる定型的

なダイアログボックスについては、ただ単にメソッドを呼び出すだけで表示することができます。

18.1.2 定型的なダイアログボックスの分類メソッドを呼び出すだけで表示することのできる定型的なダイアログボックスは、次の 3種類

に分類することができます。

• メッセージボックス (message box)

• ファイル選択ダイアログボックス (file dialog)

• 色選択ダイアログボックス (color chooser)

Page 136: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

136 第 18章 定型的なダイアログボックス

18.2 メッセージボックス

18.2.1 メッセージボックスの基礎人間に対してメッセージを伝えたり、人間に対して単純な問い合わせをしたりするときに使わ

れる定型的なダイアログボックスは、「メッセージボックス」(message box)と呼ばれます。メッセージボックスを表示するメソッドは、

tkinter.messagebox

というライブラリーの中で定義されていますので、プログラムの先頭に、

from tkinter.messagebox import *

と書いておけば、それらのメソッドを呼び出すことができるようになります。

18.2.2 メッセージボックスを表示するメソッドメッセージボックスを表示するメソッドには、次のようなものがあります。

showinfo 情報を表示するメッセージボックス。showwarning 警告を表示するメッセージボックス。showerror エラーメッセージを表示するメッセージボックス。askyesno 「はい」または「いいえ」で答える質問を表示するメッセージボックス。戻

り値は真偽値で、「はい」ならば真、「いいえ」ならば偽。askquestion 「はい」または「いいえ」で答える質問を表示するメッセージボックス。戻

り値は文字列で、「はい」ならば yes、「いいえ」ならば no。askokcancel 「OK」または「キャンセル」で答える質問を表示するメッセージボックス。

戻り値は真偽値で、「OK」ならば真、「キャンセル」ならば偽。askretrycancel 「再試行」または「キャンセル」で答える質問を表示するメッセージボック

ス。戻り値は真偽値で、「再試行」ならば真、「キャンセル」ならば偽。

次のプログラムは、プッシュボタンがクリックされると、「はい」または「いいえ」で答える質問を表示します。そして、「はい」と答えたか「いいえ」と答えたかということに応じて、異なる返答を表示します。

プログラムの例 askyesno.py

from tkinter import *from tkinter.messagebox import *

def askandanswer():if askyesno(’質問’, ’あなたはプログラミングが好きですか?’):

showinfo(’回答’, ’それはすばらしい。’)else:

showinfo(’回答’, ’それは残念です。’)

root = Tk()button = Button(root, text=’質問と回答’, command=askandanswer,

font=’Times 20’)button.pack()root.mainloop()

18.3 ファイル選択ダイアログボックス

18.3.1 ファイル選択ダイアログボックスの基礎ファイルを人間に選択してもらうときに使われる定型的なダイアログボックスは、「ファイル

選択ダイアログボックス」(message box)と呼ばれます。ファイル選択ダイアログボックスを表示するメソッドは、

tkinter.filedialog

というライブラリーの中で定義されていますので、プログラムの先頭に、

from tkinter.filedialog import *

Page 137: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

18.3. ファイル選択ダイアログボックス 137

と書いておけば、それらのメソッドを呼び出すことができるようになります。

18.3.2 ファイル選択ダイアログボックスを表示するメソッドファイル選択ダイアログボックスを表示するメソッドには、次の二つがあります。

askopenfilename すでに存在するファイルを選択するためのファイル選択ダイアログボックスを表示する。存在しないファイルが選択された場合は、メッセージボックスでそれを知らせる。

asksaveasfilename データを保存する対象となるファイルを選択するためのファイル選択ダイアログボックスを表示する。すでに存在するファイルが選択された場合は、それを上書きしてもいいかどうかをメッセージボックスで尋ねる。

これらのメソッドは、ダイアログボックスが「開く」または「保存」のプッシュボタンで閉じられた場合は、選択されたファイルの絶対パス名を戻り値として返します。「キャンセル」のプッシュボタンで閉じられた場合は、空文字列を返します。次のプログラムは、すでに存在するファイルを選択するためのファイル選択ダイアログボック

スを表示して、選択されたファイルの絶対パス名を表示します。

プログラムの例 askopenfilename.py

from tkinter import *from tkinter.messagebox import *from tkinter.filedialog import *

def selectexistingfile():filename = askopenfilename()showinfo(’選択結果’, filename)

root = Tk()button = Button(root, text=’既存ファイル選択’,

command=selectexistingfile, font=’Times 20’)button.pack()root.mainloop()

次のプログラムは、データを保存する対象となるファイルを選択するためのファイル選択ダイアログボックスを表示して、選択されたファイルの絶対パス名を表示します。

プログラムの例 asksaveasfilename.py

from tkinter import *from tkinter.messagebox import *from tkinter.filedialog import *

def selectsaveasfile():filename = asksaveasfilename()showinfo(’選択結果’, filename)

root = Tk()button = Button(root, text=’保存用ファイル選択’,

command=selectsaveasfile, font=’Times 20’)button.pack()root.mainloop()

18.3.3 ファイル選択ダイアログボックスのキーワード引数ファイル選択ダイアログボックスを表示するメソッドは、次のようなキーワード引数を受け取

ります。

filetypes 選択の対象となるファイルのタイプを選択するために使われる、

[(ラベル, パターン), ... ]

という形式のリスト。「ラベル」は、タイプの説明として表示される文字列、「パターン」は、拡張子を示す、 .pyのような文字列。

initialdir 最初に表示されるディレクトリ(フォルダー)。initialfile ファイル名のエントリーにデフォルトで入力されるファイル名。

Page 138: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

138 第 18章 定型的なダイアログボックス

defaultextension 入力されたファイル名にドット ( . )が含まれていない場合に自動的に付加される拡張子。

title タイトルバーに表示される文字列。parent 親にするウィンドウ。ダイアログボックスは親のウィンドウの上に表示さ

れる。デフォルトはルートウィジェット。

次のプログラムは、画像ファイル(JPEG、PNG、GIF)を選択するためのファイル選択ダイアログボックスを表示します。

プログラムの例 imagefile.py

from tkinter import *from tkinter.messagebox import *from tkinter.filedialog import *

def selectimagefile():filename = askopenfilename(

title=’画像ファイルを開く’,initialdir=’c:\\’,filetypes=[(’JPEG’, ’.jpg’),

(’PNG’, ’.png’),(’GIF’, ’.gif’),(’All Files’, ’.*’)])

showinfo(’選択結果’, filename)

root = Tk()button = Button(root, text=’画像ファイル選択’,

command=selectimagefile, font=’Times 20’)button.pack()root.mainloop()

18.4 色選択ダイアログボックス

18.4.1 色選択ダイアログボックスの基礎色を人間に選択してもらうときに使われる定型的なダイアログボックスは、「色選択ダイアロ

グボックス」(color chooser)と呼ばれます。色選択ダイアログボックスを表示するメソッドは、

tkinter.filechooser

というライブラリーの中で定義されていますので、プログラムの先頭に、

from tkinter.filechooser import *

と書いておけば、そのメソッドを呼び出すことができるようになります。

18.4.2 色選択ダイアログボックスを表示するメソッド色選択ダイアログボックスは、askcolorというメソッドを呼び出すことによって表示するこ

とができます。askcolorは、次のようなキーワード引数を受け取ります。

color 最初に選択されている色。デフォルトは明るい灰色。title タイトルバーに表示される文字列。parent 親にするウィンドウ。ダイアログボックスは親のウィンドウの上に表示される。デフォ

ルトはルートウィジェット。

次のプログラムは、色選択ダイアログボックスを使うことによって、ラベルの背景色を変更することができます。

プログラムの例 colorchooser.py

from tkinter import *from tkinter.messagebox import *from tkinter.colorchooser import *

Page 139: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

139

def selectcolor():selected = askcolor(title=’背景色の変更’, color=color)if selected[1] != None:

label.config(text=selected[1], background=selected[1])

color=’#99ff99’root = Tk()label = Label(root, text=color, background=color,

font=’Times 20’)label.pack(ipadx=50, ipady=50)button = Button(root, text=’背景色の変更’, command=selectcolor,

font=’Times 20’)button.pack()root.mainloop()

第19章 トップレベルウィンドウ

19.1 トップレベルウィンドウの基礎

19.1.1 トップレベルウィンドウの基礎第 12.2.2項で説明したように、tkinterでは、プログラムが表示するウィンドウのうちで、もっ

とも中心となるものを、「ルートウィジェット」(root widget)と呼びます。それに対して、ルートウィジェット以外のウィンドウは、「トップレベルウィンドウ」(top-level

window)と呼ばれます。

19.1.2 トップレベルウィンドウの生成トップレベルウィンドウは、 Toplevelというウィジェットクラスから生成されます。通常、ウィジェットクラスには、引数として親のウィジェットを渡す必要があるわけですが、

ルートウィジェットと同じように、トップレベルウィンドウも、その必要はありません。次のプログラムは、プッシュボタンが押されるたびに、トップレベルウィンドウを生成します。

プログラムの例 toplevel.py

from tkinter import *

def create_toplevel():Toplevel()

root = Tk()button = Button(root, text=’トップレベルウィンドウの生成’,

command=create_toplevel, font=’Times 20’)button.pack()root.mainloop()

19.2 トップレベルウィンドウへのウィジェットの取り付け

19.2.1 トップレベルウィンドウへの通常のウィジェットの取り付けルートウィジェットと同じように、トップレベルウィンドウにも、さまざまなウィジェットを

取り付けることができます。ウィジェットをトップレベルウィンドウに取り付ける方法は、ウィジェットをルートウィジェ

ットに取り付ける方法と同じです。つまり、ウィジェットクラスを呼び出して、トップレベルウィンドウを親のウィジェットとして渡して、ジオメトリーマネージャーを呼び出せばいいのです。次のプログラムは、プッシュボタンが押されるたびに、プッシュボタンが取り付けられたトッ

プレベルウィンドウを生成します。

プログラムの例 buttontoplevel.py

from tkinter import *

class ButtonToplevel:def __init__(self):

Page 140: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

140 第 19章 トップレベルウィンドウ

global countcount += 1self.id = counttoplevel = Toplevel()button = Button(toplevel, text=’私について’,

command=self.aboutme, font=’Times 20’)button.pack()

def aboutme(self):print(’私は’ + str(self.id) +

’番目のトップレベルウィンドウです。’)

count = 0root = Tk()button = Button(root, text=’トップレベルウィンドウの生成’,

command=ButtonToplevel, font=’Times 20’)button.pack()root.mainloop()

19.2.2 トップレベルウィンドウへのメニューバーの取り付けメニューバーも、ルートウィジェットだけではなくて、トップレベルウィンドウにも取り付け

ることができます。トップレベルウィンドウにメニューバーを取り付ける方法は、第 15.5.4項で説明した、ルート

ウィジェットにメニューバーを取り付ける方法と同じです。つまり、トップレベルウィンドウを親とするメニューを作って、トップレベルウィンドウが持っている configを呼び出して、menu

というキーワード引数でそのメニューを渡せば、そのメニューがそのトップレベルウィンドウに取り付けられることになります。次のプログラムは、プッシュボタンが押されるたびに、メニューバーが取り付けられたトップ

レベルウィンドウを生成します。

プログラムの例 menutoplevel.py

from tkinter import *

class MenuToplevel:def __init__(self):

global countcount += 1self.id = counttoplevel = Toplevel()menubar = Menu(toplevel)menu = Menu(menubar, tearoff=0)menu.add_command(label=’私について’,

command=self.aboutme)menubar.add_cascade(label=’メニュー’, menu=menu)toplevel.config(menu=menubar)

def aboutme(self):print(’私は’ + str(self.id) +

’番目のトップレベルウィンドウです。’)

count = 0root = Tk()button = Button(root, text=’トップレベルウィンドウの生成’,

command=MenuToplevel, font=’Times 20’)button.pack()root.mainloop()

19.3 オリジナルなダイアログボックス

19.3.1 オリジナルなダイアログボックスの基礎第 18章で説明したように、tkinterでは、メソッドを呼び出すだけでさまざまなダイアログ

ボックスを表示することができます。しかし、メソッドを呼び出すだけで表示することのできるダイアログボックスは、定型的なものに限られます。さて、それでは、定型的ではないダイアロ

Page 141: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

19.3. オリジナルなダイアログボックス 141

グボックスを表示したいときは、いったいどうすればいいのでしょうか。ダイアログボックスというのはウィンドウの一種です。したがって、ダイアログボックスは、

トップレベルウィンドウを生成することによって表示することができます。ただし、トップレベルウィンドウをダイアログボックスとして使う場合には、それが持っているグラブと破壊という機能が必要になります。

19.3.2 グラブウィジェットに対する操作が終了するまでのあいだ、それ以外のウィジェットに対する操作を

制限するという機能は、「グラブ」(grab)と呼ばれます。グラブを使いたいときは、ウィジェットが持っている grabというメソッドを呼び出します。グラブは、グラブを実行しているウィジェットが消滅すると、自動的に解除されます。次のプログラムが生成するトップレベルウィンドウは、グラブを実行します。ですから、それ

が閉じられるまでのあいだ、ルートウィジェットに対しては何の操作もできなくなります。

プログラムの例 grab.py

from tkinter import *

class GrabbedToplevel():def __init__(self):

toplevel = Toplevel()toplevel.grab_set()

root = Tk()button = Button(root, text=’トップレベルウィンドウの生成’,

command=GrabbedToplevel, font=’Times 20’)button.pack()root.mainloop()

19.3.3 破壊ウィンドウには、自身を閉じるためのボタンが最初から備わっています。しかし、ダイアログ

ボックスは、そのボタンとは別に、自身を閉じるプッシュボタンを持っているのが普通です。ウィンドウを閉じるプッシュボタンがクリックされた場合には、ウィンドウを破壊するという

動作を実行する必要があります。すべてのウィジェットは、destroyというメソッドを持っています。これは、自分自身と、そ

の子供になっているすべてのウィジェットを破壊するメソッドです。次のプログラムが生成するトップレベルウィンドウは、「OK」というプッシュボタンをクリッ

クすることによって閉じることができます。

プログラムの例 destroy.py

from tkinter import *

class ClosableToplevel():def __init__(self):

self.toplevel = Toplevel()self.toplevel.grab_set()button = Button(self.toplevel, text=’OK’,

command=self.close, font=’Times 30’)button.pack()

def close(self):self.toplevel.destroy()

root = Tk()button = Button(root, text=’トップレベルウィンドウの生成’,

command=ClosableToplevel, font=’Times 20’)button.pack()root.mainloop()

19.3.4 文字列を読み込むダイアログボックス次のプログラムは、表示する文字列を変更するために、文字列を読み込むダイアログボックス

を生成します。

Page 142: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

142 第 20章 標準ライブラリーのその他のモジュール

プログラムの例 entrydialog.py

from tkinter import *

class EntryDialog:def __init__(self):

self.toplevel = Toplevel()self.toplevel.grab_set()self.entry = Entry(self.toplevel, width=30,

font=’Times 20’)self.entry.pack()self.entry.focus_set()button = Button(self.toplevel, text=’OK’,

command=self.close, font=’Times 30’)button.pack()

def close(self):var.set(self.entry.get())self.toplevel.destroy()

root = Tk()var = StringVar()var.set(’string’)label = Label(root, textvariable=var, font=’Times 20’)label.pack()button = Button(root, text=’文字列の変更’,

command=EntryDialog, font=’Times 20’)button.pack()root.mainloop()

第20章 標準ライブラリーのその他のモジュール

20.1 time

20.1.1 この章についてこのチュートリアルでは、これまでに、Pythonの標準ライブラリーに含まれているモジュー

ルとして、 os、 os.path、 tkinterなどを紹介してきましたが、Pythonの標準ライブラリーには、それら以外にもまだまだたくさんのモジュールが含まれています。この章では、このチュートリアルにまだ登場していない標準ライブラリーのモジュールのうち

で、よく使われるものをいくつか紹介したいと思います。

20.1.2 UNIX時間この章でまず最初に紹介するのは、時刻を扱う timeというモジュールです。timeについての説明を始める前に、まず、その予備知識として、「UNIX時間」(UNIX time)

というものについて説明しておきたいと思います。UNIX時間というのは、UNIXを始めとする多くのOSで採用されている、時刻を表現する形

式のひとつのことです。UNIX時間は、UNIXエポックと呼ばれる時刻から経過した秒数で、時刻を表現します。UNIX

エポックは、1970年 1月 1日午前 0時 0分 0秒です。第 10.5.2項で説明したように、osというライブラリーの中で定義されている statという関数

は、引数としてパス名を受け取って、そのパス名で指定されたファイルまたはディレクトリの情報を持つオブジェクトを返します。そのオブジェクトが持っている最終アクセス時刻や最終更新時刻などの時刻の情報は、UNIX時間で表現されています。

20.1.3 timeで定義されている関数

timeでは、次のような関数が定義されています。

time 現在時刻を UNIX時間で返す(クラスは float)。gmtime UNIX時間を受け取って、その時刻を協定世界時 (UTC)であらわす struct_time

クラスのオブジェクトを返す。引数を渡さなかった場合は現在時刻をあらわすオ

Page 143: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

20.2. sys 143

ブジェクトを返す。localtime UNIX時間を受け取って、その時刻を地方時であらわす struct_timeクラスのオブ

ジェクトを返す。引数を渡さなかった場合は現在時刻をあらわすオブジェクトを返す。

ctime UNIX時間を受け取って、その時刻を地方時であらわす、

Wed Jul 10 11:35:54 2013

という形式の文字列を返す。引数を渡さなかった場合は現在時刻をあらわす文字列を返す。

asctime struct_timeクラスのオブジェクトを受け取って、その時刻を地方時であらわす文字列(形式は ctimeと同じ)を返す。引数を渡さなかった場合は現在時刻をあらわす文字列を返す。

gmtimeや localtimeが返す、 struct_timeクラスのオブジェクトでは、次のような属性が、時刻を構成する要素に束縛されています。

tm_year 年(たとえば 2013)。tm_mon 月(1から 12まで)。tm_mday 日(1から 31まで)。tm_yday 大晦日からの日数(元旦は 1)。tm_wday 月曜日からの日数(月曜日は 0)。tm_hour 時(0から 23まで)。tm_min 分(0から 59まで)。tm_sec 秒(0から 59まで)。tm_isdst 夏時間フラグ。夏時間ならばプラス、そうでなければ 0、情報が得られなければマ

イナス。

次のプログラムの中で定義されている mtimelistという関数は、ディレクトリのパス名を受け取って、そのディレクトリの中にあるすべてのファイルについて、そのファイルの名前と最終更新時刻を出力します。

プログラムの例 mtimelist.py

from os import *from os.path import *from time import *

def mtimelist(dirname):for item in listdir(dirname):

name = join(dirname, item)if isfile(name):

st = stat(name)print(item + ’: ’ + ctime(st.st_mtime))

実行例>>> from mtimelist import *>>> mtimelist(’/home/hoge’)umiushi.txt: Wed Jul 10 15:21:07 2013namako.txt: Mon May 22 09:00:32 2006kamenote.txt: Tue Aug 19 17:26:31 1997

20.2 sys

20.2.1 sysの基礎この節では、 sysという標準ライブラリーのモジュールについて説明したいと思います。sysというモジュールで定義されているのは、Pythonのインタプリタに関連する関数などの

オブジェクトです。それらのオブジェクトを使うことによって、たとえば、コマンドライン引数を取得したり、終了ステータスを指定してインタプリタを終了させたりすることができます。

Page 144: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

144 第 20章 標準ライブラリーのその他のモジュール

20.2.2 コマンドライン引数Pythonのインタプリタを起動するコマンドには、任意の個数の引数を書くことができます。

Pythonのインタプリタを起動するコマンドに含まれている引数は、「コマンドライン引数」(com-mand line argument)と呼ばれます。sysは、argvという識別子を、コマンドライン引数から構成されるリストに束縛します。ただ

し、そのリストの 0番目の要素は、起動したプログラムが格納されているファイルの名前です。次のプログラムは、 argvが束縛されているリストを出力します。

プログラムの例 argv.py

from sys import *print(argv)

実行例$ python argv.py namako umiushi hitode kamenote[’argv.py’, ’namako’, ’umiushi’, ’hitode’, ’kamenote’]

20.2.3 プログラムの終了

sysで定義されている exitという関数は、インタプリタを終了させます。引数として整数を渡すと、それがインタプリタの終了ステータスになります。引数を省略した場合は 0が終了ステータスになります。整数以外のオブジェクトを引数として exitに渡すと、そのオブジェクトが標準エラー出力に

出力されて、終了ステータスは 1になります。次のプログラムが表示するプッシュボタンは、クリックされると、exitを呼び出して、「私は

exitに渡された引数です。」という文字列を引数としてそれに渡します。

プログラムの例 exit.py

from tkinter import *from sys import *

def clicked():exit(’私は exitに渡された引数です。’)

root = Tk()button = Button(root, text=’exitの呼び出し’,

command=clicked, font=’Times 20’)button.pack()root.mainloop()

20.3 random

20.3.1 randomの基礎この節では、 randomという標準ライブラリーのモジュールについて説明したいと思います。規則性を持たず、かつ、どの数値も同じ確率で出現する数値の列は、「乱数列」(random number

sequence)または「乱数」(random number)と呼ばれます。コンピュータというのは、何らかの規則に基づいて動作する機械ですから、厳密な意味での乱

数を発生させることはできません。しかし、乱数に類似する数列をコンピュータに生成させることは可能で、そのような数列は、「擬似乱数列」(pseudorandom number sequence)または「擬似乱数」(pseudorandom number)と呼ばれます。Pythonでは、randomというモジュールで定義されている関数を呼び出すことによって、擬似

乱数を発生させることができます。

20.3.2 浮動小数点数の擬似乱数

randomというモジュールで定義されている randomという関数は、0.0から 1.0までの範囲内にあるランダムな浮動小数点数を戻り値として返します。次のプログラムは、0.0から 1.0までの範囲内にある 5個の浮動小数点数から構成される擬似

乱数を発生させます。

Page 145: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

145

プログラムの例 randomfloat.py

from random import *for i in range(5):

print(random())

実行例$ python randomfloat.py0.171443712929072230.145702982105012980.059911051143911820.050454122422425640.9777900877759715

20.3.3 整数の擬似乱数

randomで定義されている randrangeという関数は、ランダムな整数を戻り値として返します。randrangeは、引数として 1個または 2個または 3個の整数を受け取ります。戻り値は、引数

が 1個の場合は 0から引数までの範囲内にあるランダムな整数で、引数が 2個の場合は 1個目から 2個目までの範囲内にあるランダムな整数で、引数が 3個の場合は 1個目から 2個目までの範囲内にある 3個目ずつ離れたランダムな整数です。次のプログラムは、300から 700までの範囲内にある 10ずつ離れた 5個の整数から構成され

る擬似乱数を発生させます。

プログラムの例 randrange.py

from random import *for i in range(5):

print(randrange(300, 700, 10))

実行例$ python randrange.py470660310330440

付録A 練習問題の解答例

第 4章の解答例

4.1 def divisible(a, b):if a%b == 0:

return ’割り切れる’else:

return ’割り切れない’

4.2 def mtohm2(m):if m != 0:

hm = ’’if m >= 60:

hm += str(m//60) + ’時間’if m%60 != 0:

hm += str(m%60) + ’分’else:

hm = ’0分’return hm

4.3 def divisible(a, b):return ’割り切れる’ if a%b == 0 else ’割り切れない’

Page 146: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

146 付録 A 練習問題の解答例

4.4 def sign(a):return (’プラス’ if a > 0

else ’マイナス’ if a < 0else ’ゼロ’)

第 5章の解答例

5.1 def space(s):s2 = ’’for c in s:

s2 += c + ’ ’return s2

5.2 def delete(s, a):s2 = ’’for c in s:

if c != a:s2 += c

return s2

5.3 def replace(s, a, b):s2 = ’’for c in s:

if c == a:s2 += b

else:s2 += c

return s2

5.4 def reduce(s):s2 = ’’spaceflag = Falsefor c in s:

if c == ’ ’:if not spaceflag:

spaceflag = Trues2 += c

else:if spaceflag:

spaceflag = Falses2 += c

return s2

5.5 def parseternary(s):n = 0for c in s:

n *= 3if c == ’0’ or c == ’1’ or c == ’2’:

n += int(c)return n

5.6 def perfect(n):sum = 0for i in range(1, n):

if n%i == 0:sum += i

return n == sum

5.7 def ternary(n):if n == 0:

return ’0’else:

s = ’’while n > 0:

s = str(n%3) + s

Page 147: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

147

n //= 3return s

5.8 def paren(n):if n == 0:

return ’’elif n >= 1:

return ’(’ + paren(n-1) + ’)’

5.9 def ternary(n):if n <= 2:

return str(n)elif n >= 3:

return ternary(n//3) + str(n%3)

第 6章の解答例

6.1 def nestedtuple(n):if n == 0:

return 0elif n >= 1:

return (nestedtuple(n-1),)

6.2 def newtuple(n, a): return (a,) * n

6.3 def findall(s1, s2):t = ()flag = Truei = 0while flag:

i = s1.find(s2, i)if i == -1:

flag = Falseelse:

t += (i,)i += 1

return t

第 10章の解答例

10.1 def insert_space(filename):f = open(filename)eof = Falsewhile not eof:

c = f.read(1)if c == ’’:

eof = Trueelse:

print(c, end=’’)if c not in (’\r’, ’\n’):

print(’ ’, end=’’)f.close()

10.2 def reverse_line(filename):f = open(filename)lines = f.readlines()for i in range(-1, -len(lines)-1, -1):

print(lines[i], end=’’)f.close()

10.3 def reverse_char(filename):f = open(filename)lines = f.readlines()for line in lines:

line = line.rstrip(’\r\n’)

Page 148: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

148 参考文献

for i in range(-1, -len(line)-1, -1):print(line[i], end=’’)

print()f.close()

10.4 def find_line(filename, s):f = open(filename)for line in f:

if line.find(s) != -1:print(line, end=’’)

f.close()

10.5 def print_divisor(filename, n):f = open(filename, ’w’)for i in range(1, n+1):

if n%i == 0:print(i, end=’ ’, file=f)

print(file=f)f.close()

10.6 from os import *from os.path import *

def filecount(dirname):count = 0for item in listdir(dirname):

name = join(dirname, item)if isfile(name):

count += 1elif isdir(name):

count += filecount(name)return count

10.7 from os import *from os.path import *

def dirlist(dirname): dirlist2(dirname, 0)

def dirlist2(dirname, depth):for item in listdir(dirname):

name = join(dirname, item)if isdir(name):

print(’ ’*(depth*4) + item)dirlist2(name, depth+1)

第 11章の解答例

11.1 from re import *

def address(s):return search(r’^\w+@\w+(\.\w+)*$’, s) != None

参考文献[Ceder,2010] Naomi R. Ceder, The Quick Python Book, Second Edition, Manning Publica-

tions, 2010, ISBN 978-1-935182-20-7. 邦訳(新丈径)、『空飛ぶ Python即時開発指南書』、翔泳社、2013、ISBN 978-4-7981-3080-4。

[Downey,2013] Allen Downey, Think Python: How to Think Like a Computer Scientist, Ver-sion 2.0.6, Green Tea Press, 2013. 原書Version 2.0.3 の邦訳(相川利樹)、『Think Python:コンピュータサイエンティストのように考えてみよう・第 0.90版』、2013。

[Language,2013] Guido van Rossum, Fred L. Drake, Jr. (ed.), “The Python Language Refer-ence, Release 3.3.1”, Python Software Foundation, 2013.

Page 149: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

参考文献 149

[Library,2013] Guido van Rossum, Fred L. Drake, Jr. (ed.), “The Python Library Reference,Release 3.3.1”, Python Software Foundation, 2013.

[Lundh,1999] Fredrik Lundh, “An Introduction to Tkinter”, 1999.

[Shipman,2013] John W. Shipman, “Tkinter 8.5 Reference: A GUI for Python”, New MexicoInstitute of Mining and Technology, 2013.

[Tutorial,2013] Guido van Rossum, Fred L. Drake, Jr. (ed.), “Python Tutorial, Release 3.3.1”,Python Software Foundation, 2013.

[柴田,2012] 柴田淳、『みんなの Python・第 3版』、ソフトバンククリエイティブ、2012、ISBN978-4-7973-7159-8。

Page 150: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

150

索引!=(演算子), 38

" , 20

""" , 20

$(正規表現), 97

&(演算子), 65

’ , 15, 20

’’’ , 20

()(演算子), 23

( )(正規表現), 96, 97

* , 90

*(演算子), 21, 22, 54, 63

*(正規表現), 95

**(演算子), 21

+(演算子), 21, 22, 54, 63

+(正規表現), 95

, , 90

- , 19

-(演算子), 21, 24, 65

-(正規表現), 95, 97

. , 25浮動小数点数の , 19

.(正規表現), 94, 97

.py(拡張子), 13

/(演算子), 21, 78

//(演算子), 21, 78

<(演算子), 37, 65

<=(演算子), 37, 65

==(演算子), 38

>(演算子), 37, 65

>=(演算子), 37, 65

?(正規表現), 96

[ ](正規表現), 94, 97\, 20

%(演算子), 21

\(正規表現), 97, 98

\D(正規表現), 98

\d(正規表現), 98

\S(正規表現), 98

\s(正規表現), 98

\W(正規表現), 98

\w(正規表現), 98

^(演算子), 65

^(正規表現), 95, 97__init__, 74

{ }(正規表現), 96

|(演算子), 65

|(正規表現), 9610進数リテラル, 1916進数(エスケープシーケンス), 2016進数リテラル, 192進数リテラル, 193進数, 46, 49, 518進数(エスケープシーケンス), 208進数リテラル, 19

add_cascade , 123

add_checkbutton , 124

add_command , 122

add_radiobutton , 124

add_separator , 123

after , 118

anchor(引数), 125, 126, 128

and(演算子), 41

args , 82

argv , 144

ArithmeticError , 83

asctime , 143

askcolor , 138

askokcancel , 136

askopenfilename , 137

askquestion , 136

askretrycancel , 136

asksaveasfilename , 137

askyesno , 136AWK, 12awk, 12

background(引数), 104, 110

basename , 92Basic, 12

bbox , 118

bind , 105

bold(スタイル), 103

bool , 37, 71

borderwidth(引数), 130, 131

Button , 120

Button(イベントタイプ), 105, 106

ButtonPress(イベントタイプ), 106

ButtonRelease(イベントタイプ), 105, 106

C, 12

Canvas , 110

Checkbutton , 121

clear , 69

Page 151: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

索引 151

close , 84COBOL, 12

color(引数), 138

column(引数), 127, 128

columnspan(引数), 127, 128

command(引数), 120, 122, 135

compile , 99

config , 106, 122, 129, 134, 140

cos , 90

count , 55

Courier(フォント), 102

create_arc , 112

create_line , 112

create_oval , 111

create_polygon , 113

create_rectangle , 110

create_text , 113

create_window , 113

ctime , 143Ctrl-C, 48CUI, 100

defaultextension(引数), 138

delete , 115

del文, 61, 69

destroy , 141

dirname , 92

dict , 67, 71

else

以降を省略した if文, 39

end , 99

end(引数), 27, 34

Enter(イベントタイプ), 106

Entry , 132

Exception , 81–83

except節, 80, 81複数の , 80

exists , 92

exit , 15, 144

extent(引数), 112

FactorialError , 83

False , 37

filetypes(引数), 137

fill(引数), 111, 113, 125, 126, 128

finally節, 81

find , 25, 62

findall , 94, 96, 98, 99

float , 27, 71

focus_set , 132

font(引数), 102, 113

foreground(引数), 104

format , 28Fortran, 12

for文, 44, 45, 52, 57, 66, 88for文

の書き方, 45

Frame , 130

from文, 89, 90

frozenset , 64

function , 71

get , 68, 121, 132, 134

global文, 33

gmtime , 142

grab , 141

grid , 102, 125, 127

group , 99GUI, 100

height(引数), 110, 129, 130, 133

Helvetica(フォント), 102

IDグラフィックスの , 114

if文, 38, 41else以降を省略した , 39

import文, 89, 90

in(演算子), 52, 68

index , 54, 62

initialdir(引数), 137

initialfile(引数), 137

input , 26

int , 27, 71

IntVar , 120

ipadx(引数), 125, 127, 128

ipady(引数), 125, 127, 128

isdir , 92

isfile , 92

isinstance , 43

italic(スタイル), 103

itemconfigure , 115

items , 69

Java, 12

join , 63, 92

Key(イベントタイプ), 108

KeyPress(イベントタイプ), 108

KeyRelease(イベントタイプ), 108

Page 152: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

152 索引

keys , 69

keysym , 109

Label , 101, 102

label(引数), 122–124

labelanchor(引数), 131

LabelFrame , 131

Leave(イベントタイプ), 106

len , 25, 26, 52Lisp, 12

list , 58, 59, 71

listdir , 91

localtime , 143

mainloop , 101

math , 90

max , 53, 68

Menu , 122, 123

menu(引数), 122, 123, 140

min , 53, 68

mkdir , 91ML, 12

Motion(イベントタイプ), 106

move , 116

None, 36, 51, 68, 75

None , 26, 36, 83

not(演算子), 41, 42

not in(演算子), 52, 68

ns(引数), 91

open , 84

or(演算子), 41

orient(引数), 134

os , 91

os.path , 91Ousterhout, John, 101

outline(引数), 111

pack , 102, 125, 128

padx(引数), 125, 127, 128, 130

pady(引数), 125, 127, 128, 130

parent , 138

parent(引数), 138Pascal, 12

pass文, 72Perl, 12, 101

pi , 90

place , 102, 125, 129PostScript, 12

print , 26, 89

Prolog, 12PSF, 13Python, 12

のインタプリタ, 143, 144Python Software Foundation, 13

quit , 15

raise文, 83

random , 144

randrange , 145

range , 46, 71

Ratiobutton , 121

re , 94, 98, 99

read , 85

readline , 87

readlines , 86

relief(引数), 130, 131

relx(引数), 130

rely(引数), 130

remove , 61, 91

rename , 91

replace , 63

return文, 35, 41RFC 5322, 100

rmdir , 91Rossum, Guido van, 13

row(引数), 127, 128

rowspan(引数), 127, 128

rstrip , 86Ruby, 12, 101

Scrollbar , 134

search , 98, 99sed, 12

self , 73

sep(引数), 27

set , 64, 71, 120, 135

showerror , 136

showinfo , 136

showwarning , 136

side(引数), 125

sin , 90Smalltalk, 12

span , 99

split , 63, 92, 98, 99

start , 99

start(引数), 112

stat , 91, 142

sticky(引数), 128

Page 153: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

索引 153

str , 27, 71

StringVar , 120

struct_time , 142, 143

style(引数), 112

sub , 98, 99

super , 77

sys , 143

tag_bind , 114

tags(引数), 117

tan , 90Tcl, 12, 101

tearoff(引数), 123

Text , 133

text(引数), 102, 113, 120, 121, 131

textvariable(引数), 133

time , 142

Times(フォント), 102

times(引数), 91

title , 101

title(引数), 138Tk, 100

Tk , 101tkinter, 101

Toplevel , 139

True , 37

try文, 79, 81

tuple , 55, 56, 71

type , 71

TypeError , 78, 80

UNIX時間, 142UNIXエポック, 142

upper , 16UTF-8, 14

utime , 91

value(引数), 121, 124

values , 69

variable(引数), 121, 124

while文, 44, 47の書き方, 48

width(引数), 110, 111, 129, 130, 132, 133window(引数), 113

wrap(引数), 133

write , 88

x , 107

x(引数), 129

xscrollcommand(引数), 135

xview , 135

y , 107

y(引数), 129

yscrollcommand(引数), 135

yview , 135

ZeroDivisionError , 78, 80, 81, 83

アスタリスク, 90, 95値, 67

式の , 15識別子の , 29

アニメーション, 118移動の , 118インタラクティブな , 119

アフター, 118あまり, 21アンカー, 97アンコメント, 18アンダースコア, 29

鋳型, 70, 72井桁, 18イタリック体, 103一覧

ディレクトリの , 91移動

のアニメーション, 118グラフィックスの , 116

イベント, 105マウスによる , 106, 108

イベントオブジェクト, 105, 107イベント修飾子, 107

キーボードの , 109マウスの , 107

イベント処理, 105イベントタイプ, 105, 106, 108

マウスの , 106, 108イベントパターン, 105, 114イベントハンドラー, 105, 107, 114イベントループ, 101鋳物, 70入れ子タプル, 56色, 104

線の , 111塗りつぶしの , 111

色選択ダイアログボックス, 135, 138インスタンス, 43インタプリタ, 13

Pythonの , 143, 144インタラクティブ

なアニメーション, 119インタラクティブシェル, 14, 17

の起動, 15

Page 154: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

154 索引

の終了, 15インデックス, 53インデント, 31インポート, 89

修飾付きの , 90引用符, 15, 20

ウィジェット, 101, 113, 139の座標系, 107の詰めもの, 127の引き伸ばし, 126の余白, 127

ウィジェットクラス, 101ウィンドウ, 101, 139

のタイトル, 101

英字, 29英単語, 57エスケープ, 97エスケープシーケンス, 20, 21, 97エディター, 13エラー, 14エラーメッセージ, 14, 136エラトステネス

のふるい, 61円弧, 112

のスタイル, 112演算子, 20, 21円周率, 90エンターキー, 17, 132エントリー, 132円マーク, 20

大きい, 37大きいかまたは等しい, 37大きさ

フォントの , 103オーバーライド, 77オープン, 84オープンモード, 84オブジェクト, 16, 43

の初期化, 74の生成, 72

親子関係, 49オリジナル

なダイアログボックス, 140オルトキー, 109折れ線, 112

改行, 17, 20, 24, 27, 31, 86の削除, 86

階乗, 49, 83改ページ, 20書き方

for文の , 45while文の , 48

辞書表示の , 67集合表示の , 64条件演算式の , 42丸括弧形式の , 55呼び出しの , 25

書き込みファイルへの , 88

角括弧, 58, 87, 94, 97拡張子, 137, 138加算, 21かつ, 41括弧列, 51カメラ, 49仮引数, 33

の順序, 34関数, 24, 30, 51

の再帰的な定義, 49の定義, 30

関数定義, 26, 30, 72完全数, 47

偽, 36キー, 67キー値ペア, 67キーシム, 108, 109キーボード, 26

のイベント修飾子, 109キーワード引数, 26, 35機械語, 13擬似乱数, 144

整数の , 145浮動小数点数の , 144

基数, 19, 28奇数, 38, 42帰属演算子, 52帰属関係, 52基底, 49基底クラス, 76, 81起動

インタラクティブシェルの , 15逆数, 35キャリッジリターン, 20, 86キャンバス, 110行, 127共通部分, 65協定世界時, 142

空辞書, 68空集合, 64偶数, 38, 42空タプル, 55空白, 17, 29空文字列, 34, 37, 51, 85, 87, 111空リスト, 58クエスチョンマーク, 96

Page 155: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

索引 155

区切り文字列, 63組み込み型, 27, 70

真偽値を生成する , 37整数を生成する , 27浮動小数点数を生成する , 27文字列を生成する , 27

組み込み関数, 26クラスを判定する , 43

組み込み定数, 36組み込み例外型, 78, 81クラス, 24, 70

の定義, 71を判定する組み込み関数, 43

クラス定義, 27, 70, 71グラブ, 141グラフィックス, 110

の ID, 114の移動, 116の消去, 115の状態の変更, 115の操作, 114のバインディング, 114の描画, 111

繰り返し, 44集合に対する , 66タプルに対する , 57パターンの , 95

繰り返し可能オブジェクト, 45, 52, 63, 88グループ化, 96クローズ, 84

警告, 136継承, 76継承する, 76軽量言語, 12結合

パス名の , 92文字列の , 63

結合規則, 23言語, 12言語処理系, 13検索

部分文字列の , 98減算, 21

コマンドプロンプト, 14コマンドライン引数, 144コメントアウト, 18コレクション, 51, 63

の長さ, 52コロン, 54, 61コントロールキー, 109コンパイラ, 13コンマ, 55, 58, 64, 67, 90

サーカムフレックス, 95, 97

再帰, 49再帰的, 49

関数の な定義, 49最終アクセス時刻, 91, 142最終更新時刻, 91, 142最小値, 53再束縛, 30最大公約数, 48最大値, 53財布, 75削除

改行の , 86辞書の要素の , 69ディレクトリの , 91ファイルの , 91リストの要素の , 61

作成ディレクトリの , 91

差集合, 65座標, 129

絶対的な , 129相対的な , 130マウスポインターの , 107

座標系ウィジェットの , 107

サブメニュー, 123算術演算子, 21

シーケンス, 53, 63の連結, 54

ジオメトリーマネージャー, 102, 125, 139時間, 39, 57式, 15

選択をあらわす , 42式文, 28, 41識別子, 29, 90

の値, 29時刻, 142辞書, 52, 63, 66, 67, 71

の添字表記, 68の要素の削除, 69の要素の置換, 68

辞書式順序, 37辞書ビューオブジェクト, 69辞書表示, 67

の書き方, 67自身, 25自然言語, 12子孫, 49実行

プログラムの , 13質問, 136シフトキー, 109集合, 52, 63, 64, 66, 71

に対する繰り返し, 66

Page 156: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

156 索引

集合比較演算子, 65集合表示, 64

の書き方, 64修飾付き

のインポート, 90終了

インタラクティブシェルの , 15終了ステータス, 144出現回数, 55出力, 26取得

部分文字列の , 94順序

仮引数の , 34順序なしコレクション, 63上位集合, 65消去

グラフィックスの , 115条件, 36条件演算式, 42

の書き方, 42乗算, 21状態

グラフィックスの の変更, 115情報, 136省略

else以降を した if文, 39初期化

オブジェクトの , 74初期化メソッド, 74, 78除算, 21, 78書式指定, 28処理系, 13真, 36真偽値, 36, 51, 71

を生成する組み込み型, 37人工言語, 12真上位集合, 65真部分集合, 65

垂直タブ, 20水平タブ, 20数字, 29数値

から文字列への変換, 28スカラー, 51, 52, 66スクリプト, 12スクリプト言語, 12スクロールバー, 134スコープ, 32スタイル

円弧の , 112フォントの , 103

ストリーム位置, 84スペースキー, 17

すべての文字, 94

スライス表記, 54, 60, 61

正規表現, 93正規表現オブジェクト, 99制御変数, 120, 121, 124, 133整数, 51, 71

の擬似乱数, 145のリテラル, 15を生成する組み込み型, 27

整数リテラル, 19生成

オブジェクトの , 72真偽値を する組み込み型, 37整数を する組み込み型, 27浮動小数点数を する組み込み型, 27文字列を する組み込み型, 27例外の , 82

絶対的な座標, 129

絶対パス名, 100, 137セル, 127線

の色, 111の幅, 111

前景色, 104先祖, 49選択, 36

をあらわす式, 42パターンの , 96

操作グラフィックスの , 114

相対的な座標, 130

総和, 36添字表記, 53, 60, 61, 69

辞書の , 68属性, 74

例外の , 82束縛, 29ソフトウェア, 13

ターミナル, 14ダイアログボックス, 135

オリジナルな , 140対称差集合, 65タイトル

ウィンドウの , 101代入, 29代入文, 29, 41, 74楕円, 111多角形, 113タグ, 117

Page 157: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

索引 157

多肢選択, 40縦棒, 96タプル, 52, 53, 55, 63, 66, 71

に対する繰り返し, 57の平坦化, 58

単項演算子, 21, 24探索

部分文字列の , 62要素の , 54

単純文, 41短文字列リテラル, 20

小さい, 37小さいかまたは等しい, 37チェックボタン, 120

のメニュー項目, 124置換

辞書の要素の , 68部分文字列の , 63文字列の , 98リストの要素の , 60

地方時, 143中括弧, 64, 67, 96注釈, 18長方形, 110長文字列リテラル, 20

追加メニュー項目の , 122

詰め込みの方向, 125

詰めものウィジェットの , 127

定義関数の , 30関数の再帰的な , 49クラスの , 71独自の例外クラスの , 83メソッドの , 72

ディレクトリ, 92の一覧, 91の削除, 91の作成, 91

データ, 16テキストウィジェット, 132, 133テキストエディター, 13テキストデータ, 14テキストモード, 84ではない, 41, 42デフォルト値, 27, 34

等差数列, 46透明, 111独自

の例外クラスの定義, 83

特定の文字, 94

度数分布, 70ドット, 25, 94, 97

浮動小数点数の , 19トップレベルウィンドウ, 139ドルマーク, 97

長さコレクションの , 52

名前の競合, 90

二項演算子, 21, 30二重引用符, 20日本 Pythonユーザ会, 13入力, 26

プログラムの , 13人間, 76

塗りつぶしの色, 111

ハードウェア, 13背景色, 104, 110配置領域, 125, 126, 128バイナリーモード, 84バインディング, 105

グラフィックスの , 114特定のキーに限定した , 108特定のボタンに限定した , 106

バインド, 105破壊, 141パス名, 84

の結合, 92の分解, 92の変更, 91

派生クラス, 76, 81パターン, 93

の繰り返し, 95の選択, 96

文字列の , 93バックスペース, 20バックスラッシュ, 20, 21, 97, 98ハッシュ可能オブジェクト, 66ハッシュ可能性, 66ハッシュ値, 66ハッシュ不可能オブジェクト, 66発生

例外の , 82幅

線の , 111範囲, 46, 51–54, 63, 66, 71

文字コードの , 95判定

クラスを する組み込み関数, 43反転

Page 158: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

158 索引

符号の , 24

ビープ音, 20比較演算子, 37, 52引数, 25, 33引き伸ばし

ウィジェットの , 126ピクセル, 107左結合, 23等しい, 38等しくない, 38描画

グラフィックスの , 111評価する, 15標準ライブラリー, 89, 142表示領域, 126

ファイル, 84からの読み込み, 85の削除, 91への書き込み, 88

ファイルオブジェクト, 84–88ファイル選択ダイアログボックス, 135, 136ファイルの終わり, 85フィボナッチ数列, 50フォーカス, 132フォント, 102, 113

の大きさ, 103のスタイル, 103

フォント記述子, 102フォントファミリー名, 102複合文, 41複数

の except節, 80符号

の反転, 24プッシュボタン, 120浮動小数点数, 19, 51, 71

の擬似乱数, 144を生成する組み込み型, 27

浮動小数点数リテラル, 19太字, 103部分シーケンス, 54, 62部分集合, 65部分文字列, 62

の検索, 98の取得, 94の探索, 62の置換, 63

不変集合, 52, 63, 64, 66プラス, 95ふるい

エラトステネスの , 61フレーム, 130プログラミング, 12

プログラミング言語, 12プログラム, 12, 28

の実行, 13の入力, 13の文字コード, 14

ブロック, 31プロンプト, 15, 26分, 39, 57文, 15

何の動作もしない , 72分解

パス名の , 92文字列の , 98

分割文字列の , 63

文書, 12分類

呼び出し可能オブジェクトの , 24

平坦化タプルの , 58

べき乗, 21変換

数値から文字列への , 28変更

グラフィックスの状態の , 115パス名の , 91

変更可能オブジェクト, 52変更不可能オブジェクト, 52

ポイント, 103方向

詰め込みの , 125捕獲

例外の , 79ボタン, 119ホワイトスペース, 98

マイナス, 95, 97マウス

によるイベント, 106, 108のイベント修飾子, 107のイベントタイプ, 106, 108

マウスポインターの座標, 107

または, 41マッチオブジェクト, 99マッチする, 93マッチング, 93丸括弧, 17, 24, 55, 96, 97丸括弧形式, 55

の書き方, 55

未加工文字列リテラル, 20, 21, 97右結合, 23見出し語, 67

Page 159: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

索引 159

無限ループ, 48

メールアドレス, 100メソッド, 16, 24

の定義, 72メソッド呼び出し, 16メタ文字, 94, 97メッセージボックス, 135, 136メニュー, 122メニュー項目, 122

の追加, 122チェックボタンの , 124ラジオボタンの , 124

メニューバー, 122, 140メリット

ローカルスコープの , 32

文字の列挙, 94

すべての , 94特定の , 94文字クラスに属さない , 95

文字クラス, 94, 97に属さない文字, 95の略記法, 98

文字コードの範囲, 95

プログラムの , 14モジュール, 89モジュールスコープ, 32文字列, 51–53, 63, 66, 71, 113

の結合, 63の置換, 98のパターン, 93の分解, 98の分割, 63のリテラル, 15の連結, 22を生成する組み込み型, 27

数値から への変換, 28文字列リテラル, 20, 97戻り値, 25, 35モニター, 49

約数, 47, 57, 60, 89の和, 57

ユークリッドの互除法, 48, 50ユーザーインターフェース, 100ユーザー定義関数, 26, 71ユーザー定義クラス, 27, 70優先順位, 22

要素, 52の探索, 54

辞書の の削除, 69

辞書の の置換, 68リストの の削除, 61リストの の置換, 60

余白ウィジェットの , 127

呼び出し, 24の書き方, 25

呼び出し可能オブジェクト, 24, 70の分類, 24

呼び出す, 16, 24読み込み, 26

ファイルからの , 85予約語, 29

ライブラリ, 13ライブラリー, 89ラジオボタン, 120, 121

のメニュー項目, 124ラベル, 102ラベルフレーム, 131乱数, 144

力士, 76リスト, 52, 53, 58, 63, 66, 71, 86

の要素の削除, 61の要素の置換, 60

リスト内包表記, 58, 59リスト表示, 58リテラル, 15, 18

整数の , 15文字列の , 15

略記法文字クラスの , 98

累算代入文, 30ルートウィジェット, 101, 102, 139

例外, 78, 82の生成, 82の属性, 82の発生, 82の捕獲, 79

例外クラス, 78, 82独自の の定義, 83

例外処理, 79列, 127列挙

文字の , 94連結

シーケンスの , 54文字列の , 22

連接, 94

ローカルスコープ, 32のメリット, 32

集合演算子, 65

Page 160: Python 実習マニュアル - 無料チュートリアルtutorial.jp/prog/python/python.pdf6 目次 6.1.13 出現回数: : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

160 索引

論理演算子, 41論理積演算子, 41論理否定演算子, 42論理和演算子, 41

和約数の , 57

和集合, 65