mypython2.txtについて このテキストドキュメントには、python2のプログラムスクリプトをテキスト形式で載せて、webからアクセスしようという試みです。 日常のちょっとしたプログラムや物理の計算問題などのプログラムを中心に、料理の簡単レシピのように並べてみようかなと思っています。 ■行がプログラム名と簡単な説明その下の行がプログラム、日本語の文字系は基本はutf-8です、プログラム部分コピーしてpythonのエディターに貼り付けてもらえばpython2で実行できるものと思っています。しかし完全なバグ取りはできていません。説明文が含まれています。インデントが必要な場合があるかも知れません。ご使用の際はお気を付け下さい。ここでの簡単なプログラムはpython3に移行する場合主にprint文を( )付きにして下さい。後使用ライブラリーの違いがあります。 少しずつ内容を付け加えていきます。「デジタルな一日」ブログなどで紹介したものが多くあります。(2023.11.4 兼子) ■歌詞を青色背景に白文字を拡大表示ための工夫。 歌詞ファイルは kasi.txtとして、一応タグジャンプも付けておく。 ・1・サウンド・オブ・サイレンス(サイモンとガーファンクル) ・2・ぼけない小唄 、、、、以下略
歌詞本文 ・「サウンド・オブ・サイレンス」(サイモンとガーファンクル) 夜がふたたび  おとずれたときに 静かにおしよせる  悲しみと苦しみ 、、、、、
---略 これを コマンドラインで下のkasihtml.pyで
のタグ付けをします 文字系に気をつけます。ここでは上の歌詞テキストも下のpythonスクリプトもshif_jisで 統一してあります。 コマンドラインでは、ここでは文法上python2で処理しています >python2 kasihtml.py kasi.txt >kasi.html # kasihtml.py # -*- coding: shift_jis -* import os, sys print """ 歌詞表示 """ filename = sys.argv[1] f = open(filename) while True: fileText = f.readline() if not fileText: break print "
",fileText, f.close print """
""" ■syouhi.pyはdefファイル、消費税の計算 # -*- coding: UTF-8 -* import math #消費税込10% def price(x) : return x*1.1 #消費税込8% def prices(x) : return x*1.08 #消費税のみ10% def zei(x) : return x*0.1 #消費税のみ8% def zei8(x) : return x*0.08 (終わりここまで) pythonのインタープリターでimportで上の関数syouhi.pyを読み込む >>> import syouhi as sy importするときは.pyはつけない、そしてこの先はsy.という印で関数を使う。ここが注意。 ここから、前回でやった計算と同じ、10700円は10%、2600円分は8%の消費税 >>> sy.price(10000)+sy.price(300+400)+sy.prices(2000)+sy.prices(200+400) 14578.0 >>> sy.zei(10000)+sy.zei(300+400)+sy.zei8(2000)+sy.zei8(200+400) 1278.0 確かめ算 >>> 10700*1.1+2600*1.08 14578.000000000002 ■pythonでインタープリターを使って計算する。ごく初歩入門なので、飛ばしてお読み下さい。 pythonではmath.sqrt(2)だが使うにはimport mathとする必要がある。 pythonでは>>>がプロンプト >>> print "Hello World !" Hello World ! となり、pyhton3では( )が必要 >>> print ("Hello World !") Hello World ! 関数の定義は >>> def v(x): return x/3.6 ... となり、四捨五入のround関数も使える、python2では >>> v(60) 16.666666666666668 >>> print v(60),"m/s" 16.6666666667 m/s >>> print round(v(60),1),"m/s" 16.7 m/s ■url.y webページから文章の取得プログラム #!/usr/bin/env python # -*- coding: utf-8* import urllib2 #ここにurlを直接記述する url = 'http://www.ne.jp/asahi/yoshikn02/namo/takatenjin/yougo.html' fp = urllib2.urlopen(url) html = fp.read() print html fp.close() ■test2.py  コマンドラインから数値を読み込んで計算する # -*- coding: utf-8 -* import math import os,sys print "コマンドラインから数値を読み込んで計算します" print "a=",sys.argv[1],"b=",sys.argv[2],"c=",sys.argv[3] a=float(sys.argv[1]) b=float(sys.argv[2]) c=float(sys.argv[3]) def tasu(a,b,c): return a+b+c def jijyouwa(a,b,c): return a*a+b*b+c*c def waru(a,b): return a/b print tasu(a,b,c) print jijyouwa(a,b,c) print waru(a,b) 必要な計算はdefファイルで定義しましたが、この程度の 単純計算なら、定義ファイルはいらないでしょう。 でも、複雑で決まった計算をするならば、作っておくと 便利でしょう。しかも、定数表も読み込めば、いちいち 書く手間はいらないことになりますね。 コマンドラインでは python test2.py 1 2 3 として計算結果を示します。 計算結果---------------- コマンドラインから数値を読み込んで計算します a= 1 b= 2 c= 3 6.0 14.0 0.5 ■test.pyとconst.py 定義ファイルを読み込んで使う # -*- coding: utf-8 -* import math import const print """ 最初は、40000Vを加えたときの、X線の最短波長の計算です。 2つ目は19.6m/sで投げ上げた物体が4.9m/sになるときの 高さを表しています。 3番目は、リュードベリ定数の表示、4番目は物理学習定数表 の文字列を表示するための練習です。 定数表は、const.pyと言う名前で作成されています。importで 読み込みます。大きな数字も小さな数字も指数を使うと見やすくなります。 例えば、6.67e-11は6.67×10(-11乗)という数字です。 """ print '%e' %(const.h*const.c/const.el/4.0e4),"m" print round(((4.9**2-19.6**2)/2/const.g),2),"m" print '%e' %const.Ry,"リュードベリ定数の表示" print const.str const.pyの中身---------- # -*- coding: utf-8 -* str="これは学習物理定数表です。学習のため有効数字は3桁にしました。" g=9.81 G=6.67e-11 Na=6.02e23 R=8.31 k=1.38e-23 c=3.00e8 h=6.63e-34 el=1.60e-19 k0=9.0e9 myu=1.26e-6 ipu=8.85e-12 u=1.66e-27 Ry=1.10e7 実行結果(python test.pyで実行)---------------- 最初は、40000Vを加えたときの、X線の最短波長の計算です。 2つ目は19.6m/sで投げ上げた物体が4.9m/sになるときの 高さを表しています。 3番目は、リュードベリ定数の表示、4番目は物理学習定数表 の文字列を表示するための練習です。 定数表は、const.pyと言う名前で作成されています。importで 読み込みます。大きな数字も小さな数字も指数を使うと見やすくなります。 例えば、6.67e-11は6.67×10(-11乗)という数字です。 3.107813e-11 m -18.36 m 1.100000e+07 リュードベリ定数の表示 これは学習物理定数表です。学習のため有効数字は3桁にしました。 ■mense.py 面積と体積の計算 目的は、四角形の面積の計算、例えば土地の形が悪く辺の長さと はさむ角度が測定できたときに、この様な計算をすれば、何とか 三角形で近似して計算できようというもの。 例では8,6の長方形だから、角度が90度になるので当然面積は48 と求まる。 もう一つのdefは、人間の体の体積を丸太ん棒の体積で置き換えようというもの cは胸囲を1.7で割って丸太の半径とした、そしてdは慎重(cm)である。 1.1は人間の体の平均の密度(g/cm3)としてみた。 結論的には、自分の体は約63リットルとなった。 こんなものなのだろうか?? (風呂の水かさの上昇で測ってみれば7cmはありそうだ。) # -*- coding: UTF-8 -* import math print """ 面積を計算します。a,bは辺の長さ、xは角度です。 """ def s(a,b,x): return a*b*0.5*math.sin(math.pi*x/180) def v(c,d): return (c/2/math.pi)*(c/2/math.pi)*2*math.pi*d print s(8,6,90)+s(8,6,90) print v(50,160) print 70000/1.1 面積を計算します。a,bは辺の長さ、xは角度です。 48.0 63661.9772368 63636.3636364 ■script.py pythonでscript作成ツール中でエディターをしています。vim、emacs、gedit # Import the modules needed to run the script. from os.path import exists from time import strftime import os title = raw_input("Enter a title for your script: ") # Add .py to the end of the script. title = title + '.py' # Convert all letters to lower case. title = title.lower() # Remove spaces from the title. title = title.replace(' ', '_') # Check to see if the file exists to not overwrite it. if exists(title): print "\nA script with this name already exists." exit(1) descrpt = raw_input("Enter a description: ") name = raw_input("Enter your name: ") ver = raw_input("Enter the version number: ") div = '=======================================' # Create a file that can be written to. filename = open(title, 'w') # Set the date automatically. date = strftime("%Y%m%d") # Write the data to the file. filename.write('#!/usr/bin/python') filename.write('# -*- coding: utf-8 -*\n') filename.write('\n#title\t\t\t:' + title) filename.write('\n#description\t:' + descrpt) filename.write('\n#author\t\t\t:' + name) filename.write('\n#date\t\t\t:' + date) filename.write('\n#version\t\t:' + ver) filename.write('\n#usage\t\t\t:' + 'python ' + title) # filename.write('\n#notes\t\t\t:') filename.write('\n#python_version\t:2.5.2') filename.write('\n#' + div * 2 + '\n') filename.write('\n') # Close the file after writing to it. filename.close() # Clear the screen. This line of code will not work on Windows. os.system("clear") def select_editor(): '''Open the file with either the Vim or Emacs editor or gedit.''' editor = raw_input("Select an number:\n\n1 for Vim.\n2 for Emacs.\n3 for gedit\n") if editor == "1" or editor == "2" or editor == "3": if editor == "1": os.system("vim +12 " + title) exit() elif editor == "2": os.system("emacs +12 " + title) exit() elif editor == "3": os.system("gedit +12 " + title) exit() else: os.system("clear") print "\nI do not understand your answer.\n" print "Press to quit.\n" return select_editor() select_editor() ■mail.py pythonでメールを送信 一番簡単なのは、次のようにすればよかった。 件名なしで送られる。 import smtplib server = smtplib.SMTP('smtp-server名') server.sendmail('fromadd@***.ne.jp', 'toadd@***mail.ne.com','test msg test test') server.quit() このプログラムを走らせれば良い。ただしこのままでは日本語のメッセージは送れない ■gousei.py うなりの表示、sin関数の合成、ここでは50と46でうなりを4個作っています。 import pylab t=pylab.arange(1000.)/1000 y1=0.5*pylab.sin(2*pylab.pi*50*t) y2=0.5*pylab.sin(2*pylab.pi*46*t) y=y1+y2 pylab.plot(t,y1) pylab.plot(t,y2) pylab.plot(t,y) pylab.title('Sin Plot') pylab.xlabel('Time[s]') pylab.ylabel('Amplitude') pylab.savefig('sincurve2') <円表示>中心円だけ濃くするために余分に円を描かせています。 import pylab t=pylab.arange(1000.)/1000 x=100*pylab.sin(2*pylab.pi*2*t) y=100*pylab.cos(2*pylab.pi*2*t) pylab.plot(x,y) pylab.plot(x+20,y+20) pylab.plot(x-20,y-20) pylab.plot(x+20,y-20) pylab.plot(x-20,y+20) pylab.plot(1.01*x,1.01*y) pylab.plot(0.99*x,0.99*y) pylab.title('en Plot') pylab.xlabel('x') pylab.ylabel('y') pylab.savefig('en1') ■sine.py 関数のグラフ python sine.pyでsincurve.pngを描き出して、保存する。ごく短い スクリプト。これなら。非常に楽に正弦波を書くことができよう。 import pylab # import math,numpy,matplotlib,scipy この行は必要ない t=pylab.arange(1000.)/1000 pylab.plot(t,pylab.sin(2*pylab.pi*10*t)) pylab.plot(t,pylab.sin(2*pylab.pi*5*t)) pylab.plot(t,0.5*pylab.sin(2*pylab.pi*2*t)) pylab.plot(t,pylab.sin(2*pylab.pi*t)) pylab.title('Sin Plot') pylab.xlabel('Time[s]') pylab.ylabel('Amplitude') pylab.savefig('sincurve') ■plot.py 画像を描いてセイブする python plot.py(以下のファイルの名前)とすれば、できる。 # Creating the grid of coordinates x,y x,y = ogrid[-1.:1.:.01, -1.:1.:.01] z = 3*y*(3*x**2-y**2)/4 + .5*cos(6*pi * sqrt(x**2 +y**2) + arctan2(x,y)) hold(True) # Creating image imshow(z, origin='lower', extent=[-1,1,-1,1]) # Plotting contour lines contour(z, origin='lower', extent=[-1,1,-1,1]) xlabel('x') ylabel('y') title('A spiral !') # Adding a line plot slicing the z matrix just for fun. plot(x[:], z[50, :]) savefig('spiral') ■seigen,py 正弦波を描く ubuntuでは、 sudo apt-get install python-numpy python-scipy とするだけで良い。 さて、もう少し進んで、グラフを書くことにした。 その場合、pylabのインストールが必要になる。これは、 (IC日記さんからの引用) sudo apt-get install python-matplotlib python-scipy ipython python-matplotlib-doc python-numpy-doc python-tk これで、ubuntu10.04も08.04も問題なくインストールされる。 ipython -pylab でipythonを起動して、次の2行を書くと t=arange(1000.)/1000 plot(t,sin(2*pi*10*t)) これで正弦波10個が描かれる。上の10を2とすれは2個 描く。 最初plotの代わりにprintとしたので、sinの値が端末に はきだされた。 さて同じことを(IC日記さんから引用) import math,numpy,matplotlib,scipy t=linspace(0,1,1024); y=sin(2*pi*10*t); plot(t,y) title 'Sin Plot' xlabel 'Time[s]' ylabel 'Amplitude' ■sankaku.py 三角測量 # -*- coding: utf-8 -* # import math def kyori(x): return 16/x print """ 簡単な距離の目算、これは、腕と指を使う。 腕の長さ70cm、人差し指7cm、腕を一杯に伸ばして7cmあるものは、 視角でおよそ5.7°、でも三角の比の方がいいので、0.1を使う。この角度 で人の大きさを160cmとすると、この視角になるのは16m先である。後は 目算で、人が指の半分になれば、32m先ということになる。そこでこんな計算。 def kyori(x): return 16/x xは指に対する人の大きさ半分だったら0.5を入れる、つまり2倍 """ print "簡易三角測量計算例、指の0.3倍のとき、建物は1.5倍のとき" print "人が立っているところまでの距離=",kyori(0.3),"m" print "その位置での建物の大きさ=",kyori(0.3)*0.1*1.5,"m" print "終わり" 計算処理結果。 簡易三角測量計算例、指の0.3倍のとき、建物は1.5倍のとき 人が立っているところまでの距離= 53.3333333333 m その位置での建物の大きさ= 8.0 m 終わり ■kansan.py 単位換算 下はdefファイル # -*- coding: UTF-8 -* def inch(x): return x*2.54 def mile(x): return x*1.61 def tubo(x): return x*3.31 def tan(x):return x*991 ここから、本体 # -*- coding: utf-8 -* # import math import ptanidef print """ # 単位換算のためのdefファイル # 1inch=2.54cm,1yard=0.914m,1feet=0.305m,1mile=1.61km # 1坪=3.31m2,1反=300坪=991m2 """ print "単位換算例" print "32inch=",ptanidef.inch(32) print "10.1inch=",ptanidef.inch(10.1) print "42inch=",ptanidef.inch(42) print "80坪=",ptanidef.tubo(80) print "32坪=",ptanidef.tubo(32) print "終わり" 出力させた結果 単位換算例 32inch= 81.28 10.1inch= 25.654 42inch= 106.68 80坪= 264.8 32坪= 105.92 終わり ■htmlka.py テキストにhtml用のタグを付ける 下のサンプルは python htmlka.py sample.txt コンソールから読み込み # -*- coding: utf-8 -* import os, sys print """ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <HTML><head> <TITLE>ここにタイトルを入れる</TITLE> <LINK HREF="rubtek.css" TYPE="text/css" REL="stylesheet"> </head> <BODY BGCOLOR="#ffffff"> """ filename = sys.argv[1] # f = open("sample.txt","r") f = open(filename,"r") while True: fileText = f.readline() if not fileText: break print "<br>",fileText, f.close print """ <br></BODY> </HTML> """ ■eisei.py 静止衛星の軌道の計算 -*- coding: shift_jis -* import math print """ python 練習 静止衛星はとにかくある高さの所を一日一回転するので地球上からは静止しているように 見える人工衛星のことである。周期をT、地球の半径をRとする。静止衛星の地上からの 高さhは、重力加速度を用いると次のように求めることができる。 m(R+h)ω^2=GMm/(R;+h)^2 より h=(g*R^2*T^2/(4*π^2))^1/3ーR となる。さてここでR=6370km、g=9.8、π=3.14、T=24*3600sを 代入してみる。 """ a=math.log(6370000)*2 b=math.log(24*3600)*2 c=math.log(4*3.14*3.14) print "h=",round((math.exp((math.log(9.8)+a+b-c)/3)-6370000)/10000000,3),"万kmの高さである。" この結果は次のようになる。 h= 3.585 万kmの高さである。 ■saiki.py 再帰プログラム import Image import ImageDraw SIZE=256 image = Image.new("L", (SIZE, SIZE)) d = ImageDraw.Draw(image) c = 0.4 + 0.24j for x in range(SIZE): for y in range(SIZE): re=(x*2.0/SIZE)-1.0 im=(y*2.0/SIZE)-1.0 z=re+im*1j for i in range(256): if abs(z) > 2.0: break z = z * z + c d.point((x,y),i*2) image.save(r"julia2.png", "PNG") ■これはプログラムscriptでは有りません。単なるインタプリタでの計算例です 足し算、割算、かけ算はこのようにする。rubyと同じ >>> 23 +34 57 >>> 23/2.0 11.5 >>> 23*2 46 >>> mathのライブラリーを使う。 >>> import math >>> math.sin(math.pi/6.0) 0.49999999999999994 print文の日本語 >>> print "まつ" まつ >>> 10を底としたlog200 >>> math.log(200,10) 2.3010299956639808 eを底としたlog200は下のように書くとエラー >>> math.log(200,e) Traceback (most recent call last): エラー文 File "", line 1, in ? NameError: name 'e' is not defined math.eとする。 >>> math.log(200,math.e) 5.2983173665480363 逆算はmath.expで行う >>> math.exp(5.298) 199.93653676147983 >>> このようなことなる。平方根は rubyではMath.sqrt(3) とするがここでは >>> math.sqrt(3) 1.7320508075688772 >>> ちょっとだけ使かって見た。 もちろんファイルからスクリプトを読み込んで 処理できるのは、perl、rubyと同じである。 >>> a=3.0+4.0j >>> a.real 3.0 >>> a.imag 4.0 絶対値の表示 >>> abs(a) 5.0 >>> b=3.0-4.0j 複素数の計算 >>> a+b (6+0j) >>> a-b 8j >>> a*b (25+0j) >>> a/b (-0.28000000000000003+0.95999999999999996j) >>> b/a (-0.28000000000000003-0.95999999999999996j) 関数定義を使う(フィボナッチ級数を定義してみると 隣合う2項を足し算して数列とする?これでいいのかな?) >>> def fib(n) File "", line 1 def fib(n) ^ SyntaxError: invalid syntax :がないためエラー正しくは次のように書く...のあと インデントがないとエラーになる(注意) >>> def fib(n): ... a, b = 0, 1 ... while b < n: ... print b, ... a, b = b, a+b ... 100までの数列を出す >>> fib (100) 1 1 2 3 5 8 13 21 34 55 89 >>> fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 関数を別名でfとおく >>> f = fib >>> f(100) 1 1 2 3 5 8 13 21 34 55 89 >>>