Python超簡易イントロダクション その2
 SAA! Pythonを笑う者はPythonに泣くということわざもあるわけですし (ないないない) ここでPythonの基礎を固めるしか。 ウォーミングアップが済んだところで、 今度はリストやたっぷるなどのデータ構造をつついてみましょう。
#! /usr/local/bin/python
#
# ザ・特訓2.py (2000/09/24 - 2000/11/02)
#

# リストは、数値や文字列などを、[]で囲み、, で区切って並べたものです。
# データ型は混在させることができます。
a = [ 11.0, 13.4, 15.5, 13.5, 10.4 ]
b = [ 'a', 30, 'b', 31, 'c', 32 ]

# リストはそのままprint文で指定でき、上の見た目そのままの表現で
# 出力されます。
print a, b

# リストの各要素を個別の変数に代入することもできます。
# ただし、両方の数が合わないといけません。
c = [10, 20, 30]
v1, v2, v3 = c
print v3, v2, v1

# ・リストの各要素は、文字列と同様、[ ] でインデックスを指定して
#   抜き出すことができます。
# ・[:]の前の数字を省略すると、「先頭から全部」の意味になります。
# ・[:]の後ろの数字を省略すると、「後ろ全部」の意味になります。
a1 = a[2]
b1 = b[3:5]
a2 = a[3:]
b2 = b[:2]
print a1, "/", b1, "/", a2, "/", b2

# リストの一部を他の要素で置き換え直すこともできます。
a[2] = 99.9
b[2:4] = [ 'B', 62 ]
print a, b

# ・リストとリストを連結するには "+" を使います。
# ・リストに数値や文字列などリストでないものを "+" でつけることはできません。
# ・リストに要素を追加するには、appendメソッドを使います。
a = a + [ 12 ]
# a = a + 12 (エラー)
a.append(13.0)
print a

# ・リストの要素にリストを指定して、「リストのリスト」や
#   「リストのリストのリスト」や「リストの…」(以下省略)を作ることもできます。
# ・このような入れ子のリストの要素を切り出すには、C言語の多次元配列の
#   要領でやります。
clist = [ [1, 'Jan'], [2, 'Feb'], [3, 'Mar'] ]
print clist[2][1]

# リストの各要素に順にアクセスするには、for inループを使います。
for c in clist:
    print "<" + c[1] + ">",
else:
    print ""

# リストの各要素が変数である場合、それらは実値のコピーとして格納されます。
# 従って、元の変数の値を変えても、リストの中の値は変わりません。
d1 = 14; d2 = 15
D = [ d1, d2 ]
print "(1): ", D
d2 = 99
print "(2): ", D

# 注意!リスト同士は "=" でコピーできますが、それらの要素はポインタ
#       のコピーとして渡されます。従って、コピー元のリストの要素を
#       書き換えると、コピー先にも反映されます(下のDとE)。
#       これを防ぎ、完全な各値の実値のコピーを持たせるには、
#       下のFのように「[:]」を指定します。
d1 = 14; d2 = 15
D = [ d1, d2 ]
E = D
F = D[:]
D[1] = 99
print "(3): ", D
print "(4): ", E
print "(5): ", F

# たっぷるは、数値や文字列などを、()で囲み、, で区切って並べたものです。
# データ型は混在させることができます。
g = ( 11.0, 13.4, 15.5, 13.5, 10.4 )
h = ( 'a', 30, 'b', 31, 'c', 32 )
print g, h

# たっぷるはリストとよく似たデータ構造で、[]によるインデキシングや
# 代入、連結などをリストと同じ方法で行うことができますが、
# 要素に他の値を代入して書き換えることができません。また.appendなどの
# メソッドもありません。
#g[2] = 14 (エラーになる)
#g.append(15.2) (エラーになる)

# 要素が1つだけのたっぷるは、要素と1個の","を()で囲むことで表現します。
h = h + (12,)
print h

# ディクショナリ(辞書)は、他の言語でしばしばハッシュ変数、連想配列などと
# 呼ばれるデータ構造です。「キー」と「値」をコロン ":" で区切ったものを
# "," で区切って並べ、 { } で囲んだもので、キーや値には任意の型のデータ
# が使えます。
k = { 1 : "Jan", 2 : "Feb", 3 : "Mar", 4 : "Apr", 5 : "May", 6 : "Jun",
      7 : "Jul", 8 : "Aug", 9 : "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }
# 個々の値は次のようにして取り出せます。
sep = k[9]
print sep

# del文でキーと値の組を削除できます。
del k[12]

# 下のようにしてキーと値の組をディクショナリに追加できます。
k[12] = "Dec"

# 各キーを順次アクセスするには、keysメソッドでキーのリストを取り出せば
# OKですが、ここで返ってくるリストの順番に規則性はありません。
c = 0
for i in k.keys():
    print "%d月:%s" % (i, k[i]),
    c += 1
    if c == 6: print ""
else:
    print ""

# Pythonではdef文で関数を定義できます。
#
# ・関数の定義はdef文で行い、関数の範囲はインデントして示します。
# ・仮引数は()で囲み "," で区切って指定します。データ型の指定は不要です。
# ・関数が値を返す場合は、return文を使います。returnを使わないと特殊な
#   データ型「None」が返ります。Noneは他の言語でいうNULLやundefだと
#   思うとイメージが近いでしょう。
g_value = 0
def zei(ne, kubun):
    if kubun == 'uchi':
        return ne
    else:
        kubun = 'xxxxxx'
        return int(round(ne * 1.05))

m1 = zei(998, 'uchi')
kubun = 'soto'
m2 = zei(998, kubun)
print kubun
print "Uchizei: ", m1, " Sotozei: ", m2

# return文をもつ関数の値を受け取らなくてもエラーにはなりません。
zei(999, 'uchi')

# ・注意!引数は値渡しが基本ですが、リストは参照渡しになります
#   引数で渡されたリストの各要素を関数内で操作すると、呼出元の要素の
#   値にも反映されます。
# ・関数の中で定義した変数は全てローカル変数になります。関数の外の
#   変数を参照/操作したい場合にはglobal文を使います。
n = [ 998, 1998, 2998 ]
def zeis(nes):
    global g_value
    for i in range(0, len(nes)):
        nes[i] *= 1.05
        g_value += nes[i]
zeis(n)
print n[0],
print g_value,

# 関数の仮引数にデフォルト値をもたせることができます。その引数が
# 省略された場合には、デフォルト値が使われます。
def zei2(ne, rate=1.05):
    return int(round(ne * rate))
print zei2(998),  # <= 1.05が使われます
print zei2(998, 1.07)

# 仮引数の名前を呼出側で指定することで、引数を渡す順番を変えることが
# できます。この場合には、全部の引数について対応する仮引数の名前を
# 指定しないといけません。
print zei2(rate=1.10, ne=998)

# 数が不定の引数をとる関数を作ることもできます。この仮引数の名前の前に
# アスタリスク "*" をつけると、それ以降に対応する引数全部を要素とする
# たっぷるとして仮引数に渡されます。
def kakomu(*arg):
    r = ""
    for a in arg:
        if r == "":
            r = "[" + str(a)
        else:
            r = r + "|" + str(a)
    return r + "]"
print kakomu("1", "2", "3")
# end.

(first uploaded 2000/11/02 last updated 2001/01/25, Ushirodani - Urano398)