第14回目 課題実装例

ページ名:第14回目 課題実装例

このページの変更記録

  • 09/19 執筆中

第14回目の課題はありません。


今後の Python 利用


 Pyrhon プログラムの料理でいうと自炊レベルとは,必要に応じて,自分専用の関数を作れることといっていいでしょう。さらに,応用編で扱ったクラスが作れるとは,料理でいうと,味噌や漬物などの保存食品を自分で作れるレベルといえます。今回の授業では,そこまで学習しました。


 今後は,料理でいうレシペを,ウェブ・書籍等で検索して,利用していけばやっていけます。


 第14回では,今までの課題の解答例をしめしながら,復習し,さらに,触れていない,Python の重要項目を列強します。


初期化プログラムの役割

 この連載では,Jupyter Notebook というアプリの中で,Python プログラムを作成し,動かしてきましました。
ほとんどのプログラムは,事前に,その回で指定あった初期化プログラムを動作さえてました。その役割を解説します。
第11回目の初期化プログラムは,以下のようでした。


#初期化プログラム。動作確認を含めて,プログラム作成のとき1度実行しておく
from math import * # math モジュールを利用する
from matplotlib.pyplot import * #グラフ関係を利用する
%matplotlib inline
from numpy import * #ベクトル演算,行列演算を効率化
from scipy.stats import norm #正規分布の計算
from pandas import DataFrame, read_csv #表形式を扱う
import py3Dmol #分子モデル表示
pi # πの値が表示されたら,正常動作している

ここで,扱ってきた,初期化プログラムの役割は,次の3つです。

  • 1) 組み込みオブジェクト以外のものを,import する
  • 2) 関数などを短い名称で扱えるようにする
  • 3) グラフを表示できるようにする (%matplotlib inline です)

です。
 グラフを表示できるようにする命令は,JupyterNotebook 特有の命令で,グラフをプログラムを実行したところの真下に表示させるという命令です。
 1), 2) は,Python プログラムであれば,どこでも使用する命令です。それを解説します。
sin, pi など,import しないと使用できません。



課題実装例

それぞれのプログラムは,以下の初期化プログラムが実施してあるものとします。


#初期化プログラム。動作確認を含めて,プログラム作成のとき1度実行しておく
from math import * # math モジュールを利用する
from matplotlib.pyplot import * #グラフ関係を利用する
%matplotlib inline
from numpy import * #ベクトル演算,行列演算を効率化
from scipy.stats import norm #正規分布の計算
from pandas import DataFrame, read_csv #表形式を扱う
import py3Dmol #分子モデル表示
from ipywidgets import *
from IPython.display import clear_output
pi # πの値が表示されたら,正常動作している


プログラムソースは,こちらの表示システムとの関係で,( と ( を ( ( と開けてあるが,(( とすればよい。
また,行が無駄に空いているが,本来は,空けても1行分である。


第1回課題

 ここで,関数電卓として,Python を利用できることを目指しました。料理でいうと,カップヌードルを作るレベルである。しかし,このレベルでも複雑な計算では,Python プログラムの恩恵を受けることができます。


課題その1「半径 r = 3 が与えられたとき,円の面積を計算するプログラムを作成せよ」


r = 3
#半径*半径*円周率
r * r * pi


課題その2 2次方程式の公式の実装

a = 1
b = 2
c = -1
のとき
a*x**2 + b*x + c = 0
の解を求めるプログラムを作成せよ。解の公式を利用すること。


a = 1
b = 2
c = -1
(-b - (b**2 - 4*a*c)**(1/2))/2*a, (-b + (b**2 - 4*a*c)**(1/2))/2*a

課題その3 化学で使う例


20gの水酸化ナトリウムNaOHを水に溶かして2Lとした時の水酸化ナトリウム水溶液のモル濃度を計算せよ。
ただし、原子量は以下とする。
Na=23、O=16、H=1
(省略)


第2回課題

課題 散布図と回帰直線を描く

提出されたもは,散布図を2回描くなど無駄が多かった。
データを変更し,変数名をそれらしいものし,途中の確認のための表示をカットすればよかった。



#体重と身長のデータ
W = array( (62, 68, 58, 68, 52, 65, 70) )
H = array( (183, 178, 173, 178, 168, 181, 180) )
a, b = polyfit(W, H, 1) #回帰直線 y = ax + b の a, b を求める
vH = a * W + b #回帰直線作図のための値を生成
scatter(W, H, color='blue')
plot(W, vH, color='red') #回帰直線は折れ線の機能で描く


print('回帰直線 y = ', a, 'x +', b) # y = ax + b を表示


第3回課題

課題 タプル型変数と numpy.array 型変数の比較

適当な数字を4つ,タプル型変数に代入し,それを * 3 をしてみる
また,その4つの数字を numpy.array変数に代入し,* 3 をしてみる


A = 3, 20, 4, 7
B = array(A)
A * 3, B * 3


第4回課題

課題 ヒストグラムと正規分布曲線の表示

 ヒストグラムに向いた適当な数字(20個以上)を用意し,ヒストグラムと強制的な生成した正規分布曲線を重ねて表示してください。
 今回,変数名の H は,必ず変更すること。重ねるときの比率は,例の0.06から変更すること。値のヒントは,ヒストグラムを単体で表示したときの値です。
データの数字を変更し,データ全体を示す変数名を変更(H→A),さらに,比率は,一番高いところどうしを合わせる,それぞれ,max( ) でいいのではということで,max( ) を試すと,できます。3, 4 の山を合わせるには,4 の方を,4 で割って,3 倍する原理。max(HD[0])をmax(Y)で割ればよいと予想。
データは,総務省統計研修所編集「世界の統計2012」アジア各国の平均寿命から


A = array((

       83, 48, 78, 65, 82, 
       66, 73, 65, 68, 69,
       74, 64, 80, 61, 70, 
       78, 72, 74, 82, 70
   ))

X = arange(mean(A)-3*std(A), mean(A)+3*std(A), 0.1)
#確率密度関数(X,平均、標準偏差)
Y = norm.pdf(X, mean(A), std(A))
HD = hist(A, color='blue')
r = max(HD[0])/max(Y) #ヒストグラムと曲線のトップをあわせる比率 (それぞれ変更すること)
plot(X, Y*r, color='red') #折れ線を使って表示


第5回課題

課題 for を使う

例を参考に,1 から n までの奇数のみを合計するプログラムを作成しななさい。「データ用意」は,n = 11 としてください。


#データ用意
n = 11


# 1 から n の奇数を合計する
s = 0
for i in range(1, n + 1, 2):


  #改行せずに,後ろに', '付きで,表示していく
  print(i, end = ', ') 
  s = s + i

#確認
print(s)


第6回課題

課題その1

1 から 20 まで数字を,5 の倍数か,7の倍数かを判断するプログラムを作成しなさい。


for i in range(1, 20+1, 1):


  if i % 5 == 0: # 演算子 % は,剰余を返す
      print(i ,' は 5 の倍数')
      continue # ループ内の以下のブロック内命令を飛ばす。

  if i % 7 == 0:
      print(i ,' は 7 の倍数')
  else:
      print(i ,' は 5 の倍数でもないし,7 の倍数でもない')


課題その2

1 から 20 まで数字を,素数か否かを判断するプログラムを作成しなさい。


print(1, ' は 素数でない')
print(2 ,' は 素数')


for i in range(3, 20+1):


  if i % 2 == 0:
      print(i ,' は 素数でない')
      continue

  if i % 3 == 0: 
      print(i ,' は 素数でない')
      continue

  print(i ,' は 素数')


第7回課題

課題その1

例に従って,台形の面積を求める関数を作れ


#台形の面積を求める
def daikei_menseki(up, base, hight):

   ans = 1/2 * (up + base) * hight
   return ans

#テスト
jyohen = 3
kahen = 7
takasa = 5
daikei_menseki(jyohen, kahen,takasa)


課題その2

化学関連の式から関数を作れ
(省略)


第8回課題

課題

 第2回目 回帰直線の自分の課題のデータを書き出し,それを,読み込み,同じデータとなることを確認せよ。
書き出しファイル名(CSVファイル名)は,sample.csv,とし,あとの変数名等は適時変更すること。


 サンプルから,H, W,データ,height, weight をデータに合わせて変更すればよい。以下は,サンプルを少し変形している。


# 統計データ用意,身長(H),体重(W),5人分
H = (183, 178, 173, 178, 168)
W = (62, 68, 58, 65, 52)


#表(table)の形式で扱う
D = DataFrame([H, W]) #表形式でデータをまとめる


#下に伸ばすため,表を90度回転する。
Ta = D.T


#列に,height, weight と名前をつける
Ta.columns = ['height', 'weight']


# ファイルに保管する(CSV 形式)
Ta.to_csv('sample.csv')


#テスト
#別の名前で,これを読み込みます。
TaR = read_csv('sample.csv')
Hr = tuple(TaR['height'])
Wr = tuple(TaR['weight'])
Hr, Wr #確認用表示(課題報告時は残す)


第9回課題

課題なし


第10回課題

Azura Jyupter などを使うときは,使用前に,通常の初期化プログラムの前に,標準モジュール以外を再インストール必要がある。自分のパソコンの場合は,一度インストールすれば再インストールは必要なし
分子モデルを表示するためには,以下のように外部モジュールをインストールする


!pip install py3Dmol

課題なし


第11回課題

Azura Jyupter など外部のサービスを利用のときは,以下を再インストール必要がある場合があります。


!pip install py3Dmol

また,分子モデルなどが,プログラムが正常でも,スペースのみが表示されない場合があります。ブラウザにゴミが残っているせいです。
Chromeブラウザであれば
http://atomurl.net/cleaner/
で,「passwords」以外をクリックして,「Clean Now」をしてください。ブラウザがもっているゴミを削除してくれます。(動作も高速になります)
再起動したら,プログラムが正常であれば表示されます。


課題その1

 以下の4行を参考にして,my3Dmol(num)関数を作成しなさい。num は,整数型変数です。関数の中では show()はかかないこと。


num = 611 #グルタミン酸
E = py3Dmol.view(query='cid:'+str(num), width=300, height=200)
E.setStyle({'stick': {}})
E.show()

正しくできたら,次の2行で,グリシンの分子が表示されます。

G = my3Dmol(750)
G.show( )

実装例

def my3Dmol(num):

 E = py3Dmol.view(query='cid:'+str(num), width=300, height=200)
 E.setStyle({'stick': {}})
 return E

#テスト
G = my3Dmol(750)
G.show( )


課題その2

 myAA3Dmol(ch)関数を作成しなさい。ch は,文字列型変数です。関数の中では show()は書かないこと。
正しく作成できたら,以下の2行で,グルタミン酸の分子が表示されます。


E = myAA3Dmol('E')
E.show()

実装例

def myAA3Dmol(ch):

   from py3Dmol import view
   cid_ch = str(A_A[ch][2]) #文字にしたがって,2つ目の情報を文字として取り出す。
   E = py3Dmol.view(query='cid:'+cid_ch, width=300, height=200)
   E.setStyle({'stick': {}})
   return E

E = myAA3Dmol('E')
E.show()


第12回課題

課題その1

 While ループで,1から30まで,3の倍数のみ合計し,表示する。
実装例


s = 0
i = 1
while i < (30 + 1):

   if i % 3 ==0:
       s = s + i
   i = i + 1

print(s)


課題その2

 適当な関数と interact を組みあせてみる。
実装例


def sum_loop(n):

   s = 0
   for i in range(n+1):
       s = s + i
   return s

interact(sum_loop, n=10)


第13回課題

課題その1

 a.getWater() で,食塩水に含まれる水の重さを求めるようにしなさい。getWater( ) をSaline クラス内で定義します。
実装例



class Saline:


 def __init__(self, p, g):
   self.p = p
   self.g = g

 def getSalt(self):
   ans = (self.p/100) * self.g
   return ans

 def getWater(self):
   ans = self.g - self.getSalt()
   return ans

 def __add__(self, other):
   s = self.getSalt() + other.getSalt()
   g = self.g + other.g
   p = (s / g) * 100
   return Saline(p, g)

#テスト
a = Saline(3, 100)
a.getWater()


課題その2

 水溶液 a を分割する演算 a / 3 の / を定義しなさい。Saline クラス内で,__truediv__ を定義します。(教科書 p.126)
以下のテストで,(3, 50) が表示されたら,正解です。濃度が 3 のままで,重量が,100/2 の答えが表示されます。
実装例


class Saline:


 def __init__(self, p, g):
   self.p = p
   self.g = g

 def getSalt(self):
   ans = (self.p/100) * self.g
   return ans

 def getWater(self):
   ans = self.g - self.getSalt()
   return ans

 def __add__(self, other):
   s = self.getSalt() + other.getSalt()
   g = self.g + other.g
   p = (s / g) * 100
   return Saline(p, g)

 def __truediv__(self, other):
   g = self.g / other
   return Saline(self.p, g)

#テスト
a = Saline(3, 100)
b = a /2
b.p, b.g


触れなかった重要項目

  • GUI
  • 例外
  • 内包表記
  • 計算量
  • 継承
  • ポリモフィズム

課題報告は

第14回は,課題はありません。よかったら全15回をやってみた感想など送ってもらえるとうれしいです。


  • これを読んだ感想,あれば質問

(報告は必須ではありません)


質問と返答

講義への質問は,suehiro3721p@gmail.com まで


講義メモ(先生のための覚え書き)

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

トップページ

https://wiki3.jp/MathPython 内で書かれていることは,ご自由にご利用ください。管理者により改変されることもあります。工学部学生のための Python 入門(大学のプログラム入...

Python の動かし方

Jupyter Notebook を使うほぼ互換の Google Colaboratory を使うGoogle ドライブの中で,「新規」の「その他」の中で,Google Colaboratoryを選ぶ...

第14回目 課題実装例

このページの変更記録09/19 執筆中第14回目の課題はありません。今後の Python 利用 Pyrhon プログラムの料理でいうと自炊レベルとは,必要に応じて,自分専用の関数を作れることといってい...

第11回目 辞書型

このページの変更記録08/24 公開09/27 課題報告メモを削除09/27 サンプル一部変更教科書『Python Pocket Reference』⇒ 教科書 p.数字,と書いてあれば,そこをみて,...

第15回目 単位課題

このページの更新記録1019 質問への返答追加08/12 00:15 準備運動のようにキーボード練習をする,を追加08/13 13:16 質問への返答追加。締め切りについて。09/19 16:49 課...

第10回目 インストール

このページの変更記録08/16 17:12 公開08/31 15:07 分子コードの例を追加,文章の言い回し一部訂正インストールAnaconda(アナコンダ)をインストールする 2020年夏現在,Py...

第5回目 For ループ

このページの変更記録08/01 09:09 公開 08/01 09:15 訂正 08/01 12:19 サンプルプログラムに行が余分に空いて表示されると書く08/01 12:54 用語に,「ブロック」...

py3Dmol で画像が出ない。

ブラウザのキャシュエラーキャシュをクリアをする。Ctrl キー押しながら,更新ボタンをおすまたは,キャシュクリアーするツールを起動するChromebook だとhttp://atomurl.net/c...

第8回目 CSVファイル

このページの変更記録08/07 17:52 公開08/07 18:08 誤字訂正,言い回し変更08/08 00:32 サンプルプログラムに「#確認用表示」のコメントを追加08/08 00:36 課題文...

モジュール

ソースプログラムの保管単位 Python 言語の仕様上最初から入っているもの標準モジュールインストール時にいっしょに入るもの外部モジュール組込みモジュール,標準モジュール でないモジュール。組込みモジ...