#!/usr/bin/env python # coding: utf-8 # # ソースコードの利用 # ここではソースコードの利用を学ぶ. # その前に,組み込み関数の使い方を思い出し,さらに標準ライブラリで用意されている関数を使ってみる. # ## 組み込み関数(前回の復習) # 前回の復習として,組み込み関数maxとsumを使ってみる. # In[1]: list_x = [3, 1, 4, 2] # 組み込み関数に入れるデータとして適当な数値列のリストを用意する. # In[2]: max(list_x) # リストの最大値 # In[3]: sum(list_x) # リストの合計 # ## 標準ライブラリの利用 # Pythonでは,組み込み関数以外にも便利な関数がいろいろ用意されている. # 例えば,平方根や三角関数を計算してくれる数学関数などである. # 組み込み関数ではない関数は,そのままでは使えない. # 予め用意された関数などのかたまり(それらはモジュールとよばれる)を読み込む必要がある. # ここでは一例として数学関数モジュールmathを読み込んで使ってみる. # In[4]: import math # 数学関数のモジュールを読み込む. # モジュールを読み込む命令は # ```.py # import モジュール名 # ``` # である. # これでそのモジュールを使えるようになる. # # モジュールで用意されている関数を使う際には # ```.py # モジュール名.関数名 # ``` # とする. # # どのようなモジュールにどのような関数があるのかはインターネットで検索すればわかる. # In[5]: math.sqrt(2) # 2の平方根 # In[6]: math.pi # 円周率,関数だけでなく定数も用意されている. # In[7]: math.sin(math.pi / 6) # sin(30度) = 1/2 # 数値誤差の関係で,ピッタリ0.5とはなりませんでした. # ## モジュールの自作 # では,いよいよ今回の主題であるPythonのソースコードを書いてみる. # # Pythonのソースコードを書くことは,自分でモジュールを作ることである. # Pythonではモジュールは.pyという拡張子のファイルに書くお約束になっている. # まず, # # 自分の名前と日付.py # # というファイルを作ろう. # なお,ファイル名は必ず英数字で作り,最初の文字は英字でなければならない. # # 例えば私は # # miyamoto20170417.py # # という名前で作ってみる. # # そして,そのファイルに前回定義した関数twiceを書き込んでみよう. # # 参考までに,前回定義した関数twiceは以下の通りである. # In[8]: def twice(x): y = 2 * x return y # これで自作モジュールの完成である. # # .pyの前の部分がモジュール名になる. # # 上記の例ならば,私が作ったモジュール名は # # miyamoto20170417 # # となる. # では,早速自作モジュールの関数twiceを使ってみよう. # 自作モジュールの使い方も簡単である. # # Python interactive shellを起動しているディレクトリ(あるいはフォルダ)に自作モジュールを置き, # # Python interactive shellで # ```.py # import 自作モジュール名 # ``` # とすればよい. # 上記の例ならば # ```.py # import miyamoto20170417 # ``` # とすればよい. # 早速実行してみよう. # In[9]: import miyamoto20170417 # これで自作モジュールを読み込めた. # 自作モジュールの関数の使い方は,先程使った数学関数モジュールと同様である. # In[10]: miyamoto20170417.twice(3) # 以降は, # # - 自作モジュールに関数定義を書き込む, # - Python interactive shellで実行してみる, # # の繰り返しである. # これがPythonによるプログラミングの全てである. # # あとは,自分の役に立ちそうな関数をどんどん定義するだけである. # では,少し練習してみよう. # ## モジュールへの関数の追加とリロード # In[11]: def wa(x, y): return x + y # この関数waは第1引数と第2引数の和を返す関数である. # # このように,複数の引数を与える場合にはカンマで区切る. # # また,returnの後ろに直接命令を書いても良い. # モジュールを書き換えたら,そのモジュールをリロードしないと,interactive shellでは更新されない. # # モジュールをリロードするためにはimpモジュールをimportし,imp.reload関数でリロードする. # ```.py # import imp # imp.reload(モジュール名) # ``` # とする. # In[12]: import imp imp.reload(miyamoto20170417) # このメッセージのfrom以下は実行している環境によって異なる. # # では,どんどんいってみよう. # In[13]: def shou_amari(x, y): print(x // y) 'abc' # こんなふうに文字列がそこに存在しているだけなのは素通りされる. print(x % y) return # 何も返さないreturnを書くのもありである. # この関数shou_amariは商と余りを表示し,何も返さない関数である. # # 以下は基本的な演算をまとめてやってくれる関数だが,どちらかと言うとコメントの例となっている. # In[14]: def basic_calc(x, y): ''' この関数は,和,差,積,商,剰余を返す関数である. 複数の戻り値を返したい場合には,やはりカンマで区切れば良い. ところで,Pythonのモジュールで複数行のコメントを書きたい場合には, このようにシングルクォーテーション3つで囲むのが流儀である. これは文法的には,前出のshou_amari関数で見た通り「そこに文字列が存在してるだけ」 という扱いである. この例のように,例えば関数内に書く場合にはきちんとインデントを合わせる必要がある. ''' return x + y, x - y, x * y, x / y, x % y # Body Mass Indexを計算してくれる関数もいくつか定義してみる. # In[15]: def body_mass_index(height, weight): ''' 身長(メートル単位)と体重(キログラム単位)を引数として, BMIを計算し「肥満」か「肥満でない」かを返す関数である. ''' bmi = weight / (height ** 2) if bmi >= 25: return 'fat' else: return 'not fat' # In[16]: def body_mass_index2(height=1.7, weight=70): ''' この関数のように,引数には「デフォルト値」を設定できる. 関数実行時に引数が与えられなければ,このデフォルト値が適用される. ''' bmi = weight / (height ** 2) if bmi >= 25: return 'fat' else: return 'not fat' # In[17]: def body_mass_index3(height=1.7, weight=70): ''' この関数はBMIの計算結果に従って,'fat','normal','thin'のいずれかを返す. ''' bmi = weight / (height ** 2) if bmi >= 25: return 'fat' elif bmi >= 18.5: return 'normal' else: return 'thin' # この例から推測されるように,ifキーワードを用いた条件分岐の構文は,より一般には # ```.py # if 条件1: # 命令1-1 # 命令1-2 # …… # elif 条件2: # 命令2-1 # 命令2-2 # …… # elif 条件3: # 命令3-1 # 命令3-2 # …… # else: # 命令n-1 # 命令n-2 # …… # ``` # である. # 条件1が満たされると,命令1-1,命令1-2,……が,そうではなくて条件2が満たされると,命令2-1,命令2-2が,そうではなくて条件3が満たされると…… # いずれも成り立たなければ命令n-1,命令n-2,……が実行される. # # elifはいくつあってもよい. # elseは省略可能である. # ## 標準モジュールを利用して自前の高度な関数を作成 # もう少しだけ高度な関数として,じゃんけんをしてくれる関数を作ってみる. # グー,チョキ,パーのいずれかをランダムに出してほしいので,標準モジュールの1つである乱数生成モジュールrandomを利用する. # # まず,乱数生成モジュールramdomをimportする. # In[18]: import random # randomモジュールは乱数生成モジュール # 以下に,guu,choki,paaのいずれかをランダムに選び表示する関数を定義する. # # そして実行してみる. # In[19]: def janken(): data = ['guu', 'choki', 'paa'] data_choice = random.choice(data) # random.choiceは引数からランダムに1つ選んでくれる関数 print(data_choice) # In[20]: janken() # この関数は,どれを表示するか,実行するまでわからない. # # 関数jankenとあまり変わらないが,何回もじゃんけんをしてくれる関数を以下に定義する. # どのような表示がされるか試してみましょう. # In[21]: def janken2(): ''' 'guu'が出るまでじゃんけんしてくれる関数. ''' data = ['guu', 'choki', 'paa'] data_choice = data[-1] # とりあえず最初は'paa'を入れておく. while data_choice != 'guu': # 選ばれたのが'guu'でない限り繰り返す. data_choice = random.choice(data) print(data_choice) # モジュールには,名前がかぶらない限り,いくらでも関数を定義できる. # ただし,何もかもを1つのモジュール(すなわち1つのファイル)に書き込むと,ごちゃごちゃしてわかりにくくなる. # 役割とか,自分の中で整理できるようにファイルを分けることが推奨される. # ここまでで,簡単な関数の作成練習は一旦終わりとする.