データの型と構造

Python (に限らずたいがいのプログラム言語)では、変数に代入できる数や文字などのデータに「型」がある。

Python のデータ型

  1. 整数(integer)
  2. 長い整数(long integer)
  3. 浮動小数点数(floating point number)
  4. 複素数(complex number)
  5. 文字列(string)
  6. タプル(tuple)
  7. リスト(list)
  8. ディクショナリ(dictionary)
ここでは、それぞれ要点だけを説明する。詳しくは Python の教科書や WWW 上のオンラインドキュメント、オープンソースなコードを探して勉強して欲しい。 過去の授業の資料も参考に。

数には整数, 長い整数, 浮動小数点数, 複素数 がある。整数は桁数が多くなると自動的に長い整数に変換される(らしい ... 他の言語では変換されないほうが多い)。整数同士の割り算は小数点以下を切り捨てるので、切捨てされたくない場合には浮動小数点を使う。複素数の使い方は省略。
例:
% python
Python 2.2.2 (#1, Oct 31 2002, 13:31:46)
[GCC 2.95.3 20010315 (release)] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> 654 / 321
2
>>> 654. / 321
2.0373831775700935
>>>
前回の enzan.py を enzanf.py にコピーして以下のように修正して実行して見よう。 atoi() の代わりに atof() を使うと文字列を浮動小数点数に変換する。また、出力には %d でなく %g を使う。
#!/pub/sol8/bin/python

import string, sys

def enzanf(a,b):
    print '実行'
    print '    a = %g' % a
    print '    b = %g' % b
    print 'a + b = %g' % (a + b)
    print 'a - b = %g' % (a - b)
    print 'a * b = %g' % (a * b)
    if b != 0:
        print 'a / b = %g' % (a / b)

if __name__ == '__main__':
    a = string.atof(sys.argv[1])
    b = string.atof(sys.argv[2])
    enzanf(a, b)

文字列

文字列定数は シングルクォート('), ダブルクォート("), またはトリプルクォート(""") で囲む。クォートは開いたもので閉じるのが原則なので、文字列の中に同じクォートが出る場合には \ (円記号/バックスラッシュ) でエスケープする。トリプルクォートは複数行に渡る文字列定数を定義できる。
例:
>>> a = "Hello, World"
>>> b = "Hello, \"World\""
>>> print b
Hello, "World"
>>> c = 'Hello, "World"'
>>> print c
Hello, "World"
>>> d = """Hello!
... Hi! Howdy.
... """
>>> print d
Hello!
Hi! Howdy.

>>> 

文字列の演算

文字列には + * % の演算が定義されている。
>>> a = "Hello "
>>> b = "World "
>>> a + b
'Hello World '
>>> a * 5 + b
'Hello Hello Hello Hello Hello World '
>>> a = "Hello %s"
>>> a % b
'Hello World '
>>> 

タプルとリスト

タプルとリストはどちらも「順序のある要素の並び」(シーケンス)であるが、タプルは一度作成したら変更できないのに対し、リストは順序の並べ替えや要素の挿入・削除ができる。ここではリストを説明する。
リストには演算 + * の他に、関数 append()で追加したり、del で要素を削除したり、pop() で最後の要素を取り出して削除したりする機能がある。(詳しくはオンラインマニュアルなどを参照)
>>> a = [1, 3, 5, 7, 9]
>>> a[0]
1
>>> a[3]
7
>>> a[1:4]
[3, 5, 7]
>>> a[3] = 8
>>> a
[1, 3, 5, 8, 9]
>>> a.append(11)
>>> a
[1, 3, 5, 8, 9, 11]
>>> del a[2]
>>> a
[1, 3, 8, 9, 11]

ディクショナリ

リストは要素に番号を付けて参照するのに対し、ディクショナリでは文字列を使って参照する。
>>> d = {'spam': 2, 'eggs': 3}
>>> d['spam']
2
>>> d.keys()
['eggs', 'spam']
>>> d.values()
[3, 2]
>>>

練習問題

練習は(もちろん)~/coreinfo/python で行うこと。
  1. 上記の浮動小数点演算のプログラムを作成する。
  2. 適当な値を入れて計算し、その結果を kekkaf ファイルに入れる。
  3. 次のプログラムで「後入れ先出し」(Last-In-First-Out = LIFO) 型バッファである、スタック (stack) のシミュレーションを行う。 (プログラムファイル名 stack.py) プログラムを作成し、適当な引数を付けて実行した結果を stacktest ファイルに入れる。
    #!/pub/sol8/bin/python
    
    import sys
    
    stack = []
    
    def push(data):
        print 'push:  %s' % data
        stack.append(data)
        print 'stack: %s' % stack
    
    def pop():
        data = stack.pop()
        print 'pop:   %s' % data
        print 'stack: %s' % stack
    
    if __name__ == '__main__':
        for i in sys.argv[1:]:
            push(i)
        while len(stack) > 0:
            pop()
    
  4. 次の例題でディクショナリを使った「データベースもどき」プログラム phone.py を作成し、実行してみる。
    #!/pub/sol8/bin/python
    
    import sys
    
    phone = {
             '菊地': '8336',
             '塩田': '8337',
            }
    
    def get_phone(teacher):
        if teacher in phone.keys():
            print '%s 先生の電話は 088-844-%s' % (teacher, phone[teacher])
        else:
            print 'そんな先生知らね!'
    
    if __name__ == '__main__':
        get_phone(sys.argv[1])
    

<a href="http://www.is.kochi-u.ac.jp/~tkikuchi/>菊地のホームページ