ファイルにプログラムを作る

(菊地先生のオンラインテキスト2006年版に準拠)
2017.12.6 python3に改定

ファイルにプログラムを作る

  • Python でいろいろな計算ができることがわかったが、計算の手順は Python を ^D で終了してしまうと消えてしまう。計算の手順を再利用するには、その手順をファイルに書いておくことが必要である。
  • また、math モジュールを import すると、π や √ などの数学関数を利用することができたが、このようなモジュールを自分で作ることができるだろうか?
  • 実は,モジュールは手順を記録したファイルなので,自分で手順をファイ ルに書いておくと、オリジナルのモジュールとして利用できる。
  • ここでは,プログラム(モジュール)ファイルの基本的なところを学ぶ。
  • また、文字列も出てくるが、文字列演算などの複雑なことはまだ扱わない。

作業ディレクトリを作る

  • これからは、lessonごとに作業ディレクトリを作成し、その中で作業する。
  • まず、作業ディレクトリを作成しよう。

  • $ cd
    $ mkdir python
    $ cd python
    $ mkdir 02
    $ cd 02

単純な例と3つの実行法

1. モジュールとしての実行

  • 次のようなプログラムを、 hello.py というファイルに作成する。
  • (テキストエディタ, vi , catのいずれを使ってもよいが、必ずpython/02の中に保存すること。)

  • (以下、ターミナルでの入力は黄色いコラム、ファイルへの入力は青いコラムで表示します
  • # -*- coding: utf-8 -*-
    who = input('お名前をどうぞ: ')
    print(who, 'さん、こんにちは!')
  • Python プログラムの注意

    • 必ず行のはじめの桁から1文字目を入れてください。
    • Python では、行のそろえ方で「プログラムの構造」を判断しています。(非常に重要!!)
    • 今日の例の場合、行の始めに空白があるとエラーになります。
    • # -*- で始まる coding 行は日本語を含むときは必ず入れておいてください。
  • 文字列について
    • 文字列は ' 'で表す
    • print(' 文字列 '), print(変数名1, 変数名2)  ( )の中身を画面に出力する (python3での変更点)
    •  input( 'メッセージ')  メッセージ(入力促進文を表示して入力された内容を"文字列"として変数に代入する (python3での変更点)
  • 試してみよう
  • Python (python3と入力) を起動して、arith (.py を除く) をモジュール名として指定して import すると、ファイルに書かれた手順を実行することができる。
  • $ python3
    Python 3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09)
    >>> import hello
    お名前をどうぞ: 田中
    田中 さん、こんにちは!
  • 数値の入力と計算

  • 次のプログラムを arith.py というファイルに作成する。
  • # -*- coding: utf-8 -*-
    print('四則計算')
    sa = input('a の値を入れてください ')
    sb = input('b の値を入れてください ')
    a=float(sa)
    b=float(sb)
    print('a + b =', a + b)
    print('a - b =', a - b)
    print('a * b =', a * b)
    print('a / b =', a / b)
  • a = float(文字列変数(数字))  実数への型変換
    • 文字を実数に変換して、aに代入する。
    • これなしに演算をしようとすると エラーになる  (sa + sbのみ文字列の連結として機能するが他はエラー)
      >>> a = 'test'
      >>> b = ' good'
      >>> a + b
      'test good'
      >>> a - b
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: unsupported operand type(s) for -: 'str' and 'str'
  • import arith
    四則計算
    a の値を入れてください 6
    b の値を入れてください 3
    a + b = 9.0
    a - b = 3.0
    a * b = 18.0
    a / b = 2.0
    >>>

2. python コマンドの引数に指定して実行

  • コマンドラインから実行するには、python コマンドの引数としてファイル名を指定ればよい。

  • $ python3 arith.py
    四則計算
    a の値を入れてください 6
    b の値を入れてください 3
    a + b = 9.0
    a - b = 3.0
    a * b = 18.0
    a / b = 2.0

    >>>

3. スクリプトにする

  • arith.pyの第1行目に次の記述を入れて、ファイルに実行許可(chmodコマンドを使う)を与えると、コマンドラインから直接実行出来るようになる。
  • #!/usr/bin/env python3

  • $ chmod +x arith.py
    $ ./a.py
    四則演算
    a の値を入れてください 1234
    b の値を入れてください 567
    a + b = 1801
    a - b = 667
    a * b = 699678
    a / b = 2

文字列について(以下はpython2の話...)

  • 「文字列」については、参考書では第5章を参照
  • input() と raw_input() の違い:

    とりあえず、前者は数値を入れるとき、後者は文字列を入れるときに使うと考えてください。

コマンド引数を使う

  • UNIX のコマンドのように、コマンドラインに書いた引数を使うには、次のhelloarg.py のように、sys.argvという関数を参照する。
  • #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # こんばんは
    import sys
    who = sys.argv[1]
    print(who, 'さん、こんばんは!')

実行例

  • $ ./helloarg.py TANAKA
    TANAKA さん、こんばんは!
  • 注:上のプログラム例では 、引数を入力するのにPython ライブラリにあらかじめ用意されている sys モジュールを import してその中の argv というものを利用している。
  • sys.argv のように '.' (ドット)で区切って指定する。 [1] の部分は、次回に学ぶリストの要素指定である。
    • sys.argv[1]は、コマンドの直後に入力された文字列を表します。
    • 3行目の import sysを忘れないように。
  • もう一つの例 下記のファイルをadd.pyとして作成してください。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 足し算 引数1(実数)と引数2(実数)の足し算を返す
import sys
a = float(sys.argv[1])
b = float(sys.argv[2])
print(a, ' +' ,b,' = ',b + a
$ ./add.py 2.4 3.5
2.4 + 3.5 = 5.9

型変換のまとめ(12/8追加)

  • 整数  int()
  • 実数   float()
  • 文字列   str()

参考: 再実行

  • 一度 import したモジュールを修正の後などに再実行する場合には, reload() する必要がある。
  • >>> import importlib
    >>> importlib.reload(arith)

    四則計算
    ...


問題

以下の問題をといて、解答(スクリプトと実行例 、1はスクリプト不要)をhonda@is.kochi-u.ac.jpにメールで送ってください。
スクリプトは,メール本文に記入するとともに、添付ファイルとしてもつけてください(以降も同様の提出形式をとってもらいます)。

作業はpython/02の なかで行うものとし、作成したスクリプトは残しておいてください(評価の対象とします)。
締め切り 12/12(火) 20:00

メールのサブジェクト: p2 kadaiとしてください。

1. int(x) は他の型のオブジェクト(例えば文字列) x を整数に変換する関数です。 また、float(x)はxが文字列や整数であった場合、実数に変換します。イン タラクティブモードで実際に使ってみなさい。
  • 実数 1.4を整数に変換 
  • 文字列4 ("4"で表現)を整数型に変換
  • 文字列4 ("4"で表現)を実数型に変換
2. 前回の課題で行った日本円からドルへの変換をするスクリプト(rate.py)を作成しなさい。その際、下記のような動作(換算後のドルを少数点以下切り捨て)をするように設計してくだ さい(ここで、太字が入力で、数値は例です。)
        $ ./rate.py
        為替レート(円/ドル)は:   91.8
                   変換したい金額(円)は?  10000.0
        変換後の金額は 108 ドルです
       
3. 同じく、日本円からドルへの変換をするスクリプト(rate2.py)を作りなさい。但し、数値はコマンドラインから引数として与えるようにしなさい。

    実行例
                  $
./rate2.py 91.8 10000.0
      変換後の金額は 108 ドルです