1
Python
と
SageMath
佐々木格
(
信州大学理学部
)
2018
年
7
月
18
日
目次
第
I
部
Python
の基礎
1
1 Pythonプログラムの実行手順 1 1.1 最初のプログラム(Hello World) . . . 1 1.2 日本語を含むPythonプログラム . . . 2 1.3 コメントアウト . . . 2 1.4 Pythonインタラクティブシェル . . . 3 2 変数 3 3 予約語 4 4 文字列,数値,データの型 4 4.1 文字列 . . . 4 4.2 データの方を調べる . . . 5 4.3 数値の型 . . . 6 4.4 数値と文字列の変換 . . . 7 5 演算子と計算の順序 7 6 プリント(print) 8 7 リスト 9 8 Pythonで扱えるその他のデータ形式 10 8.1 タプル . . . 10 8.2 辞書(dictionary) . . . 11 8.3 集合(set) . . . 11 9 練習問題 12 9.1 問題:eπ− 20の計算 . . . . 12 10 キーボードからのデータの取得 1311 論理型と比較演算子 14 12 条件分岐 15 12.1 if文 . . . 15 12.2 if-else文 . . . 16 12.3 if-elif-else文 . . . 18 12.4 複雑なif文の例 . . . 18 13 練習問題 19 13.1 問題:BMI計算プログラム . . . 19 14 For文による繰り返し 21 14.1 For文の文法 . . . 21 14.2 for文のいくつかの例 . . . 22 14.3 for文のインデントのエラー . . . 24
14.4 for文の応用1:(for文の中にfor文を入れる) . . . 24
14.5 for文の応用2:if文と組合わせる . . . 25 14.6 for文の応用3: breakで処理を止める . . . 25 15 ファイルの書き込み・読み込み 26 15.1 ファイルの書き込み(その1) . . . 26 15.2 ファイルの書き込み(その2) . . . 26 15.3 ファイルの読み込み . . . 27 16 練習問題 28 16.1 問題:3n + 1問題 . . . 28 16.2 数字当てゲーム . . . 29 17 while文による繰り返し 30 17.1 while文の文法 . . . 30 17.2 while文の例 . . . 31 18 練習問題 35 18.1 問題:素数判定プログラム . . . 35 18.2 問題:ユークリッドの互除法 . . . 35 19 リストの操作とリスト内包表記 37 20 関数 38 20.1 関数の定義のしかた . . . 38 20.2 練習問題 . . . 40 20.3 名前のない関数— lambda式. . . 42 20.4 関数とローカル変数 . . . 42 20.5 関数の説明の書き方 . . . 43 20.6 def文の応用:素数を判定する関数 . . . 43 20.7 関数の再帰的な定義 . . . 44
目次 目次 20.8 再帰的な定義の落とし穴と計算量 . . . 45 20.9 練習問題 . . . 47 21 知っておくと便利なこと———文字列から式や文を作り出す 49 22 Set型 50 22.1 基本的な集合の操作 . . . 50 22.2 Set型の応用—–四則演算で10を作る遊び . . . 51 22.3 練習問題 . . . 56
第
II
部
数式処理システム
SageMath
57
23 数式処理システムSageMathとは 57 24 Sage実行方法 57 24.1 Sageのインタラクティブシェルの起動 . . . 57 24.2 Sageのプログラムを作成して実行する . . . 58 25 SageのWebページについて 58 26 他の環境でのSageの利用 59 26.1 SageMathCloud . . . 59 26.2 WindowsにSageをインストールする . . . 59 26.3 Macでの利用 . . . 59 27 Sageノートブック 60 28 Sageでの数の取り扱い 60 28.1 四則演算 . . . 60 28.2 数の表示 . . . 61 28.3 Sageで文字nを使うときの注意 . . . 61 28.4 複素数 . . . 61 28.5 数学定数 . . . 62 28.6 数の精度 . . . 62 29 カーネルの初期化 63 30 Sageノートブックの補完機能 63 31 ノートブックの出力の整形 63 32 Sageワークシートの保存 64 33 Sageのヘルプ 65 34 Sageワークシートの活用 65 34.1 ワークシートのソースとその編集 . . . 65 34.2 Sageワークシートのドキュメントとしての機能 . . . 6735 練習問題 68 36 2つの関数 69 36.1 Sageで使える関数 . . . 70 37 グラフの描画とデータの可視化 70 37.1 関数のグラフを描画(plot) . . . 70 37.2 グラフィックスで使える色 . . . 73 37.3 グラフ描画:応用編 . . . 74 37.4 陰関数のグラフ . . . 76 37.5 リストのプロット . . . 77 37.6 変数(x, y)の取り得る2次元領域を描く . . . 79 37.7 基本的なパーツ(円・楕円・矢印・円弧・線分・点・テキスト) . . . 80 38 2変数関数の可視化 80 38.1 3次元のプロット . . . 80
38.2 密度プロット(density plot)と等高線プロット(contour plot) . . . 81
38.3 その他の3次元プロット. . . 82 38.4 画像の保存 . . . 82 39 グラフの描画に関するおもしろい例題 83 40 練習問題 86 41 代数的計算 87 41.1 文字式の展開・因数分解・単純化 . . . 87 41.2 x105− 1の因数分解 . . . . 88 41.3 有理式の部分分数展開 . . . 88 41.4 連分数 . . . 89 41.5 極限と条件 . . . 90 41.6 代数的な和の計算 . . . 90 42 方程式の解 91 42.1 方程式を意味する等号”==” . . . 91 42.2 方程式の厳密解を求める(solve). . . 92 42.3 方程式の数値解(find root) . . . 94 43 Sageによる微分と積分 95 43.1 不定積分はできないけど定積分なら出来る場合 . . . 97 43.2 数値積分 . . . 97 44 Taylor展開 99 44.1 Taylor展開 . . . 99 44.2 応用編:Taylor展開で近似される様子を描画. . . 99 45 練習問題 100
目次 目次 46 微分方程式 102 46.1 常微分方程式とベクトル場 . . . 102 46.2 Euler法 . . . 103 46.3 微分方程式の厳密解 . . . 105 46.4 二階の微分方程式 . . . 108
46.5 オプション1(Riccati, Clairaut, Lagrangeを含めた解法) . . . 108
46.6 オプション2:方程式が定数を含む場合 . . . 109 46.7 オプション3:初期条件と境界条件(ics) . . . 109 46.8 その他の方法. . . 110 47 インタラクティブな操作:@interact 110 48 動画作成(animate) 113 48.1 高木関数の描画 . . . 114 48.2 練習問題 . . . 115 49 行列計算 116 49.1 ベクトルと行列の生成 . . . 116 49.2 ベクトルと行列の積 . . . 117 49.3 行列に対する基本的な操作 . . . 117 49.4 行列と係数環・係数体 . . . 118 49.5 行列に対する命令 . . . 120 49.6 固有値・固有ベクトル . . . 120 49.7 対角化とその応用 . . . 121 49.8 ジョルダン標準形 . . . 125 49.9 練習問題 . . . 126 50 乱数 128 50.1 乱数の基本的な使い方 . . . 128 50.2 モンテカルロ法 . . . 131 50.3 4次元球の体積のモンテカルロ法による計算 . . . 134 50.4 モンテカルロ法による積分 . . . 135 50.5 練習問題 . . . 135
概要 Pythonは非常に良くデザインされたプログラミング言語で,覚えやすく可読性の高いコードが書ける事 が特徴です。本講義の後半では数式処理システムSageMath(セイジ,以下Sageと略)を学習します。 Sageは数学ソフトウェアを100個近く*1統合した大規模なソフトウェアで,基礎代数,微分・積分,整 数論,暗号理論,数値計算,可換代数,群論,組み合わせ論,グラフ理論等の計算を行うことができます。 手軽にグラフを描画することもできるし,数学の研究で本格的に使うこともあります。 Pythonには系2と系3の二つの系統があり,それらには互換性がありません。Sageのプログラムは
Pythonの文法で記述しますので,本講義では,まずはPythonの基本事項を学び,後半でSageを使った
数学的な計算を紹介します。現在のところ*2,SageのプログラムはPython2の文法に従っていますので,
以下ではPython2について解説を行います。
PythonやSageはフリーソフトウェアですから,インターネットから無料でダウンロードして自分のパ
ソコンにインストールして使うことができます。これらはWindows,Mac,Linux版がそれぞれ開発され ており,大学の環境だけでなく,自分が普段使用しているマシンにインストールして自由に使うことができ ます。
*1正確には 90 個 2018 年 4 月現在
1 PYTHONプログラムの実行手順
第
I
部
Python
の基礎
1
Python
プログラムの実行手順
このプリントではPythonプログラムを実行する方法として次の3つを紹介します。 (1) Pythonのプログラムが書かれたファイルを作成して端末から実行する (2) インタラクティブシェルを使う (3) Sageノートブックから実行する (3)については後半のSageの解説で紹介します。1.1
最初のプログラム
(Hello World)
(1)の手順を詳しく紹介します。プログラムの実行の流れは次の図の通りです:T;GV6U1M"s·
e{>wn"iÔö–Ñ· c/2y¡ÿ ***.py
ƒŽÛ
œ
é ·
œAl•W
ÿ python ***.py
図1 Pythonプログラムの実行方法(1) Pythonプログラムはテキストエディタで書きますが,以下では,テキストエディタとしてEmacsを用い ることを想定しています。次のようにファイル名(hello.py)を付けてからEmacsを起動します。 1 u s e r @ d e b i a n :~ $ cd ~/ D e s k t o p / d a t a p r o c 1 / # デ ィ レ ク ト リ を 移 動 2 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 $ e m a c s h e l l o . py & # E m a c sを 起 動 Emacsが起動したらC-x C-sを押してファイルを保存しましょう。これで,デスクトップにあるディレクト
リdataproc1にファイルhello.pyが作られました。Emacsウィンドウの下部のバーの表示がPythonモー
ドになっていることを確認してください。 さて,hello.pyへ次の内容を書きましょう: •ファイル名:hello.py 1 p r i n t ’ H e l l o W o r l d ’ 入力したら保存(C-x C-s)します。これで最初のプログラムは完成です。このプログラムを実行するために, 端末のウィンドウに戻りましょう*3。端末から次をタイプすることでPythonプログラムが実行されます。 *3ウィンドウを切り替えは Alt+Tab で行い,極力マウスを使わないことをおすすめします。
1 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 $ p y t h o n h e l l o . py
2 H e l l o W o r l d
3 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 $
上のように端末にHello Worldと表示されれば成功です。Pythonでは,プログラムを実行する際に,C言
語のように事前にコンパイルをする必要はありません。
1.2
日本語を含む
Python
プログラム
日本語を含むPythonプログラムは,文字コードをutf-8で書き,ファイルの先頭に次の一文を追加してお かなければなりません。 1 # * c o d i n g : utf 8 * -もしくは 1 # c o d i n g : utf -8 Emacsを使って編集する場合はひとつ目の方を推奨します。この一文を入れることで,Python実行時に,日 本語が含まれていることが認識され,日本語の文字の処理が正常に行われるようになります。 例えば,つぎのようなプログラムを作成します: •ファイル名:hellojp.py 1 p r i n t ’こんにちは’ 端末からpython hellojp.pyとすることで実行すると 実行結果の例 sys:1: DeprecationWarning: Non-ASCII character ’xe3’ in file test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for detailsこんにちは のようなエラーメッセージが出ます。これを解決するために,上で述べたようにプログラムの先頭にコーディ ングの指定をします: •ファイル名:hellojp.py 1 # * c o d i n g : utf 8 * -2 p r i n t ’こんにちは’ 上のように記述してからpython hellojp.pyとプログラムを実行すれば,次のように日本語を表示すること ができます: 実行結果の例 こんにちは
1.3
コメントアウト
Pythonのプログラムでは,コメントは『#』の後に書きます*4。コメントアウトされた部分はプログラムを 実行する際には無視されます: 1 p r i n t ’ H e l l o W o r l d ’ # こ の 部 分 は 無 視 さ れ ま す *4一方で LATEX のコメントは % の後に書きます。1.4 Pythonインタラクティブシェル 2 変数
1.4
Python
インタラクティブシェル
Pythonインタラクティブシェルは,プログラムのファイルを作成せずに,入力したプログラムを順次実行 していく簡易的なシステムです。インタラクティブシェルを起動するには端末からpython [ENTER]を実行 するだけです。 1 u s e r @ d e b i a n :~ $ p y t h o n 2 P y t h o n 2 . 7 . 9 ( default , Jun 29 2016 , 1 3 : 0 8 : 3 1 ) 3 [ GCC 4 . 9 . 2 ] on l i n u x 2 4 T y p e " h e l p " , " c o p y r i g h t " , " c r e d i t s " or " l i c e n s e " for mo r e i n f o r m a t i o n . 5 > > > カーソルが最後の行で点滅して入力を待っています。四則演算と冪を試してみましょう: 1 > > > 1+3 2 4 3 > > > 5 -3 4 2 5 > > > 4*3 6 12 7 > > > 9/4 # 注 意 ! 商 を 返 し ま す ! 8 2 9 > > > 9%4 # 割 り 算 の あ ま り 10 1 11 > > > 9 . 0 / 4 # 小 数 点 数 で の 割 り 算 12 2 . 2 5 # 小 数 点 以 下 も 計 算 さ れ る 13 > > > 2 * * 1 0 # 2の1 0乗 14 1 0 2 4 Python2では整数同士の割り算(/)では余りを切り捨てるので注意が必要です。多くのプログラミング言語 では冪は2^10のように表しますが,Pythonではこの記法はビットごとの排他的論理和(XOR)に割り当て られており,冪は210は2**10のように表します。Python3ではスラッシュ『/』で小数点以下も割り算がお こなわれるように変更されました。後半で解説するSageのユーザーは数学者が多く,排他的論理和を多用す る数学者は少ないので,^は冪を意味するように変更されています。また5/3は53 という有理数を表します。 インタラクティブシェルを終了するにはCRTL+dもしくはexit()を入力します 1 > > > e x i t() # も し く は c t r l + d 2 u s e r @ d e b i a n :~ $2
変数
変数を使った計算を,インタラクティブシェルを使って紹介をします。 1 > > > a = 6 # 変 数aに6を 代 入 2 > > > a # aの 内 容 を 表 示 3 6 4 > > > a = 8 # 変 数 aの 値 を8に 変 更 5 > > > a6 8 7 > > > a = a + 5 # aに5を 足 す 8 > > > a 9 13 10 > > > a += 1 # aに1を 足 す 11 > > > a 12 14 上のプログラムでa=a+5はaの値をa+5に変える事を意味しています。このように多くのプログラミング言 語では=は恒等式ではなく 代入 を意味します。 さて,存在しない文字を呼ぶとどうなるでしょうか? 1 > > > b 2 T r a c e b a c k ( m o s t r e c e n t c a l l l a s t ): # エ ラ ー メ ッ セ ー ジ 3 F i l e " < stdin > ", l i n e 1 , in ? # エ ラ ー メ ッ セ ー ジ 4 N a m e E r r o r : n a m e ’ b ’ is not d e f i n e d # エ ラ ー メ ッ セ ー ジ 5 > > > b = -4 6 > > > a + b 7 10 定義されていない変数を使おうとするとエラーメッセージが出ます。 変数名はある程度自由に決めることができますが,いくつかのルールがあります。変数名はアルファベット a–z, A–Z,から始めなければなりません。変数名では大文字と小文字は区別されます。先頭以外では,さらに 数字0–9,やアンダーバー『_』を使うことが出来ます。それと次に紹介する『予約語』を変数名としては使う ことはできません。
3
予約語
次の単語はPythonの文法上,特別な意味を持つので,変数名として使ってはいけません: Pythonの予約語print and for if elif else del is raise assert import from lambda return break global not try class except or while continue exec pass yield def finally in
4
文字列,数値,データの型
ここまでに,Pythonで変数,文字列,数を扱いました。数は65, − 3, 9.23等と表されたもの,文字列は ’Hello’のようにコーテーションマークで囲まれたもの,変数は文字列や数値等のデータを名前を付けて管理 するためのものです。それぞれについてもう少し詳しく解説します。4.1
文字列
文字列はコーテーションマーク’ ’や’’ ’’で囲まれたものとして定義されます。 1 > > > x = ’ h e l l o w o r l d ’ 2 > > > x 3 ’ h e l l o w o r l d ’4.2 データの方を調べる 4 文字列,数値,データの型 ここでxは変数で,’hello world’が文字列です。2つの文字列は+でつなげることができます。 1 > > > aa = ’ A l i c e ’ # 変 数a aにA l i c eを 代 入 2 > > > aa 3 ’ A l i c e ’ 4 > > > aa + ’ Bob ’ 5 ’ A l i c e B o b ’ 6 > > > aa + ’ and Bob ’ 7 ’ A l i c e and Bob ’ 4.1.1 文字列の中でのコーテーションと改行 文字列を定義するときにはその文字を『" "』か『’ ’』で囲みます。文字列の中でコーテーションをしたい 場合にはこれらを使い分けます。 1 > > > a = " T h i s is a ’ pen ’ " 2 > > > p r i n t a 3 T h i s is a ’ pen ’ # コ ー テ ー シ ョ ン マ ー ク を 含 む 文 字 列 改行を含む文字列は次のように『\n』を挿入して作ります: 1 > > > a = ’ aaa \ nb b b \ n c c c ’ 2 > > > a 3 ’ aaa \ nb b b \ n c c c ’ 4 > > > p r i n t a 5 aaa 6 bbb 7 ccc 『\n』を使わずに改行をするには,""" """または’’’ ’’’で囲みます。 1 > > > a = ’ ’ ’ aaa 2 ... bbb 3 ... ccc ’ ’ ’ 4 > > > a 5 ’ aaa \ nb b b \ n c c c ’ 6 > > > p r i n t a 7 aaa 8 bbb 9 ccc また『\』を使い,改行文字や,『\』,『"』,『’』などを表すことが出来ます。代表的な例を紹介しておきます: • \改行 ⇝ 改行を無視する • \\ ⇝ \ • \" ⇝ " • \’ ⇝ ’ • \n ⇝ 行送り • \t ⇝ タブ
4.2
データの方を調べる
文字列はstr型(string)と呼ばれます。1 > > > ty p e(’ h e l l o ’) # t y p e ( ’ h e l l o ’)の 型 を 調 べ る 2 <t y p e ’ str ’> # s t r型 で あ る 数値の型でよく使うものに整数型(int)と浮動小数点数(float)があります。 1 > > > ty p e( 1 2 3 ) # 123の 型 は ? 2 <t y p e ’ int ’> # 整 数 型 3 > > > ty p e( 3 . 1 4 ) # 3 . 1 4の 型 は ? 4 <t y p e ’ f l o a t ’> # f l o a t型 5 > > > a = 3 . 1 4 # 変 数a に3 . 1 4を 代 入 す る 6 > > > ty p e( a ) 7 <t y p e ’ f l o a t ’> # 変 数 aの 表 す デ ー タ( 3 . 1 4 )はf l o a t型
4.3
数値の型
上でintは整数型(integer),floatは浮動小数点数(floating point number)を意味しています。整数型
の演算は厳密に行われますが,浮動小数点数の計算では誤差が生じます。そしてPythonでは整数と浮動小数 点数の演算は浮動小数点数として実行されます: 1 > > > aa = 10 # int 2 > > > bb = 3 . 1 4 # f l o a t 3 > > > cc = aa + bb 4 > > > cc 5 1 3 . 1 4 6 > > > ty p e( cc ) 7 <t y p e ’ f l o a t ’> また整数型intは-2147483647から2147483647までしかサポートしていません(PC環境にもよります)。 それ以上になると長整数long型を使う必要があります。次のようにして,これを確かめてみましょう。 1 > > > dd = 2 * * 6 2 # d dは2の6 3乗 2 > > > dd 3 4 6 1 1 6 8 6 0 1 8 4 2 7 3 8 7 9 0 4 4 > > > ty p e( dd ) 5 <t y p e ’ int ’> # こ れ はi n t型 だ け ど 6 > > > ee = 2 * * 6 5 # e eは2の6 5乗 7 > > > ee 8 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 8 L # 最 後 のLはL o n g型 の 印 9 > > > ty p e( ee ) 10 <t y p e ’ lo n g ’> # こ れ はl o n g型 なぜ,同じ整数を扱うのにint型とlong型があるのでしょうか?自分が電卓を使って計算をすることを考 えてみましょう。電卓の桁数の中で収まる計算なら,ボタンを数回押すだけで計算は直ちに終了しますが,電 卓の桁数をはみ出るような計算の場合は,紙を用意して,数字を何桁かに分割して書いて,桁ごとにそれぞれ 計算して,最後に繰り上がりに注意しながら和をとり,最後の答えを紙に書く,という作業をしなければなり ません。コンピューターの内部でも同じことが起きていて,桁数の少ない数(といっても普通生活では出会わ ないような大きな数)の計算は用意されたCPUの命令で高速で実行することができますが,ある桁数を超え た計算は,より遅くなる別の手順で行わなければなりません。
ちなみにPython3ではint型とよばれる整数型しかありません。これはpython2のlong型と同じように
振る舞います。Python3は高速性を犠牲にして,整数についてより直感的にプログラムを書けることを重視
4.4 数値と文字列の変換 5 演算子と計算の順序
4.4
数値と文字列の変換
さて文字列と数値は足せるでしょうか? 1 > > > ’ A l i c e ’ + 1 9 9 9 2 T r a c e b a c k ( m o s t r e c e n t c a l l l a s t ): # エ ラ ー メ ッ セ ー ジ 3 F i l e " < stdin > ", l i n e 1 , in ? # エ ラ ー メ ッ セ ー ジ 4 T y p e E r r o r : c a n n o t c o n c a t e n a t e ’ str ’ and ’ int ’ o b j e c t s # エ ラ ー メ ッ セ ー ジ 上エラーを見ればわかるようにstr型とint型は足せません。文字列と数値をくっつけるには,数値を文字 列に変換する必要があります。 文字列,整数,小数の変換 str():数値を文字列に変換する(例:str(123)=’123’) int():文字列の数字を,整数に変換する(例:int(’123’)=123)) float():文字列の数字を,浮動小数点数に変換する(例:float(’123.45’)=123.45) 次のプログラムはうまくいくはずです: 1 > > > ’ A l i c e ’ + str( 1 9 9 9 ) # 19 9 9を 文 字 列’ 1 9 9 9 ’に し て か ら’ A l i c e ’に 付 け 加 え る 2 ’ A l i c e 1 9 9 9 ’ 逆に,文字列になっている数字列から整数や小数点数に変換してみましょう: 1 > > > aa = ’ 123 ’ # ’123 ’は 文 字 列 2 > > > int( aa ) 3 123 # 123は 整 数 4 > > > f l o a t( aa ) 5 1 2 3 . 0 # 1 2 3 . 0は 浮 動 小 数 点 数5
演算子と計算の順序
Pythonでは,数値計算は次の演算子(operator)で行います: 記号 意味 例 + 和(Addition) 10+20は30を与える - 差(Subtraction) 20-10は10を与える * 積(Multiplication) 4*5は20を与える / 除法(Division) 14/3は商4を与えるが14.0/3は4.66· · · 67のように小数で計算される % 余り(Modulus) 8%5は余り3を与える ** 冪(Power) 2**3は23= 8を与える 括弧は例外なく,最優先で計算されます。演算の優先順序は次のようになっています: 例えば,5*4/3**2は次のような順で計算されます:1 5 * 4 / 3 * * 2 = 5 * 4 / ( 3 * * 2 ) # 冪 が 最 初 に 計 算 さ れ る 2 = 5 * 4 / 9 3 = ( 5 * 4 ) / 9 # 左 か ら 計 算 さ れ る 4 = 2 0 / 9 5 = 2 # 整 数 同 士 の 割 り 算 は , 商 が 返 さ れ る ただし,上の順序が適用されない例外がただ一つだけあります。それは冪の計算です。たとえば: 1 3 * * 3 * * 3 = 7 6 2 5 5 9 7 4 8 4 9 8 7 L 2 ( 3 * * 3 ) * * 3 = 1 9 6 8 3 3 3 * * ( 3 * * 3 ) = 7 6 2 5 5 9 7 4 8 4 9 8 7 L この例では,冪は右から順に計算されています。したがって,冪(**)を複数回使用する場合は、括弧で囲ん で順番を明確にすることをおすすめします。 Pythonでの割り算『/』は整数同士では商を返すが,少数を含む計算では少数を返すので注意が必要です。 上の計算例では 1 5 . 0 * 4 / 3 * * 2 = 5 . 0 * 4 / 9 2 = 2 0 . 0 / 9 3 = 2 . 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 となります。
6
プリント
(print)
インタラクティブシェルでは入力したものが順次ディスプレイに表示されますが,ファイルからPythonを 実行したときにはprintを書かない限り,画面には表示されません。 次のファイルを作って実行してみましょう: •ファイル名:print01.py 1 a = 6 2 p r i n t 6 3 b = 4 4 a + b 実行結果の例 6 結果を見ればわかるように,3行目,4行目については何も出力はありません。print文が複数回あるときは, 改行されて表示されます: 1 p r i n t 4 2 p r i n t 5 実行結果の例 4 5 print文の後に改行をさせたくない場合はコンマ『,』を付けます: 1 p r i n t 4 , 2 p r i n t 2+3 実行結果の例 4 5 (注)上のようにprint文の中で計算させることも出来ます。7 リスト
7
リスト
リストとはデータのいくつかの集まりです。次を試してみましょう: 1 > > > a = [’ A l i c e ’, ’ Bob ’, 2 ,3 ,8] # リ ス ト を 定 義 し て aに 代 入 2 > > > a # aの 内 容 を 確 認 3 [’ A l i c e ’, ’ Bob ’, 2 ,3 ,8] 4 > > > ty p e( a ) # aの 型 を 確 認 5 <t y p e ’ li s t ’> # aの 型 は リ ス ト 続いて,リストの成分を取り出すには次のようにします: 1 > > > a [0] # aの 第1成 分 2 ’ A l i c e ’ 3 > > > a [ -1] # aの 最 後 の 成 分 4 8 5 > > > a [3] # aの4番 め の 成 分 6 3 7 > > > a [ -2] # aの 最 後 か ら2番 め の 成 分 8 3 リストの成分の番号は0から始まることに注意しましょう。存在しない成分を呼び出すとエラーが出ます: 1 > > > a [8] 2 T r a c e b a c k ( m o s t r e c e n t c a l l l a s t ): 3 F i l e " < stdin > ", l i n e 1 , in ? 4 I n d e x E r r o r : l i s t i n d e x out of r a n g e スライスという機能を使って,リストの要素を簡単に取り出すことが出来ます: リストからの要素の取り出し(スライス) • a[:n]は最初のn個の要素からなる新しいリスト, • a[-n:]は最後のn個の要素からなる新しいリスト, • a[n:]は最初のn個の要素を取り除いた新しいリスト, • a[:-n]は最後のn個の要素を取り除いた新しいリスト, • a[n:m]は最初のn個と最後のm個を除いた新しいリスト もっと大きなリストを作ってスライスしてみましょう: 1 > > > a = [’ a ’,’ b ’,’ c ’,’ d ’,’ e ’,’ f ’,’ g ’,’ h ’,’ i ’,’ j ’,’ k ’,’ l ’,’ m ’,’ n ’,’ o ’,’ p ’] 2 > > > p r i n t a [ : 5 ] 3 [’ a ’, ’ b ’, ’ c ’, ’ d ’, ’ e ’] 4 > > > p r i n t a [ -5:] 5 [’ l ’, ’ m ’, ’ n ’, ’ o ’, ’ p ’] 次にリストを足し合わせるとどうなるか試してみましょう: 1 > > > a = [1 ,2 ,3] 2 > > > b = [’ a ’, ’ b ’, ’ c ’] 3 > > > a + b 4 [1 , 2 , 3 , ’ a ’, ’ b ’, ’ c ’] つまり,リストの和はリストを結合する事を意味します。リスト自身への要素の追加はappend()という『メ ソッド』を使っても行うこともできます:1 > > > a . a p p e n d (’ A l i c e ’) 2 > > > a 3 [1 ,2 ,3 ,’ A l i c e ’] 変数の値を代入で書き換えるように,リストの値も代入で書き換えることが出来ます: 1 > > > a = [1 ,2 ,3] 2 > > > a [0] = ’ A l i c e ’ # a [0]をA l i c eに す る 3 > > > a 4 [’ A l i c e ’, 2 , 3] 次に,リストから要素を削除するにはpop(), remove()を使います: 1 > > > aa = [’ a ’, ’ b ’, ’ c ’, ’ d ’, ’ e ’, ’ b ’, 23 , 8 , 13] 2 > > > aa . pop () # a aの 末 尾 の 要 素 を 取 り 出 す 3 13 4 > > > aa 5 [’ a ’, ’ b ’, ’ c ’, ’ d ’, ’ e ’, ’ b ’, 23 , 8 , 12] 6 > > > aa . pop (3) # a aか ら3番 目 の 要 素 を 取 り 出 す 7 ’ d ’ 8 > > > aa 9 [’ a ’, ’ b ’, ’ c ’, ’ e ’, ’ b ’, 23 , 8] 10 > > > aa . r e m o v e (’ b ’) # a aに あ る 最 初 の’ b ’を 取 り 除 く 11 > > > aa 12 [’ a ’, ’ c ’, ’ e ’, ’ b ’, 23 , 8] # 二 つ 目 の’ b ’は 削 除 さ れ な い 連続する数字列のような特別なリストは最初から用意されています 1 > > > r a n g e(5) 2 [0 , 1 , 2 , 3 , 4] 3 > > > r a n g e(3 ,6) 4 [3 , 4 , 5] 5 > > > r a n g e( -3 ,3) 6 [ -3 , -2 , -1 , 0 , 1 , 2]
8
Python
で扱えるその他のデータ形式
8.1
タプル
リスト(list)のように要素を集めたものタプル(tuple)があります。タプルがリストと異なるところは, 変更が出来ない ことです。タプルは要素を丸括弧()で囲ってコンマで区切ります: 1 > > > a = (3 ,7 , ’ abc ’) # タ プ ル( t u p l e )を 定 義 2 > > > p r i n t a 3 (3 , 7 , ’ abc ’) 4 > > > ty p e( a ) 5 <t y p e ’ t u p l e ’> # aの 型 は タ プ ル タプルの要素を変更しようとするとエラーが起きます。 タプルのように変更不可能なものをImmutable(イミュータブル)といいます。文字列,数値,タプルは Immutableです。8.2 辞書(dictionary) 8 PYTHONで扱えるその他のデータ形式
8.2
辞書
(dictionary)
キー(key)と値(value)の対応を集めたものを辞書といいます。辞書は次のようにして作ります: 1 > > > a = {’ b i r t h ’:1534 , ’ ty p e ’:’ A ’, ’ n a m e ’:’ N o b u n a g a ’, ’ d e a t h ’: 1 5 8 2 } 辞書のキーを指定すると対応する値を呼び出すことが出来ます: 1 > > > p r i n t a [’ b i r t h ’] 2 1 5 3 4 keys()やvalues()を用いることでキーのリストと値のリストを得られます: 1 > > > b = a . k e y s () # aの 『 鍵 』 の 集 ま り をbと す る 2 > > > p r i n t b 3 [’ d e a t h ’, ’ t y p e ’, ’ n a m e ’, ’ b i r t h ’] 4 > > > c = a . v a l u e s () # aの 『 値 』 の 集 ま り をcと す る 5 > > > p r i n t c 6 [1582 , ’ A ’, ’ N o b u n a g a ’, 1 5 3 4 ] 辞書から要素を削除するには,delを使って削除したいキーを指定します: 1 > > > del a [’ t y p e ’] # t y p eの 鍵 を 削 除 2 > > > p r i n t a 3 {’ d e a t h ’: 1582 , ’ n a m e ’: ’ N o b u n a g a ’, ’ b i r t h ’: 1 5 3 4 } 辞書に要素を追加したい場合は,新しいキーと対応する値を次のように指示します: 1 > > > a [’ h o b b y ’] = ’ tea ’ 2 > > > p r i n t a 3 {’ h o b b y ’: ’ tea ’, ’ d e a t h ’: 1582 , ’ na m e ’: ’ N o b u n a g a ’, ’ b i r t h ’: 1 5 3 4 } 辞書のキーはimmutableでなければなりません。つまりリストはキーにはなれませんが,タプルをキーにす ることは出来ます: 1 > > > a = {(1 ,1 ,0):’ p o l i c e ’, (1 ,1 ,9):’ f i r e ’, (1 ,7 ,7):’ w e a t h e r ’} 2 p r i n t a 3 {(1 , 1 , 0): ’ p o l i c e ’, (1 , 1 , 9): ’ f i r e ’, (1 , 7 , 7): ’ w e a t h e r ’} キーと値をペアにしたタプルからなるリストをつかって,辞書を定義することも出来ます: 1 > > > a = [(1 ,’ One ’) , (2 ,’ Two ’) , (3 ,’ T h r e e ’)] 2 > > > b = di c t( a ) 3 > > > p r i n t b8.3
集合
(set)
要素を集めたものにリストやタプルがありましたが,順番を気にしない要素の集まりがsetです。要素は immutableなものだけがsetの要素になることができます。集合は次のように定義します: 1 > > > a = [1 ,4 ,3 ,2 ,2 ,2] 2 > > > b = set( a ) 3 > > > p r i n t b 4 set([1 , 2 , 3 , 4]) 5 > > > b . add (5) # bに5を 付 け 加 え る6 > > >p r i n t( b )
7 set([1 , 2 , 3 , 4 , 5])
要素はソートされていて重複が除かれているのがわかります。
9
練習問題
9.1
問題:
e
π− 20
の計算
pp = 3.41592,ee = 2.718281とする。eepp− 20を計算して表示(print)するPythonのプログラムを作
成せよ。ファイル名はproblem01.pyとし,端末からpython problem01.pyと実行したときに,答えを表
示するようなプログラムでなければならない。
eπ− 20は円周率に非常に近い値をとるが,これには何か理由があるのか,それとも偶然なのかわかってい
10 キーボードからのデータの取得
10
キーボードからのデータの取得
キーボードから入力した文字や数値に応じて,プログラムの結果を変化させる事を考えます。キー入力を取 得するにはraw_input()とinput()という関数を使います。前者は文字列を取得するときに使い,後者は 数値を取得するときに使います*5。次のファイルを作って実行してみましょう: •ファイル名:input1.py 1 # * c o d i n g : utf 8 * -2 3 n a m a e = r a w _ i n p u t(’あなたは誰ですか?:’) 4 p r i n t ’こんにちは’, namae , ’さん’ 上で作ったファイルを実行すると,次のような表示が出ます: 1 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 $ p y t h o n i n p u t 1 . py 2 あ な た は だ れ で す か ? : そこで,信州花子と入力してEnterキーを押せば 1 こ ん に ち は 信 州 花 子 さ ん と出力されます。上のプログラムは次の手順で実行されました: 1.「あなたはだれですか?:」と画面に表示 2. 変数namaeを作成。キーボード入力を待つ。 3. 入力された文字を変数namaeに代入 4.「こんにちは・・・」を画面に表示 ここで重要な点は,raw_input()で入力された文字列は変数namaeに格納されることです。 入力するものが数値である場合にはinput()関数を使います。キー入力を受け付けて,入力した数値の2 乗を出力するプログラムを作ってみます。 •ファイル名:input2.py 1 # * c o d i n g : utf 8 * -2 3 num = i n p u t(’数値を入力してください:’) 4 p r i n t ’入力された数値の2乗は’, num **2 , ’です’ これを実行すると次のようになります: 1 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 $ p y t h o n i n p u t 2 . py 2 数 値 を 入 力 し て く だ さ い :1 2 3 3 入 力 さ れ た 数 値 の 2 乗 は 1 5 1 2 9 で す 上の二つを合わせて次のようなBMIを計算するプログラムを作ってみましょう: •ファイル名:bmi1.py 1 # * c o d i n g : utf 8 * -2 3 n a m a e = r a w _ i n p u t(’あなたの名前を入力してください:’) 4 s h i n t y o = i n p u t(’あなたの身長は何センチですか?:’)5 w e i g h t = i n p u t(’あなたの体重は何キログラムですか?:’) 6 bmi = 1 0 0 0 0 * w e i g h t /( s h i n t y o * * 2 ) 7 p r i n t namae , ’さんのBMIは’, bmi , ’です’ プログラムを実行して自分のBMIを計算してみましょう。
11
論理型と比較演算子
数学では,正しい命題は真,間違った命題は偽であるといいます。Pythonでも真偽値というものがあり, 条件が正しいかどうかで真・偽の値が決まります。これらは条件に応じて処理を変化させるときに使います。Pythonでは真をTrue,偽をFalseで表します。これらは予約語であり特別な意味を持ちます。文法に注
意しながら,インタラクティブシェルでの例を見てください: 1 > > > a = 3 # aに3を 代 入 2 > > > a == 3 # aは3だ ろ う か ? 3 T r u e # a ==3は 正 し い ! 4 > > > a == 2 # aは2だ ろ う か ? 5 F a l s e # a ==2は 正 し く な い 6 > > > a > 2 7 T r u e 8 > > > 3 != 2 # 3は2に 等 し く な い だ ろ う か ? 9 T r u e # 3と2は 異 な る の で , 上 の 条 件 は 真 この例のように,二つの数値を比較して真か偽かの条件を調べる事ができます。上の例で『==, >, !=』とい う記号を用いました。これらはデータを比較するときに用いるので比較演算子と呼ばれています。数値に対し て使える使える比較演算子には次があります: 数値に対して使える比較演算子 == != < > <= >= これらは,それぞれ伝統的な数学記号=, ̸=, <, >, ≤, ≥に対応しています。
不等号と等号の順番は英語の”less than or equal”の順番と同じだと憶えましょう。『!=』は”not equal”と憶
えます。
TrueとFalseには論理演算and, or, notを行うことが出来ます。
1 > > > a = Tr u e # aをT r u eと す る 2 > > > b = F a l s e # bをF a l s eと す る 3 > > > a and b # aか つbは ? 4 F a l s e 5 > > > a or b # aま た はbは ? 6 T r u e 7 > > > not a # aの 否 定 は ? 8 F a l s e データが与えられたときに,それらの関係に対して真偽値を得ることが出来ます。 リストや集合などコレクションに対して使える比較演算子もあります: リストや集合などに対して使える比較演算子 == != in ==と!=の説明は不要でしょう。inは次のように用います:
12 条件分岐 1 > > > a = [3 ,6 ,5 ,1] # aを リ ス ト[3 ,6 ,5 ,1]と す る 2 > > > 5 in a # 5は aの 中 に い る だ ろ う か ? 3 T r u e 4 > > > 7 in a # 7は aの 中 に い る だ ろ う か ? 5 F a l s e 次のようにして,型を調べるtypeと組み合わせて使うことも出来ます: 1 > > > a = [3 ,5 ,6 ,1] 2 > > > ty p e( a ) 3 <t y p e ’ li s t ’> 4 > > > ty p e( a ) == li s t 5 T r u e 6 > > > ty p e( a ) == t u p l e 7 F a l s e
12
条件分岐
12.1
if
文
条件(TrueかFalse)に応じて,処理を変化させるときにif文という決められた文法を用います。if文の手
順は次のチャートの通りです: ᮲௳A ᮲௳A䛜┿ ฎ⌮X ᮲௳A䛜ഇ これをPythonでは次の文法で書きます:
Pythonでのif文の構造 1 if 条 件A : 2 [ 処 理X ] 3 [ 処 理X ] 4 [ 処 理X ] • 条件AがTrueであれば処理Xが行われ,Falseであれば処理Xは行われません。 • ifの行の行末のコロン『:』を忘れずに! • 処理X数行にわたる場合は,上のようにインデントを揃える。 ここで処理Xの前のインデント(字下げ)が文法上重要な役割を果たします。処理Xが数行にわたるときに, どこまでが 処理Xであるかはインデントによって判断されます。インデントは単なるスペースで見えないの ですが,インデントが揃った部分が,処理されるプログラムの塊(ブロック)であると判断されます:
if ᮲௳A:
䜲䞁䝕䞁䝖ฎ⌮X
if文を使った例題をやってみましょう。次のアルゴリズムをPythonプログラムにします。 (1) 整数aを入力させる。 (2) aが偶数なら,『a is even』とプリントしてから,aを半分にする。 (3) aが奇数なら何もしない。 •ファイル名:if1.py 1 # * c o d i n g : utf 8 * -2 a = i n p u t(’ I n p u t i n t e g e r a : ’) 3 4 if a %2 == 0: # も し aが 偶 数 な ら 5 p r i n t ’ a is ev e n ’ 6 a = a /2 # aを 半 分 に す る 。 行 頭 の イ ン デ ン ト は 重 要 ! ! ! 7 8 p r i n t a # aの 値 を プ リ ン ト 上のプログラムの4∼6行目がif文です。実行していくつかの数値を入れて動作を試してみましょう。12.2
if-else
文
次に,少し複雑な条件分岐を考えます。条件が真のときには処理X,偽のときには別の処理Yがしたいと しましょう。12.2 if-else文 12 条件分岐 ᮲௳A ᮲௳A䛜┿ ฎ⌮X ᮲௳A䛜ഇ ฎ⌮Y
if ᮲௳A:
䜲䞁䝕䞁䝖ฎ⌮X
else:
䜲䞁䝕䞁䝖ฎ⌮Y
もちろん,これは上で説明したif文だけで書くことができます。つまり 1 if 条 件A : # 条 件 Aが 真 な ら 2 処 理X # 処 理 Xを 行 い , 偽 な ら 行 わ な い 。 3 if not 条 件A : # 条 件 Aが 偽 な ら 4 処 理Y # Yを 行 い , そ う で な け れ ば 行 わ な い 。 と書くだけです。しかし,次に説明するif-else文を使って,より明示的に書くこともできます。 Pythonでのif-else文の構造 1 if 条 件A : 2 処 理X 3 el s e: 4 処 理Y • 条件AがTrueであれば,処理Xが行い,Falseであれば処理Yを行う。 • ここでも処理X,処理Yはインデントによって判断されます。 if-else文を使った例題をやってみましょう。次のアルゴリズムを考えます。 (1) 整数aを入力させる。 (2) もしaが偶数ならば,aを半分にする。 (3) もしaが奇数ならば,aを3*a+1にする (4) aの値を表示する。 これをプログラムで書いてみましょう。 •ファイル名:if2.py 1 # * c o d i n g : utf 8 * -2 a = i n p u t(’ a ?: ’) 3 4 if a %2 == 0: # も し aが 偶 数 な ら 5 a = a /2 # aを 半 分 に す る 6 e l s e: # そ う で な け れ ば7 a = 3* a + 1 # aを3 a +1に す る
8
9 p r i n t a # aの 値 を プ リ ン ト
このプログラムを実行していくつかの数値を入れて動作を試してみましょう。
12.3
if-elif-else
文
さらに条件分岐を記述するためにはif-elif-else文を使います。elifはelse ifの略です。
if-elif-else文の構造 1 if 条 件A : 2 処 理X 3 el i f 条 件B : 4 処 理Y 5 el s e: 6 処 理Z • 条件Aが真の場合に処理Xを行います。 • 条件Aが偽で条件BがTrueのときに,処理Yを行います。 • 条件Aも条件Bも成り立たないときに,処理Zを行います。 • さらに条件C,条件D,・・・と条件が続く場合はelifで処理します。 ᮲௳A ᮲௳A䛜┿ ฎ⌮X ᮲௳A䛜ഇ ฎ⌮Y ᮲௳B ᮲௳B䛜┿ ᮲௳B䛜ഇ ฎ⌮Z
if ᮲௳A:
䜲䞁䝕䞁䝖ฎ⌮X
elif ᮲௳B:
䜲䞁䝕䞁䝖ฎ⌮Y
else:
䜲䞁䝕䞁䝖ฎ⌮Z
さらにelifを追加して,if-elif-elif-elif-elseのように条件を増やすことができます。12.4
複雑な
if
文の例
if-elif-else文を使って,与えた西暦が閏年かどうかを判定するプログラムを作りたい。グレゴリウス暦 では閏年は次のように決められている: • 西暦年が4で割り切れる年は閏年とする。 • ただし西暦年が4で割り切れる年でも,100で割り切れる年は閏年としない。13 練習問題 • ただし西暦年が4で割り切れ,100でも割り切れる年でも400で割り切れる年は閏年とする。 上の閏年の定め方の文章には,『ただし』が多くあって,論理構造がわかりにくく,そのままではプログラ ムにはしづらい。そこで閏年の条件を次のように書き直します: 1. 西暦年が400で割り切れるならば,それは閏年である。 2. 上以外のとき,西暦年は100で割り切れるならば,それは閏年ではない。 3. 上以外のとき,西暦年が4で割り切れるならば,それは閏年である。 4. 上のどれにも当てはまらないとき,その年は閏年ではない。 これを実現するPythonのプログラムは次のようになります。 •ファイル名:uruuQ.py 1 # * c o d i n g : utf 8 * -2 y e a r = i n p u t(’西暦を入力: ’) # 入 力 し た 数 値 を 変 数y e a rに 代 入 す る 3 4 if y e a r % 400 == 0: # も しy e a rを4 0 0で 割 っ た 余 り が0な ら 5 p r i n t year , ’は閏年です。’ 6 e l i f ye a r % 100 == 0: # そ う で な い と き , も しy e a rが1 0 0で 割 り 切 れ た ら 7 p r i n t year , ’は閏年ではありません。’ 8 e l i f ye a r % 4 == 0: # そ う で な い と き , も しy e a rが4で 割 り 切 れ た ら 9 p r i n t year , ’は閏年です。’ 10 e l s e: # 上 の 全 て の 条 件 に 当 て は ま ら な い と き 11 p r i n t year , ’は閏年ではありません。’
13
練習問題
13.1
問題:
BMI
計算プログラム
名前,身長,体重を入力させ,そこからBMIを計算・表示し,その値に応じてやせ・肥満度の結果を出す プログラムを作りたい。プログラムは次の手順を行うものとする。 (1) 名前を入力させ,変数名namaeに代入 (2) 身長・体重を入力させ,それぞれshintyo, weightに代入 (3) bmiを表示 (4) もしbmi<18.5なら,「やせ気味です」と表示 (5) そうでないとき,bmi<25.0なら,「ふつうです」と表示 (6) そうでないとき,bmi<30なら,「太り気味です」と表示 (7) うえのどちらでもないとき「太りすぎです」と表示 上の手順が実行されるように,つぎのプログラムの『*****』の部分を推測してプログラムを完成させなさい。 •ファイル名:bmi2.py 1 # * c o d i n g : utf 8 * -2 3 n a m a e = r a w _ i n p u t(’あなたの名前を入力してください:’) 4 s h i n t y o = i n p u t(’あなたの身長は何センチですか?:’) 5 w e i g h t = i n p u t(’あなたの体重は何キログラムですか?:’) 6 7 bmi = 1 0 0 0 0 . 0 * w e i g h t /( s h i n t y o * * 2 )8 bmi = r o u n d( bmi ,1) # b m iの 値 を 小 数 点 以 下2桁 目 を 四 捨 五 入 す る 9 10 p r i n t namae , ’さんのBMIは’, bmi , ’で’, 11 12 if * * * * * * * * * * : 13 * * * * * ’やせ気味です。’ 14 e l i f * * * * * * * * * * : 15 * * * * * ’ふつうです。’ 16 * * * * * * * * * * * * * * * : 17 * * * * * ’太り気味です。’ 18 * * * * : 19 * * * * * ’太りすぎです。’
14 FOR文による繰り返し
14
For
文による繰り返し
14.1
For
文の文法
同じ処理の繰り返しを記述するにはfor文を使います。たとえば,helloをプリントするという処理を5 回繰り返すには手動で 1 > > > p r i n t ’ h e l l o ’ 2 h e l l o 3 > > > p r i n t ’ h e l l o ’ 4 h e l l o 5 > > > p r i n t ’ h e l l o ’ 6 h e l l o 7 > > > p r i n t ’ h e l l o ’ 8 h e l l o 9 > > > p r i n t ’ h e l l o ’ 10 h e l l o とやればよいのですが,次に説明するfor文を使えば,このような処理をより簡潔に書くことができます: 1 for j in r a n g e(5 ) : 2 p r i n t ’ h e l l o ’ 実際に,Pythonのインタラクティブシェルから上のプログラムを書けば次のような表示になるでしょう: 実行結果の例 >>> for j in range(5): ... print ’hello’ ... hello hello hello hello hello ここで,range(5)はリスト[0,1,2,3,4]だったことを思い出しましょう*6: 1 > > > r a n g e(5) 2 [0 ,1 ,2 ,3 ,4]上の,for文で『for j in range(5):』はjを0から4まで順番に変えて,その下のブロックの処理を繰
り返しているので,次のようにjそのものの値を使うこともできます: 1 for j in r a n g e(5 ) : 2 p r i n t j 実行結果の例 0 1 2 3 4 5 ここでjはダミー変数なので,他の文字に変えても結果全く同じです。例えば,次のプログラムは上のものと 同じです: 1 for x in r a n g e(5 ) : 2 p r i n t x
さて,for文の構造は次のようになっています: For文の構造 同じ作業を10回繰り返すプログラムです: 1 for j in r a n g e( 1 0 ) : 2 |こ こ の ブ ロ ッ ク に| 3 | 繰 り 返 す | 4 |プ ロ グ ラ ム を 書 く| 5 6 <次 に 行 う プ ロ グ ラ ム は こ こ に 書 く> • インデント(字下げ)されている部分が繰り返す処理。 • 6行目は,インデントから外れるのでfor文の外にあるので繰り返されません。これはfor文が 終わってから実行されます。
for
j
in range(10):
䜲䞁䝕䞁䝖
ฎ⌮X
j
䠖0䊻1䊻䈈䊻9
図2 for文の構造 Start ฎ⌮X End j=0 j=1 ฎ⌮X j=2 ฎ⌮X j=3 ฎ⌮X j=4 ฎ⌮X 図3 for文で行われる処理(5回の繰り返し)14.2
for
文のいくつかの例
for文のプログラムをいくつか書いて実行結果を見てみましょう: •ファイル名:for1.py 1 for j in r a n g e(5 ) : # 以 下 の ブ ロ ッ ク を5回 繰 り 返 す 2 p r i n t ’ w a n w a n ’, # こ れ と14.2 for文のいくつかの例 14 FOR文による繰り返し 3 p r i n t ’ n y a n n y a n ’ # こ れ を 繰 り 返 す 実行結果の例 wanwan nyannyan wanwan nyannyan wanwan nyannyan wanwan nyannyan wanwan nyannyan 次のプログラムの最後の行はfor文のインデントから外れるので一回しか実行されません: •ファイル名:for2.py 1 for j in r a n g e(5 ) : # 以 下 の ブ ロ ッ ク を5回 繰 り 返 す 2 p r i n t ’ w a n w a n ’, # こ の 行 と 3 p r i n t ’ n y a n n y a n ’ # こ の 行 を 繰 り 返 す が 4 5 p r i n t ’ g a o g a o ’ # こ こ は 繰 り 返 さ な い 実行結果の例 wanwan nyannyan wanwan nyannyan wanwan nyannyan wanwan nyannyan wanwan nyannyan gaogao for文を使って0から9までの数字の2乗を表示します: •ファイル名:for3.py 1 for j in r a n g e( 1 0 ) : # jを0か ら9ま で 変 え て 次 を 繰 り 返 す 2 p r i n t j , j **2 # jとjの 二 乗 を プ リ ン ト す る 3 4 p r i n t ’ o w a r i ’ # こ こ は 繰 り 返 さ な い 実行結果の例 0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 owari 数字を文字列にしてつなげれば次のような操作もすぐにできます: •ファイル名:for4.py 1 # * c o d i n g : utf 8 * -2 for j in r a n g e(1 , 1 0 1 ) : 3 p r i n t ’ひつじが’+str( j )+’匹’ 実行結果の例 ひつじが 1 匹 ひつじが 2 匹 ひつじが 3 匹 ・・・・・ ・・・・・ ・・・・・ ひつじが 99 匹 ひつじが 100 匹 与えられたリストに対して,その要素について順番に同じ作業をすることができます: •ファイル名:for5.py 1 aa = [ ’ A l i c e ’, ’ f a l l s ’, ’ d o w n ’, ’ a ’, ’ r a b b i t ’, ’ ho l e . ’] # リ ス トa aを 定 義
2
3 for i in aa : # a aの 中 のiに つ い て 順 番 に
4 p r i n t i , # iを プ リ ン ト す る
実行結果の例 Alice falls down a rabbit hole.
14.3
for
文のインデントのエラー
Pythonの文法の特徴にインデントで構文を判断するというものがありました。if-else文ではインデント を間違えるとエラーになりましたが,for文でも同じ事がおきます。次の例のように字下げが少し違うとエ ラーとなります: •ファイル名:for6.py 1 for j in r a n g e(5 ) : 2 p r i n t ’ w a n w a n ’, 3 p r i n t ’ n y a n n y a n ’ 実行結果の例 File "for6.py", line 3print ’nyannyan’ ^
IndentationError: unindent does not match any outer indentation level 次のようにインデントを不当に下げた場合も同じエラーとなります: •ファイル名:for7.py 1 for j in r a n g e(5 ) : 2 p r i n t ’ w a n w a n ’, 3 p r i n t ’ n y a n n y a n ’ 実行結果の例 File "for7.py", line 3
print ’nyannyan’ ^
IndentationError: unindent does not match any outer indentation level
14.4
for
文の応用1:
(for
文の中に
for
文を入れる
)
もちろんfor文の中にfor文を入れて二重に繰り返す事もできます。 •ファイル名:for8.py 1 for i in r a n g e(5 ) : # i = 0 ~ 5に 対 し て 以 下 を 繰 り 返 す 2 for j in [’ a ’,’ b ’,’ c ’]: # j = a , b , cに 対 し て 次 を 繰 り 返 す 3 p r i n t i , j , # iとjを プ リ ン ト 実行結果の例 0 a 0 b 0 c 1 a 1 b 1 c 2 a 2 b 2 c 3 a 3 b 3 c 4 a 4 b 4 c 次のようにすれば掛け算の表が出力されます: •ファイル名:for9.py 1 for i in r a n g e(1 ,10): # i =1 ,2 ,... ,9と 2 for j in r a n g e(1 ,10): # j =1 ,2 ,... ,9に 対 し て 3 p r i n t i * j , # i * jを プ リ ン ト 4 p r i n t ’ ’ # こ こ で 改 行
14.5 for文の応用2:if文と組合わせる 14 FOR文による繰り返し 実行結果の例 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
14.5
for
文の応用
2
:
if
文と組合わせる
if文と組合わせて,for文の中で処理を分岐させるとより複雑なプログラムが書けます。次ではjが偶数な らj is even,奇数ならj is oddと表示させるようなプログラムです: •ファイル名:for10.py 1 for j in r a n g e(1 ,10): 2 if j %2 == 0: 3 p r i n t j , ’ is e v e n ’ 4 el s e: 5 p r i n t j , ’ is odd ’ 実行結果の例 1 is odd 2 is even 3 is odd 4 is even 5 is odd 6 is even 7 is odd 8 is even 9 is odd14.6
for
文の応用
3: break
で処理を止める
for文では与えられた回数だけ繰り返すことが簡単にできますが,処理を途中で止めたいときにはbreakを使います。for文の繰り返し中にbreakが現れたらそのfor文から抜けます。例えば次のようなプログラム
を考えます。 • 22j でjを1, 2, 3,· · · , 10と動かして次々プリントしてゆきます, • これは非常な早さで増加するので,もし22j の値が100000000を超えてしまった場合にはそこでfor文 処理をやめたい。 •ファイル名:for11.py 1 for j in r a n g e( 1 1 ) : 2 a = 2 * * 2 * * j 3 if a < 1 0 0 0 0 0 0 0 0 0 0 0 0 : 4 p r i n t a 5 el s e: 6 p r i n t ’ Too big !! ’ 7 b r e a k # こ れ が 実 行 さ れ た らf o r文 は お し ま い 実行結果の例 2 4 16 256 65536 4294967296 Too big!!
15
ファイルの書き込み・読み込み
Pythonの実行結果をファイルに書き込んで保存する方法を解説します。15.1
ファイルの書き込み
(
その1
)
ファイルの書き込みで手軽なのは,端末の機能を使うことです,Pythonプログラムで書きたいものをprint しておけば, 1 u s e r @ d e b i a n :~/ D e s k t o p / d a t a p r o c 1 /06 $ のように,端末でプログラムの置いてあるディレクトリで 1 $ p y t h o n フ ァ イ ル 名. py > 出 力 す る フ ァ イ ル 名. txt とすることによりプリントされたものをファイルに書き出すことができます。たとえば 1 $ p y t h o n f o r 4 . py > f o r 4 r e s u l t . txt すると,フォルダにはfor4result.txtというファイルが新たに作られ,for4.pyの実行結果が書き込まれ ています。ファイルの末尾に『追記』するには,『>>』を使います。試しに 1 $ p y t h o n f o r 3 . py > > f o r 4 r e s u l t . txt を実行してみましょう。これで,for4result.txtのファイルの最後に,for3.pyの実行結果が書き込まれ ました。15.2
ファイルの書き込み(その
2
)
ファイルに書き込むもう一つの方法はPython自体のファイル操作の機能を使うことです。 •ファイル名:write1.py 1 # * c o d i n g : utf 8 * -2 abc = ’ h o g e h o g e ’ # 変 数 a b cを 定 義 3 f = op e n(’ t e s t . txt ’, ’ a ’) # 追 記 モ ー ド( a )で 開 く 4 f . w r i t e ( abc ) # a b cをt e x t . t x tに 書 き 込 む(追 加) 5 f . c l o s e () # フ ァ イ ル を 閉 じ る 1 $ p y t h o n w r i t e 1 . py を実行するとtest.txtが作られてhogehogeという文字列が書き込まれました。もう一度実行すると,文字 列がさらに追加されます。追記ではなく,今あるものを消去してから書き込むには上の3行目の代わりに 1 f = op e n(’ t e s t . txt ’, ’ w ’) # 書 き 込 み モ ー ド( w )で 開 く とすればよいです。 例として,ひつじが・・・のプログラムをこの手順でファイルに書き出すことをやってみましょう。そのた めには,まず文字列を作成しなければなりません。 •ファイル名:CountSheep.py 1 # * c o d i n g : utf 8 * -2 3 abc = ’ ’ # 変 数 a b cを 空 の 文 字 列 と す る15.3 ファイルの読み込み 15 ファイルの書き込み・読み込み 4 5 for i in r a n g e( 1 0 ) : 6 abc = abc + ’ひつじが’+str( i )+’匹\ n ’ # \ nは 改 行 を 意 味 す る 7 8 f = op e n(’ h i t s u j i . txt ’, ’ w ’) # フ ァ イ ル( h i t s u j i . txt )を w r i t eモ ー ド で 開 く 9 f . w r i t e ( abc ) 10 f . c l o s e () このファイルを実行すれば,自動的にhitsuji.txtというファイルが作られ,中に,『ひつじが・・・』と書 き込まれます。
15.3
ファイルの読み込み
ファイルを読み込むにはreadやreadlinesを使います。前者はファイルの全部の内容を一つの文字列と して読み込み,後者はファイルの各行のリストを作り出します。ここで,読み込むファイルを作るために次を 実行します: 1 $ p y t h o n f o r 1 1 . py > h o g e . txt ディレクトリにはhoge.txtが生成されて,for11.pyの実行結果が記録されました。さて,このファイルを readで読み込みます: •ファイル名:read1.py 1 # * c o d i n g : utf 8 * -2 3 f = op e n(’ h o g e . txt ’, ’ r ’) # 読 み 込 み モ ー ド で 開 く 4 aaa = f . r e a d () # ho g e . t x tの 内 容 をa a aと す る 5 p r i n t aaa # a a aの 内 容 を プ リ ン ト す る 6 7 f . c l o s e () # ho g e . t x tを 閉 じ る 実行結果の例 2 4 16 256 65536 4294967296 Too big!! つぎに,各行をreadlinesで読み込みます: •ファイル名:read2.py 1 # * c o d i n g : utf 8 * -2 3 f = op e n(’ h o g e . txt ’, ’ r ’) # 読 み 込 み モ ー ド で 開 く 4 aaa = f . r e a d l i n e s () # ho g e . t x tの 各 行 か ら な る リ ス ト をa a aと す る 5 p r i n t aaa # a a aの 内 容 を プ リ ン ト す る 6 7 f . c l o s e () # ho g e . t x tを 閉 じ る 実行結果の例 [’\n’,’4\n’,’16\n’,’256\n’,’65536\n’,’4294967296\n’,’Too big!!\n’,] aaaはhoge.txtの各行が文字列になったリストである事がわかります。改行は「\n」になっています。16
練習問題
16.1
問題:
3n + 1
問題
3n + 1問題というものがあります。自然数nに対して • もしnが偶数ならnを半分にする • もしnが奇数ならnを3n + 1にする という操作を繰り返すと,最終的にはどんな自然数も1になるであろうという予想です。現在も未解決の問題 で角谷の問題とかCollatz予想と呼ばれています。例えば,最初の数が9の場合上の手順で作られる数列は 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 となります。入力された数aに対して,上の手順で作られる数を次々に表示するプログラムを作りたい。プロ グラムは次のアルゴリズムに従うように作りたい。 1. 自然数aの値を入力させる。 2. 最大の繰り返し回数maxiterを1000とする。 3. 以下の4から7をfor文でmaxiter回繰り返す。 4. もしaの値が1ならbreakでfor文を終了する 5. もしaが偶数ならaを半分にする 6. もしaが奇数ならaを3a + 1にする 7. aをプリントする 以下のPythonプログラムの****を自分で考えて上のアルゴリズムが実現するようにしなさい。 •ファイル名:collatz.py 1 a = i n p u t(’ a ?: ’) 2 p r i n t a , 3 4 m a x i t e r = 1 0 0 0 5 for i in r a n g e( m a x i t e r ): 6 * * * * * * * * * * * 7 b r e a k 8 * * * * * * * * * * * * * * 9 * * * * * * * 10 * * * * * 11 * * * * * * * * * * * 12 p r i n t a , プログラムが完成したら実行してaとして19を入力してみましょう。 実行結果の例 a?: 19 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 のようになればおそらく正しいプログラムです。 (注意)上のプログラムでは最大の繰り返し回数を1000に設定しましたが,実際に何回繰り返したらよいのか 分からない処理を書くにはwhile文を使います(1000回では足りないかもしれない!)。while文は次の章で 学習します。16.2 数字当てゲーム 16 練習問題
16.2
数字当てゲーム
1から1000までの数字xをランダムに生成して,xを8回以内で当てるゲームを作りたい。 乱数はライブラリをインポートすることで手軽に使うことができます。次が乱数を使った簡単なプログラム の例です。 1 i m p o r t r a n d o m # 乱 数 の ラ イ ブ ラ リr a n d o mを イ ン ポ ー ト す る 2 x = r a n d o m . r a n d i n t (1 ,10) # 1か ら1 0ま で の 数 字 を ラ ン ダ ム に 生 成 し xと す る 。 3 p r i n t x さて,ここでは,次のような手順を行う数字当てゲームを作りたい。 (i) 1から1000までの数を一つランダムに生成し,それをxとする。 (ii)『xを当ててみよう』と表示する。 (iii) キーボードから入力された数字を変数aに入れる。 (iv) a = xなら『正解』と表示しゲームは終了する。 (v) a < xなら『もっと大きい』と表示し,a > xなら『もっと小さい』と表示する。(vi) 上の(iii)–(v)を8回繰り返し,当てることができなければ,『Game Over』と表示する。
より詳細な手順を示したアルゴリズムはつぎの通りです。 (1) ライブラリrandomをインポートする。 (2) 1から1000までの数を一つランダムに生成し,それをxとする。 (3)『1から1000までの数字xをランダムに生成されました。xを8回以内で当ててみよう!』と表示 する。 (4) for文でjを0から7まで変えながら,次の(5)–(8)の処理を繰り返す。 (5) inputで『残り8− j回です。xは何でしょう?:”』と表示して,キーボードからのデータを取得し, それを変数aに入れる。 (6) もしa = xなら『正解』と表示し,breakでfor文から抜け, (7) もしa < xなら『もっと大きいよ』と表示し, (8) そうでないなら『もっと小さいよ』と表示する。 (9) もし,x̸= aなら次の(10),(11)を行う。 (10)『正解はxでした』と表示する。 (11)『残念 Game Over』と表示する。
17
while
文による繰り返し
上の問題は3n + 1問題に関するものでした。そこでは自然数nに対して,もしnが偶数ならnを半分に し,nが奇数ならnを3n + 1にする,という操作をnの値を表示しながら,最終的にn = 1になるまで繰り 返し行うものでした。そこでは,for文を使い,繰り返しの回数は最大1000回までと決めていましたが,この 数列は何回のステップでn = 1になるか分からないし,そもそもどんな自然数から始めても最後にn = 1と いうことは証明されていません(反例も見つかっていません)。このように,何回繰り返すかわからない場合 はfor文ではなく,次に説明するwhile文によって記述しなければなりません。17.1
while
文の文法
ある処理の繰り返し行うときに,繰り返す回数がわかっていればfor文を使いますが,繰り返す回数が分か らない場合や永遠に繰り返しを行う場合にはwhile文によってプログラムを記述します。 while文 1 w h i l e 条 件A : 2 [ 処 理X ] 3 [ 処 理X ] • 条件AがTrueであるあいだ,ずっと処理Xを繰り返すプログラムです。• まず条件AがFalseなら処理Xは行われずwhile文は終わります。もしAがTrueだったら処
理Xが実行され,Xの終了後にまた条件Aをチェックします。同様に,AがTrueならば処理X
を行いFalseならwhile文は終わりです。この繰り返しは,条件AがTrueである限りずっと続
きます。そして条件AがFalseになったらwhile文は終わり,その次の処理に進みます。 • オプションとしてbreak, continueを使うとより柔軟な制御が可能になります: – 処理Xの実行中にbreakが現れると強制的にwhile文から抜けます。 – 処理Xの実行中にcontinueが現れたら,処理Xを中断し条件Aを確認するプロセスにジャ ンプします。
while
᮲௳A:
䜲䞁䝕䞁䝖ฎ⌮X
図4 while文の文法Start
ฎ⌮X
End
᮲௳A䠖
True
False
図5 while文の処理の流れ17.2 while文の例 17 WHILE文による繰り返し 次のwhile文の簡単な例を見てみましょう。 •ファイル名:while1.py 1 a = 1 2 w h i l e a < 1 0 : # aが1 0未 満 な ら 以 下 を 続 け る 3 p r i n t a * a , # aの 二 乗 を プ リ ン ト す る 4 a = a +1 # aの 値 を 一 つ 増 や す 5 6 p r i n t ’ o w a r i ’ # w h i l e文 を 抜 け て か ら こ の 処 理 を 行 う 実行結果の例 1 4 9 16 25 36 49 64 81 owari
ここで,上の説明での条件Aに相当するものは『a<10』で,処理Xは『print a*a; a = a+1,』です。
while1.pyでは次のような処理を行っています:
1. 変数aを1にセットする。
2. a<10か調べる。a=1だからは条件a<10は真なので
3. a*a=1をプリントする。aの値を1増やす(a=2になる)
4. a<10を調べる。条件a<10は真なので
5. a*a=4をプリントする。aの値を1増やす(a=3になる)
6. ...
7. a*a=9をプリントする。aの値を1増やす(a=10になる)
8. a<10を調べる。条件a<10は偽なのでwhile文の処理は終わる。
9. owariと表示する。 上の処理のように,while文の中にカウンター(一つずつ増える変数)と停止条件を書くことで,for文と同 じ処理を行うことができます。次のfor文は上のプログラムwhile1.pyと同じ出力になります。 1 for a in r a n g e(1 ,10): 2 p r i n t a * a 3 4 p r i n t ’ o w a r i ’