プログラムの構造

処理の流れ

特に何も断らなければ、プログラムの処理は書かれた順に行われる。しかし、次のように分岐や繰り返しを行ったり、ひとまとまりの処理を関数として別のブロックに書いたりする。

if による分岐

条件に合ったとき、次のブロックの処理を行う。ブロックは「字下げ」(indent) を行うことで、その範囲を示す。
if 条件1:
    処理1
elif 条件2:
    処理2
else:
    処理3
プログラム例:
#!/pub/sol8/bin/python
# hotsweet.py (甘辛診断)

import sys

sweets = ['どら焼き', '大福', 'チョコレート']
hots   = ['カレー', 'キムチ', 'とうがらし']

def hotsweet(s):
    if s in sweets:
        print '%s は、甘い' % s
    elif s in hots:
        print '%s は、辛い' % s
    else:
        print '%s は、わからない' % s

if __name__ == '__main__':
    hotsweet(sys.argv[1])

while によるループ

while 条件:
    処理
下の例では、コマンドラインの引数で与えた整数 n について、1 から n までの整数の和を求めている。
#!/pub/sol8/bin/python
# sum1.py 'while' を使った積算

import sys, string

def sum(n):
    s = 0
    i = 1
    while i <= n:
        s = s + i
        i = i + 1
    return s

if __name__ == '__main__':
    n = string.atoi(sys.argv[1])
    print sum(n) 

for によるループ

for 変数 in リスト:
    処理
上の例と同じであるが、for ループを使う。ここで range() は引数の範囲の整数をリストに返す関数である。
#!/pub/sol8/bin/python
# sum2.py 'for' を使った積算

import sys, string

def sum(n):
    s = 0
    for i in range(1,n+1):
        s = s + i
    return s

if __name__ == '__main__':
    n = string.atoi(sys.argv[1])
    print sum(n)

def による関数の定義

def 関数名(引数リスト):
    処理
    return 戻り値
既に、関数については何度も使っている。ここでは、関数に戻り値を与えた例を示すが、同時に、現在定義中の関数の中にその関数を使うという、「再帰的」な手法を紹介する。
#!/pub/sol8/bin/python
# fact.py factorial 階乗の計算

import sys, string

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

if __name__ == '__main__':
    n = string.atoi(sys.argv[1])
    if n >= 0:
        print fact(n)
    else:
        print 'error: negative' 

練習問題

以下の練習は、もちろん ~/coreinfo/python でおこなう。
  1. hotsweet.py を作成し、実行する。
  2. sum1.py を作成し、実行する。
  3. sum2.py を作成し、実行する。
  4. fact.py を作成し、実行する。
  5. fact.py をエラーなしで実行できた最大の結果を maxfactNN (但し、NN は 引数の最大値) という名前のファイルに入れる。(例:NN=100 でエラーにならず、NN=101 でエラーになった場合、maxfact100 という名前のファイルに入れる)

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