2013年4月15日月曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の12章(各種ツール)の12.7(練習問題)13~18を解いてみる。

13.

Noneと値は比較できない。なので、最大値と最小値の初期化には引数のリストの要素を使うように修正。(引数が空のリストの場合には最大値、最小値をNoneにする。)

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def find_min_max(values):
    print(values)
    if not values:
        print("リストは空っぽ")
    else:
        min = max = values[0]
        for value in values[1:]:
            if value < min:
                min = value
            elif value > max:
                max = value

        print("最小値は{0}です。".format(min))
        print("最大値は{0}です。".format(max))

if __name__ == '__main__':
    find_min_max([])
    find_min_max([5])
    find_min_max([5,5])
    find_min_max([1,2])
    find_min_max([2, 1])
    find_min_max([1,2,10, 3,4])
    find_min_max([2,3,1,4,5])
    find_min_max([1,0,2,9,3,8,4,7,5,6])

入出力結果(Terminal)

$ ./sample.py
[]
リストは空っぽ
[5]
最小値は5です。
最大値は5です。
[5, 5]
最小値は5です。
最大値は5です。
[1, 2]
最小値は1です。
最大値は2です。
[2, 1]
最小値は1です。
最大値は2です。
[1, 2, 10, 3, 4]
最小値は1です。
最大値は10です。
[2, 3, 1, 4, 5]
最小値は1です。
最大値は5です。
[1, 0, 2, 9, 3, 8, 4, 7, 5, 6]
最小値は0です。
最大値は9です。
$

14.

0未満の時(負の数)のとき関数が失敗する。

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def summation(limit):
    total = 0
    current = limit
    if limit < 0:
        while current != 0:
            total += current
            current += 1
    else:
        while current != 0:
            total += current
            current -= 1
    return total

if __name__ == '__main__':
    print(summation(-10))
    print(summation(10))
    print(summation(0))

入出力結果(Terminal)

$ ./sample.py
-55
55
0
$

15.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def compute_reciprocals(values):
    reciprocals = []
    for value in values:
        try:
            reciprocals.append(1 / value)
        except Exception as err:
            print(type(err), err, err.args)
            reciprocals.append(None)
    return reciprocals

if __name__ == '__main__':
    for values in [[1,2,3,4,5], [1,0,2,3,4,5,0]]:
        print(compute_reciprocals(values))

入出力結果(Terminal)

$ ./sample.py
[1.0, 0.5, 0.3333333333333333, 0.25, 0.2]
<class 'ZeroDivisionError'> division by zero ('division by zero',)
<class 'ZeroDivisionError'> division by zero ('division by zero',)
[1.0, None, 0.5, 0.3333333333333333, 0.25, 0.2, None]
$

16.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

# stringという文字列を含む行の中で一番下の行番号とその行の内容を要素とする
# リストを返す関数
def find_last(filename, string):
    line_number = 0 # ステッパ(カウンタかも?)
    last = [None, None] # 最良ホルダ
    with open(filename) as f: # f 固定値
        for line in f: # line ステッパ
            line_number += 1
            if string in line:
                last = [line_number, line]
    return last

import math

def standard_deviation(values): # 標準偏差値を求める
    sum = 0.0 # ギャザラ
    for value in values: # value ステッパ
        sum += value
    average = sum / len(values) 
    std_deviation = 0.0 # ギャザラ
    for value in values: # value ステッパ
        std_deviation += (value - average) ** 2
    deviation_average = std_deviation / len(values) # 一時変数
    return math.sqrt(deviation_average)

if __name__ == '__main__':
    filename = "sample.py"
    print(find_last(filename, "def"))
    print(find_last(filename, "return"))
    print(standard_deviation([1,2,3,4,5]))
    print(standard_deviation([0,0,5,5,5]))

入出力結果(Terminal)

$ ./sample.py
[31, '    print(find_last(filename, "def"))\n']
[32, '    print(find_last(filename, "return"))\n']
1.4142135623730951
2.449489742783178
$

17.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def mean(values):
    sum = 0
    for value in values:
        if type(value) != type(10) and type(value) != type(1.0):
            raise ValueError("リストに数値以外の要素が含まれている")
        sum += value
    return sum / len(values)

def median(values):
    sorted_l = sorted(values)
    l = len(sorted_l)
    if l % 2 == 0:
        return (sorted_l[l // 2 - 1] + sorted_l[l // 2 ]) / 2
    else:
        return sorted_l[l // 2 + 1]

def mode(values):
    res = []
    count = {}
    for value in values:
        if value in count:
            count[value] += 1
        else:
            count[value] = 1
    m = max(count.values())
    for k, v in count.items():
        if v == m:
            res.append(k)
    return res
    
if __name__ == '__main__':
    for values in ([1,2,3,4,5], [1,2,3,4,5,1,2,3,4,1,2,3,1,2,1,0]):
        for func in (mean, median, mode):
            print(values, func.__name__, func(values))
    try:
        mean([1,'a'])
    except Exception as err:
        print(type(err), err, err.args)

入出力結果(Terminal)

$ ./sample.py
[1, 2, 3, 4, 5] mean 3.0
[1, 2, 3, 4, 5] median 4
[1, 2, 3, 4, 5] mode [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1, 0] mean 2.1875
[1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1, 0] median 2.0
[1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1, 0] mode [1]
<class 'ValueError'> リストに数値以外の要素が含まれている ('リストに数値以外の要素が含まれている',)
$

18.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

def process_file(filename):
    with open(filename) as f:
        for line in f:
            line = line.strip()
            print(line)

0 コメント:

コメントを投稿