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

今日はここまで