Pythonを学ぶ その3
関数とモジュール
関数でしか実現できないこと
プログラムの外と内をつなぐためには関数が必須
関数の宣言と使いかた
入力と出力 入力がないなら関数の宣言の引数をなくし、出力が不要な場合はreturnをなくせば良い
def my_func1(): return 0 def my_func2(x): x=x*-1
引数は複数指定できるが、returnは一度しか実行されない(returnされた後の処理は一切無視される
global宣言
関数内の処理の実装は、関数の定義の中で完結すべきです。その関数を実行することで、その関数の外の変数などの値を変更すべきではありません。
だが、それも時と場合による
x = 5 def add(): x += 1 print(x) add() print(x)
これは、関数の中で変数x
に値が与えられる前に参照したとされ、エラーがでる。
従ってglobal変数を導入して、関数の外で定義された関数を使う
x = 5 def add(): global x x += 1
とはいえ、
関数などを動かすことで「期待される範囲を超えた外の世界に影響が及ぶ」ことを「副作用」と言います。この副作用を減らすことが綺麗なコードを書くコツ
とのこと。あるいは、副作用のないコードが綺麗なコードと言われるのかもしれない。
モジュール
プログラムを特定の処理ごとにファイルを分ける 分けられた各ファイルをモジュールという
モジュールの利用
モジュールを利用するにはimport モジュール名
モジュール内の関数を呼び出すにはモジュール名.関数()
import math floor = math.floor floor(5.5)
という使い方もできるらしい。(関数を定義することとは違う?)
モジュール名なしで呼び出す
#from モジュール名 import 関数名 >>>from math import floor >>>floor(5.5) 5.0
モジュールの作成
.pyのファイルにコードを書けば良い
モジュールを書くにあたって注意すべきこと - 再利用可能か - 似た処理のみをまとめているか
モジュールとして使われる時には実行しない処理を書くこともできる その時は、
if(__name__ == '__main__'): 処理
と書けば良い。
演習1
絶対値を返す関数my_abs()
を作る
def my_abs(x): if(x < 0): x = x * -1 return x
演習2
引数で与えた数だけフィナボッチ数を配列で返す関数my_fiboを作る
def my_fibo(x): i = 1 y = [] while(i != x): if(i == 1): y.append(1) i += 1 elif(i == 2): y.append(0 + y[0]) i += 1 else: y.append(y[i-3]+y[i-2]) i += 1 return y print(my_fibo(x))
演習3
演習1、2の関数をモジュール化して別ファイルから使う できた
ユーザーからプログラムへの入力をする方法
コマンドライン引数
プログラムの起動時に指定する引数
使いかた
$ python file.py コマンドライン引数
とすることで、プログラムに引数を渡せる
sysモジュールをインポートすると
sys.argv
に['file.py',コマンドライン引数]
とリストとして格納される
引数のn番目はリストのn-1番目に格納される(複数の引数を指定できる
import sys # 誤った入寮地の場合はメッセージとともにプログラム中断(無言でプログラムを終わらせないようにしたほうが良い if(len(sys.argv)<2): #最初にチェックしてしまおう print('usage: student.py student_name') exit() student = sys.argv[1] score_sheet = get_score_sheet(student) print(score_sheet)
標準入力
プログラムの起動後に入力値を与える
raw_input()
関数は、実行されるとユーザーの入力を待つ
ユーザーがテキストを入力してenterを打つと、raw_input()
関数は入力されたテキストを返す
sysモジュールのreadline()関数も同じように使えるけど、Enterも取得されます。
インタラクティブなプログラムの書き方
そもそも、「インタラクティブなプログラム」とは 1. ユーザーからの入力をアプリケーションが待つ 2. それに応じてアプリケーションが何らかの処理をする 3. 1に戻る
結局while(True)
でループさせてやれば良い
exec
exec
は文字列として与えられたpythonのプログラムを実行する
演習1
コマンドライン引数で与えた二つの整数を足したものを表示するプログラムを作ってください。引数が二つ以外の場合はエラー表示して処理を中断させてください
import sys if(len(sys.argv) < 3): print('usage: student.py student_name student_number') exit() print(sys.argv) print(int(sys.argv[1])+int(sys.argv[2]))
< 3
はまずかったな
演習2
標準入力で受け取った文字列をecho: 文字列
として表示するプログラムを作る。exitと入力されたら終わる
while(True): print("give me text") text = raw_input() if(text == 'exit'): break print("echo: " + text)
give me text oisiiii echo: oisiiii give me text aaaaaa echo: aaaaaa give me text exit
演習3
標準入力で受け取ったPythonのプログラムを実行するプログラム。
while(True): print('give me python') python = raw_input() if(python == 'exit'): break exec(python)
give me python 9+9 give me python a = 3 + 3 give me python print(a) 6 give me python exit
今日はここまで