Python と SageMath
佐々木格 ( 信州大学理学部 )
2020 年 4 月 26 日
この文章は“クリエイティブ・コモンズ ライセンス” 表示-継承4.0国際(CC BY-SA 4.0)の下に配布さ れます。詳しくは
https://creativecommons.org/licenses/by-sa/4.0/legalcode.ja
を参照してください。これを要約すると次のようになります(ライセンスの代わりになるものではありませ ん)。
あなたは以下の条件に従う限り,自由に:
共有— どのようなメディアやフォーマットでも資料を複製したり,再配布できます。
翻案— 資料をリミックスしたり,改変したり,別の作品のベースにしたりできます。
営利目的も含め,どのような目的でも。
あなたがライセンスの条件に従っている限り,許諾者がこれらの自由を取り消すことはできません。
あなたの従うべき条件は以下の通りです。
表示— あなたは 適切なクレジットを表示し,ライセンスへのリンクを提供し,変更があったらその旨を示さ なければなりません。あなたはこれらを合理的などのような方法で行っても構いませんが,許諾者があ なたやあなたの利用行為を支持していると示唆するような方法は除きます。
継承— もしあなたがこの資料をリミックスしたり,改変したり,加工した場合には,あなたはあなたの貢献部 分を元の作品と同じライセンスの下に頒布しなければなりません。
追加的な制約は課せません—あなたは,このライセンスが他の者に許諾することを法的に制限するようない かなる法的規定も技術的手段も適用してはなりません。
概要
Pythonは非常に良くデザインされたプログラミング言語で,覚えやすく可読性の高いコードが書ける事
が特徴です。本講義の後半では数式処理システムSageMath(セイジ,以下Sageと略)を学習します。
Sageは100個ほどの数学ソフトウェアを統合した大規模なソフトウェアで,基礎代数,微分・積分,整 数論,暗号理論,数値計算,可換代数,群論,組み合わせ論,グラフ理論等の計算を行うことができます。
手軽にグラフを描画することもできるし,数学の研究で本格的に使うこともあります。
Pythonには系2と系3の二つの系統があり,それらには完全な互換性はありません。Sageのプログラ ムはPythonの文法で記述しますので,本講義では,まずはPythonの基本事項を学び,後半でSageを 使った数学的な計算を紹介します。最新のSage*1の文法はPython3の文法に従っていますので,以下で はPython3について解説を行います*2。
PythonやSageはフリーソフトウェアですから,インターネットから無料でダウンロードして自分のパ ソコンにインストールして使うことができます。これらはWindows,Mac,Linux版がそれぞれ開発され ており,大学の環境だけでなく,自分が普段使用しているマシンにインストールして自由に使うことができ ます。
*12020年4月17日現在の最新版はSageMath ver.9.0
*2昨年度まではPython2を教えていたので,再履修の学生は注意してください。
1 PYTHONプログラムの実行手順
第 I 部
Python の基礎
このプリントはLinuxでの実行を想定して書かれています。今期はWindowsユーザーを意識して書き直し ましたが,Windowsユーザーは次のような読み替えを行ってください。
• 端末 → コマンドプロンプト,Windows PowerShell
• テキストエディタ → メモ帳*3
• ディレクトリ → フォルダ
• 記号「\(バックスラッシュ)」 → 記号「¥」
1 Python プログラムの実行手順
このプリントではPythonプログラムを実行する方法として次の2つを紹介します。
(1) Pythonのプログラムが書かれたファイルを作成して端末から実行する。
(2) インタラクティブシェルを使う。
本講義の後半で解説しますが,数式処理システムSageMathから実行することもできます。
1.1 最初のプログラム (Hello World)
(1)の手順を詳しく紹介します。プログラムの実行の流れは次の図の通りです:
T;GV6U1M"s·
e{>wn"iÔö–Ñ· c/2y¡ÿ ***.py
ƒŽÛ œé · œAl•Wÿ python ***.py
図1 Pythonプログラムの実行方法(1)
Pythonプログラムはテキストエディタで書きます。まず,デスクトップにある情報処理I のフォルダ
(dataproc1)をダブルクリックして開きます*4。すると先週作成した test.pyという名前のファイルがあ ると思うので,これをメモ帳で開きます。まずは,左上の「ファイル」をクリックし,「名前を付けて保存」
を選びましょう。ファイル名をhello.pyにして保存をします。これで,デスクトップにあるディレクトリ
dataproc1にファイルhello.pyが作られました。さて,hello.pyを次の内容に書き直してください:
•ファイル名:hello.py
1 p r i n t(’ H e l l o W o r l d ! ’)
*3もしくは好みのテキストエディタ(秀丸エディタ,Emacs,Sublime Textなど)。Wordは不可。
*4第1回目の講義でディレクトリを作成したのですが,これがない学生はデスクトップに「dataproc1」という名前のフォルダを 作ってください
1.2 日本語を含むPythonプログラム 1 PYTHONプログラムの実行手順
入力したら保存します。これで最初のプログラムは完成です。このプログラムを実行するために,dataproc1 のフォルダに戻りましょう。daraproc1 のフォルダ上の空きスペースで [Shift]+[右クリック] し,端末 (PowerShell)を起動します。端末から次をタイプすることでPythonプログラムが実行されます。
1 PS C :\ U s e r s \ * * * * * \ 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 !
上のように端末にHello Worldと表示されれば成功です。上記の表示で*****の部分はユーザー名が入り ます。
1.2 日本語を含む Python プログラム
Python2では日本語を含むPythonプログラムを書くには,文字コードを指定する必要がありましたが,
Python3からは不要になりました。次のプログラムを作成して,端末からpython hellojp.pyと実行して みましょう:
•ファイル名:hellojp.py
1 p r i n t(’こんにちは’)
このファイルの実行結果は次のようになるはずです。
1 PS C :\ U s e r s \ * * * * * \ 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 j p . py
2 こ ん に ち は
1.2.1 コメントアウト
Pythonではプログラムのコメントは『#』の後に書きます*5。コメント部分は実行時には無視されます:
1 p r i n t(’こんにちは’) # こ の 部 分 は 無 視 さ れ ま す
このファイルの実行結果は上と同じです。
1.2.2 全角スペースに要注意!!
さて,ここで最も重要な注意事項を説明します。日本語を含む文章やプログラムを書くときには
全角スペース「 ←これ」に 常に注意しなければなりません。
スペースには半角スペース「 」と全角スペース「 」があり,全角スペースは半角スペース2個分のサイズで すが,これらは全く異なるものです。例えば
1 > > > p r i n t(’あ い’) # 「 あ 」 と 「 い 」 の 間 に は 半 角 ス ペ ー ス が 存 在 す る
2 > > > p r i n t(’う え’) # 「 う 」 と 「 え 」 の 間 に は 全 角 ス ペ ー ス が 存 在 す る
3 > > > p r i n t(’お か’) # 「 お 」 と 「 か 」 の 間 に は 半 角 ス ペ ー ス が2個 存 在 す る
は見た目では半角スペース2個と全角スペースを区別することはできません。しかし,Pythonでは文字列以 外の全角スペースを用いるとたちまちエラーとなります。例えば,次では文字列bbを定義した直後に全角ス ペースを入れてしまいました。
*5コメントの書き方は文章やプログラムによって異なります。例えば,LATEXのコメントは%の後に書きます。
2
1.3 Pythonインタラクティブシェル 1 PYTHONプログラムの実行手順
1 > > > aa = 3 # a aを3に す る
2 > > > b b = 4 # b bを4に す る( b bの 後 ろ に 全 角 ス ペ ー ス が 入 っ て し ま っ た)
3 Fi l e " < strin > ’ ’ , l i n e 1
4 bb = 4
5 ^
6 S y n t a x E r r o r : i n v a l i d c h a r a c t e r in i d e n t i f i e r
上のようにエラーが出てしまいますが,見た目では何が原因でエラーになっているのかわかりづらいです。で すので,初心者はSyntaxError: invalid characterが表示されたら全角スペースの存在を疑ってくださ い。そして,全角スペースは極力使わないようにしましょう。
1.3 Python インタラクティブシェル
次にインタラクティブシェルを用いてPythonプログラムを実行する方法を紹介します。Pythonインタラ クティブシェルは,入力したプログラムを順次実行していく簡易的なシステムです。インタラクティブシェル を起動するには端末からpython [ENTER]と実行するだけです。
1 PS C :\ U s e r s \ * * * * * \ D e s k t o p \ d a t a p r o c 1 > p y t h o n
2 P y t h o n 3 . 8 . 2 ( t a g s / v3 . 8 . 2 : 7 b3ab59 , Feb 25 2020 , 2 3 : 0 3 : 1 0 ) [ MSC v . 1 9 1 6 64 bit ( A M D 6 4 )] on w i n 3 2
3 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 m o r e i n f o r m a t i o n .
4 > > >
カーソルが最後の行で点滅して入力を待っています。四則演算と冪を試してみましょう:
1 > > > 1+3 2 4 3 > > > 5 -3 4 2 5 > > > 4*3 6 12 7 > > > 9/4
8 2. 2 5
9 > > > 1 0 / 3
10 3 . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5 # 値 は 厳 密 で は な い !
11 > > > 1 2 % 5 # 割 り 算 の あ ま り
12 2
13 > > > 2 * * 1 0 # 2の1 0乗
14 10 2 4
バックスラッシュ(/)は割り算の記号ですが,上のように厳密ではない値になることがあるので注意しましょ う。またPython2では9/4)は商2を返すのでPython2を使うときには注意してください。多くのプログラ ミング言語では冪は2^10のように表しますが,Pythonでは冪は210は2**10のように表します。後半で解 説するSageのユーザーでは^は冪を意味するように変更されています。また5/3は 53 という有理数(厳密)
を表すように変更されています。
インタラクティブシェルを終了するにはexit()と入力します:
1 > > > e x i t() # も し く は ct r l + d
2 PS C :\ U s e r s \ * * * * * \ D e s k t o p \ d a t a p r o c 1 >
2 変数,予約語,文字列,数値,データの型
2 変数,予約語,文字列,数値,データの型
様々なデータを扱う上で最も基本となる事項を紹介します。
2.1 変数
変数を使った計算を,インタラクティブシェルを用いて紹介します。
1 > > > a = 6 # 変 数aに6を 代 入
2 > > > a # aの 内 容 を 表 示
3 6
4 > > > a = 8 # 変 数 aの 値 を8に 変 更
5 > > > a 6 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 < module > # エ ラ ー メ ッ セ ー ジ
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 # bに-4を 入 れ る
6 > > > a + b 7 10
定義されていない変数を使おうとすると上のようにエラーメッセージが出ます。変数名は一文字である必要は ありません。
1 > > > ame = 4 2 > > > m i k a n = 5 3 > > > ame + m i k a n 4 9
変数名はある程度自由に決めることができますが,いくつかのルールがあります。変数名はアルファベット a–z, A–Z, から始めなければならず,大文字と小文字が区別されます。先頭以外では,数字0–9,やアンダー バー『_』を使うことが出来ます。それと次に紹介する『予約語』を変数名としては使うことはできません。
2.2 予約語
次の単語はPythonの文法上,特別な意味を持つので,変数名として使ってはいけません:
4
2.3 文字列 2 変数,予約語,文字列,数値,データの型 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
2.3 文字列
ここまでに変数,文字列,数値を扱いました。数値は65,−3,9.23等と表されたもの,文字列は’Hello’の ようにコーテーションマークで囲まれたもの,変数は文字列や数値等のデータを名前を付けて管理するための ものです。それぞれについてもう少し詳しく解説します。
2.3.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 ’
ここでxは変数で,’hello world’が文字列です。2つの文字列は+でつなげることができます。
1 > > > aa = ’ A l i c e ’ # 変 数a aにA l i c eを 代 入 2 > > > bb = ’ and Bob ’
3 > > > cc = aa + bb
4 ’ A l i c e and Bob ’ # 文 字 列 a aとb bが つ な が っ て い る
5 > > > p r i n t( cc )
6 A l i c e and Bob
最後のように文字列をprintするとコーテーションマークがとれたものが表示されます。
2.3.2 文字列の中でのコーテーションと改行
文字列は『" "』か『’ ’』で囲んで定義しますが,文字列の中でコーテーションマークを使いたい場合には これらを使い分けます。
1 > > > a = " Th i s is a ’ pen ’. "
2 > > > p r i n t( a )
3 Th i s is a ’ pen ’.
改行を含む文字列は次のように『\n』を挿入して作ります:
1 > > > a = ’ aaa \ n b b b \ n c c c ’ 2 > > > a
3 ’ aaa \ nb b b \ nc c c ’
4 > > > p r i n t( a ) # p r i n tす る と\ nの 部 分 は 改 行 さ れ る 。
5 aaa 6 bbb 7 ccc
『\n』を使わずに改行をするには,""" """または’’’ ’’’で囲みます。
1 > > > a = ’ ’ ’ aaa
2 ... bbb
3 ... ccc ’ ’ ’
2.4 データの型 2 変数,予約語,文字列,数値,データの型
4 > > > a
5 ’ aaa \ nb b b \ nc c c ’ 6 > > > p r i n t( a ) 7 aaa
8 bbb 9 ccc
また『\』を使って,改行文字や記号『\』,『"』,『’』などを表すことが出来ます。代表的な例を紹介してお きます:
\改行 ⇝ 改行を無視する
\\ ⇝ \
\" ⇝ "
\’ ⇝ ’
\n ⇝ 行送り
例えば
1 > > > aa = ’コーテーションマークとは\"な ど の こ と’
2 > > > p r i n t( aa )
3 コ ー テ ー シ ョ ン マ ー ク と は"などのこと
2.4 データの型
文字列はstr型(string)と呼ばれます。
1 > > > ty p e(’ h e l l o ’) # ty p e ( ’ h e l l o ’)の 型 を 調 べ る 2 <ty p e ’ str ’> # s t r型 で あ る
数値の型でよく使うものに整数型(int)と浮動小数点数(float)があります。
1 > > > ty p e( 1 2 3 ) # 123の 型 は ? 2 <ty p e ’ int ’> # 整 数 型
3 > > > ty p e( 3 . 1 4 ) # 3. 1 4の 型 は ? 4 <ty 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 <ty p e ’ f l o a t ’> # 変 数 aの 表 す デ ー タ( 3 . 1 4 )はf l o a t型
上ではintは整数型(integer),floatは浮動小数点数(floating point number)を意味しています。整数 型の演算は厳密に行われますが,浮動小数点数の計算では誤差が生じます。どちらも数であることは同じので
すが,Pythonの内部での処理の仕方が異なるために,異なるデータの型として認識されるわけです。では,
int型とfloat型の和は何になるでしょうか?
1 > > > aa = 10 # i n t型
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 <ty p e ’ f l o a t ’> # f l o a t型
6
2.5 数値と文字列の変換 2 変数,予約語,文字列,数値,データの型
答えはfloat型でした。扱う数値がすべて整数の場合に(除法を行わなければ)常に厳密な値で計算できます
が,floatが一つでも混ざる場合は,厳密性が失われてしまうので注意が必要です。このように,数値計算を
するときには,自分が扱う数値がどの型なのかを常に気にする必要があります。
2.5 数値と文字列の変換
さて文字列と数値は足せるでしょうか?
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 < module > # エ ラ ー メ ッ セ ー ジ
4 T y p e E r r o r : can o n l y c o n c a t e n a t e ’ str ’(not " int ") to str # エ ラ ー メ ッ セ ー ジ このようにstr型とint型を足すことはできません。文字列と数値をくっつけるには,数値を文字列に変換 する必要があります。
文字列,整数,小数の変換
str():数値を文字列に変換する(例:str(123)=’123’)
int():文字列の数字を,整数に変換する(例:int(’123’)=123))
float():文字列の数字を,浮動小数点数に変換する(例:float(’123.45’)=123.45)
次のプログラムはうまくいくはずです:
1 > > > aaa = str( 1 9 9 9 ) # 数 値1 9 9 9を 文 字 列 に し た も の をa a aに 入 れ る
2 > > > aaa 3 ’ 19 9 9 ’
4 > > > ty p e( aaa )
5 <c l a s s ’ str ’> # a a aの 型 は 確 か にs t r i n gで あ る
6 > > > ’ A l i c e ’ + aaa # 文 字 列’ A l i c e ’とa a aを つ な げ る
7 ’ A l i c e 1 9 9 9 ’
逆に,「文字列になっている数字の列」から整数や小数点数に変換してみましょう:
1 > > > aa = ’ 123 ’ # ’123 ’は 文 字 列
2 > > > int( aa ) # a aを 整 数 に し て 返 す
3 123
4 > > > f l o a t( aa ) # a aを 浮 動 小 数 点 数 に し て 返 す
5 1 2 3 . 0
2.6 演算子と計算の順序
Pythonでは,数値計算は次の演算子(operator)で行います:
記号 意味 例
+ 和(Addition) 10+20は30を与える
- 差(Subtraction) 20-10は10を与える
* 積(Multiplication) 4*5は20を与える / 除法(Division) 10/5はfloat型の数2.0を返す。
% 余り(Modulus) 8%5は余り3を与える
** 冪(Power) 2**3は23= 8を与える
3 プリント(PRINT)
括弧で囲んだ部分は,例外なく最優先で計算されます。演算の優先順序は次のようになっています:
例えば,5*6/2**2は,内部では次のような順で計算されているわけです:
1 5 * 6 / 2 * * 2 = 5 * 6 / ( 2 * * 2 ) # 冪 が 最 初 に 計 算 さ れ る
2 = 5 * 6 / 4
3 = ( 5 * 6 ) / 4 # 左 か ら 計 算 さ れ る
4 = 3 0 / 4
5 = 7.5
ただし,上の順序が適用されない例外がただ一つだけあります。それは冪の計算です。たとえば:
1 > > > 3 * * 3 * * 3 2 7 6 2 5 5 9 7 4 8 4 9 8 7 3 > > > ( 3 * * 3 ) * * 3 4 1 9 6 8 3
5 > > > 3 * * ( 3 * * 3 ) # 3 * * 3 * * 3は こ ち ら に 等 し い 6 7 6 2 5 5 9 7 4 8 4 9 8 7
この例では,冪は右から順に計算されています。
プログラムには自分で気づかないうちにエラーが混入してしまうものです。単純なミスを防ぐためにも,積 や除法を含む計算では,括弧で囲んで順番を明確にするのがよいでしょう。
3 プリント (print)
インタラクティブシェルでは「返されたもの」が順次画面に表示されますが,ファイルからPythonを実 行する場合はprintしない限り,画面には何も表示されません。次のファイルを作り端末から実行してみま しょう。
•ファイル名:print01.py
1 a = 6
2 p r i n t( a )
3 b = 4
4 a + b
5 p r i n t( a + b )
実行結果の例 6
10
結果を見ればわかるように,3行目,4行目については何も出力がなく,2行目, 5行目でprintされた数字だ けが出力されています。またprint文が複数回あるときは,改行されて表示されます。print文の後に改行 をさせたくない場合は『, end=" "』を書きます:
•ファイル名:print02.py
1 a =6 2 b =4
3 p r i n t( a , end =" ") # 改 行 さ れ な い で 一 つ ス ペ ー ス が 入 る 4 p r i n t( b )
8
4 練習問題 実行結果の例 6 4
4 練習問題
4.1 問題: e
π− 20 の計算
今日の課題も簡単です。
pp= 3.141592,ee= 2.718281とする。eepp−20を計算して表示(print)するPythonのプログラムを作 成せよ。ファイル名はproblem01.pyとし,端末(PowerShell)から
1 PS C :\ U s e r s \ * * * * * \ D e s k t o p \ d a t a p r o c 1 > p y t h o n p r o b l e m 0 1 . py
のように実行したときに,その数値を表示するようなプログラムでなければならない。
ちなみに,eπ−20は円周率に非常に近い値をとるが,これには何か理由があるのか,それとも偶然なのか わかっていない。